"To achieve great things, two things are needed: a plan and not quite enough time." - attributed to Leonard Bernstein
website · docs · install · first run · glossary · limitations · name policy · sponsor
简体中文 · 繁體中文 · 日本語 · 한국어 · हिन्दी · বাংলা · Русский · Español · Português · Deutsch · Français · Italiano · Nederlands · Polski · Svenska · Suomi · Українська · Türkçe · العربية · עברית · Bahasa Indonesia · Tiếng Việt · ไทย
Status: beta. Underhålls av en person, under aktiv utveckling. Versionsnumret räknar utgåvor, inte mognadsgrad — delversioner kan ändra gränssnitt. Lås versionen för kritiska beroenden; regressioner åtgärdas snabbt, rapportera dem.
Bernstein är governance-lagret med öppen källkod för AI-agenter. Det körs på policy as code: du skriver policyn - vem som får göra vad, vad som kräver godkännande, vad som måste loggas - och Bernstein tillämpar den och tar fram det verifierbara beviset. En deterministisk schemaläggare - ingen modell i koordinationsloopen - kör agenter parallellt, grindar det de producerar och loggar varje steg, så att en körning kan verifieras i efterhand, offline, enbart från artefakterna. CLI-kodagenter fungerar direkt (Claude Code, Codex, Gemini CLI och 40+ till), och samma lager governar vilken agentlast som helst: leveransen kan vara en diff, en forskningsrapport, ett dataset eller ett paket med revisionsbevis. Air-gap-installationsprofil ingår. Apache-2.0.
Fyra saker skiljer den från mängden; resten är detaljer.
- Ingen LLM i koordineringsloopen. Schemaläggningen sker i ren Python, vilket gör en körning reproducerbar från början till slut. Återuppspela gårdagens plan och få exakt samma uppgiftsgraf.
- Verifierbar i efterhand. Replay-journalen registrerar varje körning, och den ständigt aktiva lineage-ryggraden loggar varje spårbarhetspunkt; den valfria HMAC-kedjade granskningsloggen (
BERNSTEIN_AUDIT=1) lägger till kvitton (receipts) som du kan verifiera offline. Icke-determinism visar sig som en hash-avvikelse vid det exakta steget, inte som ett instabilt testfel vid omkörning. Leverabler som inte är kod behandlas på samma sätt: en uppgift kan deklarera ett artefaktkontrakt (rapport, dataset, åtgärdslogg, ops-resultat) och slutförs med ett signerat lineage-kvitto istället för en git-commit. - Isolerad genom konstruktion. Varje kodningsuppgift får ett eget git worktree bakom merge gates; uppgifter i artefaktläge får en arbetskatalog under
.sdd/workspaces/. Agenter delar som standard ingen föränderlig arbetsyta; det enda delade tillståndet är uppgiftskön, som reserveras atomärt. Striktare filsystemsbegränsningar är valfria via sandbox-backends. Inaktivera worktrees så körs varje uppgift i den delade arbetskatalogen. - Bred och lokal. Över 40 CLI-agentadaptrar plus en generisk
--prompt-wrapper, filbaserat tillstånd, inga SaaS-mellanled, inget externt dataplan.
Hela listan finns på funktionssidan; funktionsmatrisen är det fullständiga indexet.
En enda YAML-fil deklarerar körningen: faser, roller, beroenden och villkoren under vilka en nod alls körs. Schemaläggaren exekverar den som ren Python - inget i filen är en prompt, och ingen modell bestämmer vad som händer härnäst. Den här grafen bygger ett paket med revisionsbevis; hela filen finns i .bernstein/workflows/audit-evidence-pack.yaml.
name: audit-evidence-pack
version: "1.0.0"
phases:
- name: scope
allowed_roles: [manager, architect]
- name: collect
- name: validate
allowed_roles: [qa, security]
- name: deliver
allowed_roles: [security, manager]
nodes:
define-control-inventory:
phase: scope
role: architect
collect-audit-logs:
phase: collect
role: security
depends_on: [define-control-inventory]
# three more evidence streams collect in parallel:
# collect-sboms-and-attestations, collect-runbooks-and-policies,
# collect-eval-results
assemble-pack:
phase: validate
role: docs
depends_on:
- collect-audit-logs
- collect-sboms-and-attestations
- collect-runbooks-and-policies
- collect-eval-results
mock-auditor-pass:
phase: validate
role: qa
depends_on: [assemble-pack]
remediate-findings:
phase: collect
role: docs
depends_on:
- source: mock-auditor-pass
condition: "status == 'failed'"
retry:
max_attempts: 3
until: "status == 'done'"
sign-and-deliver:
phase: deliver
role: security
depends_on:
- source: mock-auditor-pass
condition: "status == 'done'"flowchart LR
inv[define-control-inventory] --> logs[collect-audit-logs]
inv --> sbom[collect-sboms-and-attestations]
inv --> rb[collect-runbooks-and-policies]
inv --> ev[collect-eval-results]
logs --> pack[assemble-pack]
sbom --> pack
rb --> pack
ev --> pack
pack --> gate{mock-auditor-pass}
gate -->|failed| fix["remediate-findings (retry x3)"]
gate -->|done| sign[sign-and-deliver]
Varje nod tas av en agent vars roll fasen tillåter; rollstängsel och godkännandegrindar håller oavsett vad agenten gör i uppgiften. En kodnod avslutas bakom merge gates i sitt eget git worktree. Noderna ovan avslutas annorlunda: ett artefaktkontrakt namnger leveransen (rapport, dataset, skanning, åtgärdslogg) och noden stängs med ett signerat lineage-kvitto i stället för en commit. Samma schemaläggare, samma journal, samma offlineverifiering - oavsett om grafen levererar kod, forskning, en ops-ändring eller en blandning av alla tre. Färdiga grafer för mjukvara, forskning, dokumentation, enterprise och bidragsflöden finns i .bernstein/scenarios/.
uv tool install bernstein # or: pipx install bernstein
bernstein init
bernstein doctor # checks a CLI agent is installed and authenticated
bernstein -g "fix the failing test in tests/test_foo.py"pipx, pip, brew, dnf, npm och Docker beskrivs i installationsguiden; det isolerade paketet har en egen air-gap-guide.
Inspelningen ovan visar en verklig körning och innehåller sitt eget bevis. Sessionen, det signerade körkvittot genererat från journalen och den offentliga nyckeln finns i docs/assets/demo-run/. Verifiera körningen offline:
bernstein verify receipt docs/assets/demo-run/run-receipt.json \
--public-key docs/assets/demo-run/run-receipt.pub.pemCI återverifierar det sparade kvittot vid varje push till main — och visar att en manipulerad kopia underkänns — så att det publicerade beviset inte förvandlas till en dekorativ fil. scripts/record_demo.sh återskapar inspelning, kvitto och nyckel från en ny verklig körning; ingenting i terminalen är syntetiserat.
En pågående körning kan följas från båda operatörsgränssnitten. Båda läser samma uppgifts-API, vilket gör att ingen av dem är en fördröjd spegling. I bernstein live rullar vänster och höger kolumn oberoende som hela paneler, så att kontroller förblir åtkomliga på mindre terminaler.
![]() |
![]() |
|---|---|
bernstein live — terminalpanelen |
bernstein gui serve — webbläsarpanelet |
Determinism är här något du verifierar, inte något du accepterar på god tro. Kör en gång med granskning aktiverad och kontrollera sedan vad som loggades:
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 onlyJournalen skrivs vid varje körning; lineage-ryggraden är alltid aktiv och lägger till en post för varje spårbart steg, så att en kort körning kan avslutas med en giltig, tom ryggrad. bernstein audit verify har bara en kedja att kontrollera när körningen startades med BERNSTEIN_AUDIT=1, en regelefterlevnadsprofil eller bernstein run --audit. Flaggan --audit tillhör bernstein run; i bernstein -g-formen ovan anger du miljövariabeln.
Ett körkvitto binder samman journalens topp, lineage-ryggradens topp (om poster sparats) och valfritt ett granskningskedjeintervall under ett enda Ed25519-signerat objekt med inbäddad offentlig nyckel. En granskare med den filen och operatörens offentliga nyckel kan bekräfta att åtgärder och kedjor är oförvanskade: ingen HMAC-nyckel krävs, ingen aktiv .sdd/, och slutkod 2 med angivelse av det första avvikande steget vid manipulation. Kvittot identifierar det inbäddade journaltillståndet; att bevisa att tillståndet utgör hela den färdiga journalen kräver dessutom ett oberoende kontrollsigill. Utan --public-key kontrolleras endast intern integritet. Detaljer i deterministisk återuppspelning.
Samma verifierbarhet gäller för utvärderingsresultat. bernstein bench run <suite> --reliability k (även bernstein eval --reliability k) kör varje uppgift k gånger under fast koordinering och rapporterar ett pass^k-golv (alla k försök måste lyckas) tillsammans med pass@1-taket. Resultatet förseglas i ett signerat kvitto som bernstein bench reliability-verify räknar om offline, så att ett manipulerat golv underkänns. Detaljer: pass^k tillförlitlighetsgolv.
Varje mål rör sig genom fyra steg:
- Dela upp (Decompose). Managern bryter ned målet i uppgifter med roller, tilldelade filer och slutförandesignaler. Ett LLM-anrop, därefter ren Python.
- Starta (Spawn). Agenter startar i isolerade git worktrees, en per kodningsuppgift; uppgifter i artefaktläge får en vanlig arbetskatalog. Huvudgrenen förblir ren.
- Verifiera (Verify). Janitorn kontrollerar konkreta signaler: tester passerar, filer finns, lint är godkänd, typer stämmer.
- Slå ihop (Merge). Verifierat arbete slås samman till main. Misslyckade uppgifter prövas igen eller styrs om till en annan modell.
Varför schemaläggaren är i ren Python och vilka avvägningar det innebär: varför deterministisk.
cd your-project
bernstein init # creates .sdd/ workspace, bernstein.yaml + templates/
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 drainHela operatörsytan (PR-automatisering, scheman, chattbryggor, autofix-demonen) finns i operatörskommandon.
bernstein workflow kör deklarativa YAML-DAG:ar av agent-, kommando- och loop-noder - med stöd för att återuppta avbrutna körningar:
bernstein workflow run idea-to-pr -g "Add JWT auth" # prints run_id
bernstein workflow resume <run_id> # picks up at the first non-completed nodeKörningens tillstånd sparas som en checkpoint under .sdd/runs/<run_id>/ vid varje nod. Återupptagning validerar manifest-digesten vid körningens start, så en ändring av specifikationen avvisas i stället för att tyst köra ett annat manifest. Se workflow-manifest.
Grindar för kodhygien: bernstein readme-l10n verify underkänner en PR vars översatta README-filer avviker från den engelska källan (med angivande av inaktuellt avsnitt), bernstein readme-l10n sync uppdaterar kopplingarna efter engelska ändringar. Se readme-l10n.
Claude Code, Codex CLI, Gemini CLI, GitHub Copilot CLI, Cursor, Aider, Goose, Muse Code, 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 och fler. Adapterindexet innehåller installationskommandon för 30 av dem. bernstein integrations list listar alla 54 anslutna integrationer från src/bernstein/adapters/registry.py, källan till sanning. 52 av dem är valbara agentadaptrar; de övriga två raderna är teststubben mock och slutpunktsprofilen self-hosted-endpoints. Allt annat med en --prompt-flagga fungerar via den generiska wrappern.
Kombinera agenter i samma körning: billiga lokala modeller för standardkod, tyngre molnmodeller för arkitektur. bernstein integrations list --installed visar vad som finns tillgängligt på din maskin.
Ett projekt kan märka ärenden som öppna för frivilliga, och vem som helst kan köra ett av dem på sin egen maskin, utan konto och utan samordnare. Vad en uppgift får göra deklarerar projektet i ett volunteer.json-manifest - sandlådebackend, tillåten nätverkslista, tak för väggklockstid och minne - och givarens egna gränser kan bara snäva åt detta, aldrig vidga det. Kvittot som en färdig uppgift ger binder resultatet till det inneslutningsbeslut det kördes under, så att en underhållare månader senare kan kontrollera vad arbetet faktiskt fick röra.
bernstein volunteer verify .
bernstein volunteer browse --budget 60Givarguiden täcker hur du kör en worker och budgeten du sätter, projektguiden täcker att deklarera ett manifest, och hotmodellen anger vad varje gräns skyddar mot och inte. Körning med ett enda kommando är ännu inte släppt: i dag är verify, browse och hub de underkommandon som fungerar.
All fördjupad information finns på dokumentationswebbplatsen:
| sida | vad den täcker |
|---|---|
| capabilities | hela funktionslistan: MCP-serverläge, signerade agentkort, sandbox-backends, artefaktsänkor, regulatoriska mappningar |
| who this is for | var värdet finns och när Bernstein är fel verktyg |
| workflows | deklarativa YAML-DAG:ar av agent- / kommando- / loop-noder |
| web UI | webbläsardashboard baserad på samma API som TUI använder |
| cloud execution | experimentellt: kör agenter på Cloudflare Workers med R2-synkronisering av arbetsytan mot ditt eget konto. Den hostade tjänsten api.bernstein.run är ännu inte tillgänglig |
| datasources | skrivskyddade frågekvitton plus en frågedrivrutin som binder varje resultat till den schemaögonblicksbild det härleddes mot |
| agent catalogs | peka roller mot agentdefinitioner utanför de inbyggda mallarna — en generisk YAML/SKILL.md-katalog eller Claude Code-plugin-struktur |
| security | scorecard, fuzzing, härdning |
| architecture | hur det fungerar under huven |
Bernstein är uppkallat efter Leonard Bernstein, den amerikanske dirigenten och kompositören. Projektet orkestrerar en ensemble av CLI-kodningsagenter på samma sätt som Bernstein ledde New York Philharmonic: varje musiker på rätt insats, partituret deterministiskt, dirigenten ansvarig för slutresultatet.
jag skrev bernstein eftersom jag betalade 400 dollar i månaden i claude-räkningar för att köra tre kodningsagenter parallellt och fick icke-deterministiska sammanslagningar. Apache 2.0, underhålls av en person. Realtidsstatistik: bernstein.run.
Listad i vinta/awesome-python, omskriven i Augment Codes sammanställning över open source-agentorkestrerare och listad i Python Weekly #742. Vi har också dokumenterat tillvägagångssättet som mönstret deterministisk noll-LLM-orkestrering i awesome-agentic-patterns.
Alla omnämnanden: 20+ awesome-listor, kataloger, nyhetsbrev och citeringar
Den fullständiga listan, inklusive varje awesome-list-post, kataloglistning, tidigare referens och omnämnande i nyhetsbrev, finns i docs/mentions.md. Nya poster läggs till efter hand; korrigeringar välkomnas via issue eller PR.
Pull requests välkomnas; CONTRIBUTING.md beskriver installation och kodstil. Säkerhetsrapporter lämnas via SECURITY.md. Om Bernstein sparar dig tid: GitHub Sponsors. Kontakt: forte@bernstein.run.
Citeringsmetadata finns i CITATION.cff. Licens: Apache-2.0; projektnamnet omfattas separat i TRADEMARKS.md.
Alex Chernysh · GitHub · X · bernstein.run


