Skip to content

chernistry/bernstein

v3.4.0 Feature

This release adds 3 notable features for engineering teams evaluating rollout.

✓ 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

Summary

AI summary

Typed activity records, detached runs, tournament selection, cost‑aware dispatch, in‑process gates, spec‑to‑graph pipeline, SPIFFE workload identity, MCP Tasks extension, receipt‑backed updates, and Windows parity coverage all land as signed, replayable receipts.

Changes in this release

Feature Low

Adds typed activity data with explicit modality and HMAC audit chain receipt.

Adds typed activity data with explicit modality and HMAC audit chain receipt.

Source: llm_adapter@2026-07-15

Confidence: high

Feature Low

Introduces detached run service allowing submission, detachment, and reattachment of runs with lifecycle receipts.

Introduces detached run service allowing submission, detachment, and reattachment of runs with lifecycle receipts.

Source: llm_adapter@2026-07-15

Confidence: high

Feature Low

Implements tournament runs with N parallel attempts and signed TournamentReceipt selection audit event.

Implements tournament runs with N parallel attempts and signed TournamentReceipt selection audit event.

Source: llm_adapter@2026-07-15

Confidence: high

Feature Low

Adds cost‑aware scheduling producing deterministic `cost.dispatch_receipt` under USD caps with decision hash.

Adds cost‑aware scheduling producing deterministic `cost.dispatch_receipt` under USD caps with decision hash.

Source: llm_adapter@2026-07-15

Confidence: high

Feature Low

Introduces in‑process verification gate via `bernstein hook-gate` sealing decisions as evidence bundles.

Introduces in‑process verification gate via `bernstein hook-gate` sealing decisions as evidence bundles.

Source: llm_adapter@2026-07-15

Confidence: high

Feature Low

Provides spec‑to‑task‑graph pipeline with `bernstein plan compile` using at most one model call and content‑addressed requirement set receipts.

Provides spec‑to‑task‑graph pipeline with `bernstein plan compile` using at most one model call and content‑addressed requirement set receipts.

Source: llm_adapter@2026-07-15

Confidence: high

Feature Low

Adds SPIFFE‑compatible workload identity mapping Ed25519 install/agent cards to deterministic SPIFFE IDs with optional X.509‑SVID binding receipt.

Adds SPIFFE‑compatible workload identity mapping Ed25519 install/agent cards to deterministic SPIFFE IDs with optional X.509‑SVID binding receipt.

Source: llm_adapter@2026-07-15

Confidence: high

Feature Low

Exposes long‑running runs through MCP Tasks surface as verifiable `mcp.task_handle` receipts.

Exposes long‑running runs through MCP Tasks surface as verifiable `mcp.task_handle` receipts.

Source: llm_adapter@2026-07-15

Confidence: high

Feature Low

Enhances run review board with diff viewer, evidence panel, and attested `review_board.action` receipts for approvals/rejections.

Enhances run review board with diff viewer, evidence panel, and attested `review_board.action` receipts for approvals/rejections.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Fixes MCP registry OCI packaging path to publish correct OCI artifact, resolving the registry publish flow issue.

Fixes MCP registry OCI packaging path to publish correct OCI artifact, resolving the registry publish flow issue.

Source: llm_adapter@2026-07-15

Confidence: high

Full changelog

v3.4.0

Released 2026-07-12.

A feature release built around one idea: the artefact an operator sees is
itself the verifiable receipt. Typed activity records, detached runs,
tournament selection, cost-aware dispatch, in-process gates, a spec-to-graph
pipeline, workload identity, an MCP Tasks surface, a receipt-backed update
path, and the run review board all land as signed, replayable records rather
than logs beside the work. Windows parity coverage and the MCP registry OCI
packaging fix round out the release.

A few extra-large items shipped a complete first phase with documented
follow-ups; each section below says what landed and what is deferred.

Typed activity data and ops modalities (#2311)

The typed activity boundary gains explicit data and ops modalities, so an
activity is recorded with its shape rather than as opaque text.

  • Each activity result is projected into the HMAC audit chain as an
    activity.result receipt carrying the modality, the content hash, and the
    prior chain digest.
  • A verifier can join a chain entry to the recorded activity and confirm the
    modality and payload hash without replaying the run.
  • bernstein activity renders and checks the recorded modalities.

Detached run service (#2352)

A run is no longer tied to the process that started it. Operators submit a
goal, disconnect, and reattach later.

  • bernstein run-service submits a goal, detaches to a supervisor, and
    reattaches to an existing run.
  • A restart resumes from the durable run descriptor and ledger rather than
    starting over; the active chain is never rotated mid-run.
  • Submit, detach, reattach, and completion are each run.lifecycle receipts
    in the audit chain, so the full life of a detached run is reconstructable.
  • Run directories are realpath-contained under the service root, so a run id
    can never redirect state outside the runtime tree.

Follow-ups: broader supervisor back-pressure controls are tracked separately.

Tournament runs (#2353)

A hard task can fan out into parallel attempts and keep only the winner, with
the decision fully explained.

  • A task declares attempts: N with scripted evaluators (test pass rate,
    lint status, coverage delta, mutation score, or an arbitrary command).
  • The scheduler runs N sibling attempts in isolated worktrees with identical
    inputs; the winner is a pure function of the evaluator outputs with a
    stable attempt-hash tie-break, with no model call in the decision path.
  • The result is a signed, spine-anchored TournamentReceipt naming every
    attempt hash, every evaluator output, the winner, and the lineage edges;
    the selection is mirrored as a tournament.selection audit event.
  • bernstein tournament show and bernstein tournament verify render and
    recompute a selection offline, so a tampered score or a hand-picked winner
    diverges from the replay and fails.
  • Fan-out is gated on the task's existing per-ticket budget ceiling and
    aborts before spawning when projected spend would breach the cap.

Cost-aware scheduling (#2354)

Dispatch decisions now respect USD budgets and route work to the cheapest
surface that can honour it.

  • Each cost-aware dispatch is a cost.dispatch_receipt: a deterministic
    admit or halt under USD caps, pinned by a decision hash over the price
    table, spend ledger, and caps, so two operators replay the same verdict.
  • Non-interactive work routes to a provider batch surface where the adapter
    declares one; a prompt-cache window schedules a warm-up fan-out where the
    adapter documents one. Both capabilities are declared per adapter and
    default to the conservative option, so work is never routed to a surface an
    adapter does not offer.
  • Pool preflight projects per-pool spend before dispatch and refuses work
    that would exhaust a pool.

Follow-ups: additional provider batch endpoints are added as adapters declare
them.

In-process verification gate (#2360)

A gate-capable adapter can enforce the completion and path policy in-session,
the moment a worker believes it is done.

  • bernstein hook-gate reads the worker's hook events, loads the task policy,
    refuses an out-of-scope write, and refuses to end a turn on a failed
    required check.
  • A gate decision is sealed as an evidence bundle, so a verifier cannot tell
    from the schema whether the gate fired in-process or scheduler-side.
  • An adapter with no blocking hook surface injects no gate hooks and degrades
    to the authoritative scheduler-side gate with no policy weakening.

Spec-to-task-graph pipeline (#2361)

Teams that write specs first get a supported path from a requirements
document to a gated task graph.

  • bernstein plan compile holds at most one model call: draft extracts
    acceptance lines into a content-addressed requirement set, approve binds
    the requirement-set hash into the audit chain as a spec.requirement_set
    receipt, and compile turns the approved set into a task graph as a pure,
    model-free transformation.
  • Each task node is content-addressed over the requirement lines it
    implements, so the same approved set always compiles to a byte-identical
    graph and editing one requirement re-plans only the affected node.
  • A verifier can prove offline that a graph was compiled from the exact
    requirement set the operator approved; any post-approval edit breaks the
    chain.

SPIFFE-compatible workload identity (#2363)

Fleets standardizing on SPIFFE workload identity can map a bernstein fleet
onto deterministic SPIFFE IDs.

  • The Ed25519 install identity and each agent card map onto a deterministic
    SPIFFE ID, so two operators derive the same id for the same install and
    agent and a verifier re-derives it later.
  • With a SPIRE agent present (optional bernstein[spiffe] extra), the issued
    X.509-SVID is bound to a card by a spiffe.svid_binding receipt that
    re-derives the id, refuses any SVID whose id disagrees, and appends the
    binding hash to the audit chain.
  • bernstein spiffe id derives the id offline and bernstein spiffe verify-binding re-derives it and proves the card-to-SVID binding against
    its chained receipt. Without the extra, the self-contained Ed25519 path
    stays the default and every existing flow is unchanged.

MCP Tasks extension (#2364)

Long-running runs are exposed through the MCP Tasks surface as verifiable run
handles.

  • A run handle is emitted as an mcp.task_handle receipt, so a caller can
    reconnect to a long-running run and verify the handle against the chain.

Receipt-backed skill and plugin update path (#2369)

Installing and updating bernstein as a skill or plugin now produces
provenance rather than a silent overwrite.

  • An update is a plugin.update_receipt: the manifest hash and spine anchor
    are recorded, and an update whose manifest hash does not match the receipt
    is refused.
  • Aggregate install status reports the verified state across installs.

Run review board: diff viewer, evidence panel, attested actions (#2365)

The run review board gains a diff viewer and an evidence panel, and every
board action is attested.

  • A reviewer sees the run diff and the sealed evidence behind each step in one
    view.
  • Approvals and rejections are review_board.action receipts joined to the
    run journal, so a review can prove which action a principal took under which
    scope.

Windows process and worktree parity coverage (#2367)

Windows process and worktree branches gain mock coverage, and the lane
promotion path is documented, closing gaps ahead of first-class Windows
support.

MCP registry OCI packaging fix (#2424)

The MCP registry packaging path publishes a correct OCI artefact, fixing the
registry publish flow.

Upgrading

pipx upgrade bernstein     # or: uv tool upgrade bernstein

No configuration migration is required. The SPIFFE integration is opt-in via
the bernstein[spiffe] extra; every other capability is available by default
and leaves existing flows unchanged.

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]