Skip to content

v2.15.0

Released 2026-07-05.

Feature release built around five community contributions by Shane Mattner (@shanemmattner), plus scheduler and test-infrastructure fixes.

Features

  • Hold/release API (/orchestrator/holds): heartbeat-renewed leases that keep the spawner alive while an external workflow driver is active, replacing the fixed quiescence settle timer. TTL is a grace window; expired holds release on their own. Operator docs in docs/operations/HOLDS.md. (#2218, thanks @shanemmattner)
  • Explicit max_turns on TaskCreate: per-task turn budgets flow end to end to the adapter spawn, bypassing the complexity heuristic when set; bounded 1..10000 at the schema boundary; retries carry the value forward. Docs in docs/operations/MAX_TURNS.md. (#2217, thanks @shanemmattner)
  • Per-agent run instrumentation: JSONL records for every LLM call, tool call, and conversation message, captured in real time via SDK hooks and anchored to the project root (not the per-task worktree). Docs in docs/operations/INSTRUMENTATION.md. (#2219, thanks @shanemmattner)
  • Council-of-agents redesign: per-member cost attribution, judge synthesis over candidate outputs, enable_thinking=false injected for Qwen models served from Alibaba Cloud endpoints (hostname-suffix detection), and BERNSTEIN_BUILTIN_ALLOW_RUN_COMMAND passthrough in env isolation. (#2220, thanks @shanemmattner)
  • Inline role_model_policy.<role>.council seed blocks now forward into the runner manifest, behaving identically to the councils/*.yaml file convention. (#2231)

Fixes

  • Model selection no longer falls back to hardcoded model strings: every selection flows from configuration, and unconfigured paths raise ModelNotConfiguredError instead of silently guessing. (#2216, thanks @shanemmattner)
  • Critical-path priority boost applies on the first spawn batch, so a low-priority dependency of a high-priority task is claimed first. (#2233)
  • Worker exit codes: when the whole process group receives SIGINT, the worker no longer re-forwards the signal into the child's interpreter shutdown window, so it reports the child handler's exit code instead of 130. (#2238)
  • Five integration tests repaired and re-enabled after root-causing failures that predated this cycle. (#2232)

Internal

  • Unit coverage for the council runner path. (#2230)
  • Log-injection sanitization on hold fields; scanner findings resolved across instrumentation and council logging. (#2229)