v2.16.0¶
Released 2026-07-05.
An output-economy and worker-reliability release: response-style profiles wired end to end, ledger-attributed savings you can recompute, a three-arm cost-and-quality A/B harness, proactive context compaction with signed receipts, schema-enforced worker outcomes, and pinned team manifests. Plus a batch of contributor reliability fixes.
Output economy¶
- Response-style profiles are now resolved deterministically per role or per task and rendered into the worker spawn prompt; the profile hash is folded into task identity and recorded in the cost ledger. (#2251)
- Per-profile cost attribution:
bernstein cost --by profileand a content-addressed, audit-chain-anchoredbernstein cost profile-reportwhose every figure recomputes from ledger entries; mid-run profile changes are excluded rather than guessed. (#2255) - Three-arm profile A/B harness (
bernstein eval ab --suite ... --arms 3): baseline, minimal-control, and candidate arms, cost and quality in one canonical-JSON comparison artifact with every cost figure referenced to a ledger line. (#2264) - Operator-gated role-template compression (
bernstein templates compress|restore): mechanical invariant validators, out-of-tree hash-verified backups, byte-identical restore, and chained receipts; savings are only ever reported from real ledger deltas. (#2272)
Worker reliability and safety¶
- Proactive context compaction: long-running workers compact at a configurable pressure threshold instead of waiting for an overflow failure; each event is validated by zero-LLM invariant checks (code blocks and error text must survive) and recorded as an HMAC-chained receipt.
bernstein compaction log --task <id>. (#2263) - Credential-shaped content is refused before any compaction or summary request reaches a model API; redactions and refusals are audit-logged by span hash, never by content. Reactive-path refusals now fail fast with a typed reason instead of burning retries. (#2250, #2270)
- Schema-enforced worker completion payloads with typed refusal outcomes; an invalid payload is a typed
contract_violationfailure, and blocked workers report a closed set of refusal kinds the orchestrator can route deterministically. (#2252) - Named, sha256-pinned team manifests with drift detection and lineage-recorded digests:
bernstein team list|show|drift. (#2256)
Contributor fixes¶
Thanks to @shanemmattner for a deep reliability batch, all merged with authorship preserved:
- Tasks now transition to failed on
MaxTurnsExceededinstead of hanging inclaimed; the previously dead timeout / auth-error / api-error fast-fail paths are activated. (#2259) - Static budget-aware prompt nudge for turn-limited models, composing with the response-style addendum. (#2260)
- A batch of ten independent bugfixes across the run-id override, seed-path resolution, model-alias matching, auto-commit deny list, merge safety, and secret-log hygiene. (#2261)
- Instrumentation capture for content, tool results, and batched-task fan-out; JSONL parser resilience; a single documented max_turns validation story across the API, adapter, and resolution layers. (#2262)
Internal¶
- Fixed a per-request
/api/v1router mutation that grew route tables quadratically and could crash the test harness with recursion; app factories now build a fresh router each call. (#2266) - Migrated the remaining str-Enum classes to
StrEnum. (#2267) - Refreshed the deferred-adapter review stamps and resolved outstanding scanner findings. (#2258)