From efffb9fa92b1662f472d890e74ab4b202a46cf92 Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Mon, 3 Aug 2026 18:07:51 -0400 Subject: [PATCH] Release 0.23.0 Minor again: Trace ABI 7 -> 8 is breaking for embedders, and the trace_v7_* conformance helpers are replaced by trace_v8_*. Co-Authored-By: Claude Opus 5 (1M context) --- UPGRADING.md | 31 +++++++++++++++++++++++++++++++ pyproject.toml | 2 +- uv.lock | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index d2a7f77..c75a839 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -11,6 +11,37 @@ Ordered newest first. "Embedder" means anything that builds on the engine beyond the `droste` CLI: hosts calling `run_rlm` in-process, `droste_runner` consumers, and Pyodide-substrate integrations staging the Deno relay. +## 0.23.0 + +### Trace ABI v8 reports liveness during provider calls + +The new transient `heartbeat` event carries `elapsed_ms` and nothing else. It +fires every 15 seconds while any provider call is outstanding, and stops when +the call completes. + +It exists because a host cannot otherwise distinguish "blocked on the network" +from "wedged in the interpreter" — both are silence — so no-progress watchdogs +were killing healthy runs whose subcall simply took a while. Batch subcalls are +the worst case: they post to `/responses/batch`, which the relay does not +stream, so they emit no `reasoning_delta` either and go completely silent +between start and completion however long they take. + +**Hosts running a no-progress watchdog should count `heartbeat` as progress.** +If yours also ignores `reasoning_delta`, count that too — it already streamed +during unary calls and is the same kind of signal. + +The heartbeat is emitted relay-side, deliberately. Pyodide runs on the relay's +thread, so the timer cannot fire while generated code spins in WASM — which is +exactly when a watchdog *should* fire. A heartbeat therefore never masks a +genuine wedge; it only reports the healthy case. + +Being transient, it is never retained and never reaches a run record, whatever +`TraceRetentionPolicy.retain` names. + +Hosts must accept Trace ABI 8 and update to the `trace_v8_*` conformance +fixtures. `droste.testing` now exports `trace_v8_execution_ndjson` and +`trace_v8_lifecycle_ndjson`; the `trace_v7_*` helpers are gone. + ## 0.22.0 ### Trace ABI v7 publishes answer-state checkpoints diff --git a/pyproject.toml b/pyproject.toml index 45ff88f..dea791a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "droste" -version = "0.22.0" +version = "0.23.0" description = "Recursive analysis engine for data too large for a context window, built with Recursive Language Models (RLMs)" readme = "README.md" requires-python = ">=3.11" diff --git a/uv.lock b/uv.lock index 02f1ec8..4d9ec43 100644 --- a/uv.lock +++ b/uv.lock @@ -562,7 +562,7 @@ wheels = [ [[package]] name = "droste" -version = "0.22.0" +version = "0.23.0" source = { editable = "." } [package.optional-dependencies]