diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a5e3cd1a..fe5576407 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,20 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). harnesses, middle-out transcript truncation, fail-open consults, and an `advisor_gate` block in `/v1/stats` covering verdicts, consult failures, and REDO-discarded turns. +- **switchyard-server container image** — a root `Dockerfile` builds the + server container image, consolidating the benchmark Dockerfile into it. + (#421) +- **Run-span task metadata** — `task_kind` and `agent_role` are recorded on + the run span, so routing telemetry can be segmented by the semantic class of + work; span fields only, no new metric labels. (#249) +- **Unified LLM-classifier bindings** — LLM-classifier routing is available + through the native PyO3 bindings, unifying the Python-side surface. (#465) + +### Changed + +- **`Algorithm::route` returns `Result`** — instead of the + bare final `Result`, so callers observe the full routing outcome (see #458 + for the design). (#459) ### Removed @@ -27,6 +41,29 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). with the deprecated Python server stack; only `[cli]` remains. Install server functionality via the standalone `switchyard-server` binary instead. +### Fixed + +- **Reasoning order in mixed stream chunks** — the OpenAI Chat stream decoder + emits reasoning deltas before content deltas from the same chunk, so + interleaved reasoning is no longer reordered. (#387) +- **Anthropic structured output in requests** — a schema arriving on + `/v1/messages` now reaches the neutral request and the forwarded upstream + body; unmappable output formats produce diagnostics instead of silent drops. + (#462) +- **Responses tool arguments emitted once** — `output_item.done` repeats the + complete function-call arguments the delta events already carried; the + decoder suppresses the repeat when they match. (#469) +- **Content filter stops as Anthropic refusal** — `StopReason::ContentFilter` + maps to Anthropic's `refusal` stop reason (and back) instead of `end_turn`, + so moderation stops remain distinguishable. (#370) +- **JSON rejection statuses preserved** — request-body rejections keep the + underlying status code instead of always returning 400. (#406) +- **Launcher config errors without tracebacks** — `switchyard launch` reports + configuration errors as messages rather than Python tracebacks. (#475) +- **Default log level** — logging defaults to `info` for all crates instead of + discarding logs from crates without an explicit level; an unnecessary `rand` + callback was removed on the way. (#471) + ## [0.2.0] Switchyard 0.2.0 introduces the native Rust server and libsy library path,