Release notes
Changes that affect threads you already have, release by release.
Upcoming: Teams Phase 2
Not in this release: these change code you may already have, so they are listed ahead of time.
Thread.cancelacross processes. When another process holds the thread's branch,Thread.cancel/thread.cancelwill record a durable cancel request that the holder applies at its next step, and returnCancelAcceptedwith that request'sitem_key(HTTP 202 onPOST /v1/threads/{thread_id}/cancel) instead of failing withbranch_busy(HTTP 409). In TypeScript the return type becomesAppended | CancelAccepted, so code that readsevent_idfrom the result must check which one it got.AskOutcome.failed. An ask of a host member whose turn failed will closefailed, with the error. Aswitch/matchoverAskOutcomeneeds a new case, andassertNever/assert_neverwill point at it.
Unreleased (v0.1)
Threads started before this release can't be continued when their agent has extension tools or deferred tools. Start a new thread; the old one stays readable (timeline, export, fork points, saved cases).
- Tool origin. A pinned tool now records the extension it came from (
origin), so drift can tell an extension's tools apart. It isn't shown to the model, but it is part of the config hash. Continuing such a thread fails withinvalid_config: "this thread was started with another config: tool origin was added in this release; start a new thread". Agents without extension tools keep their config hash and their threads continue as before. - Deferred tools. Tool search pins a deferred tool in a new form, which changes the config hash of agents with deferred tools in the same way.
- Threads the host continues for you meet the same error: a channel conversation's next message, a schedule's next fire on its thread, and approving or denying a run that was awaiting approval. Settle pending approvals before upgrading.
- In-flight team members of such agents fail to rebind with
pin_mismatch. It surfaces as a turn error on the member, not as a continue error: finish or cancel the team's work before upgrading.
Evals. runEvals() / run_evals() and threads eval run saved cases: for free in CI, with drift against your current agents, and with a judge model under --live. saveCase now saves any completed turn with no sandbox snapshot, and portable means the case reruns offline from its directory alone.
The test model guard raises ModelBlockedError (an Error in TypeScript, a RuntimeError in Python), a subclass of the error it raised before, so existing catch / except blocks behave the same.