@@ -5,6 +5,45 @@ All notable changes to Busbar are documented here.
55The format is based on [ Keep a Changelog] ( https://keepachangelog.com/en/1.1.0/ ) ,
66and this project adheres to [ Semantic Versioning] ( https://semver.org/spec/v2.0.0.html ) .
77
8+ ## [ 0.17.0] — 2026-05-31
9+
10+ Release candidate for final testing ahead of 1.0. Outcome of a three-model code audit
11+ (Opus, Sonnet, qwen3.5) of the full source.
12+
13+ ### Fixed (correctness / security)
14+ - ** Panics removed on hostile input:** a malformed ` Authorization ` header could panic on a
15+ UTF-8 boundary; a closing brace before an opening one in an upstream body could underflow
16+ the JSON brace scanner; an API key with a control character could panic the worker. All now
17+ fail cleanly.
18+ - ** Circuit-breaker error-rate trip** now uses windowed errors vs windowed total (both from the
19+ sliding window) — a long-running lane no longer spuriously trips on clean recent traffic once
20+ old errors age out.
21+ - ** SWRR weight updates are serialized** — concurrent selections could corrupt the algorithm's
22+ invariant and bias distribution.
23+ - ** Cooldown jitter** applies its sign (±) instead of only ever lengthening cooldowns.
24+ - ** Session affinity** uses a stable hash, so sticky routing survives a restart (was a randomly
25+ seeded hasher).
26+ - ** Passthrough auth** now forwards the caller's bearer token (handlers previously dropped it,
27+ silently falling back to the lane's static key).
28+ - ** Degraded routing** (least-bad / fallback-pool) now applies cross-protocol translation, so it
29+ is correct when the chosen lane speaks a different protocol.
30+ - Anthropic ` tool ` role messages map to the ` user ` role (no nonexistent ` tool_use ` role → 422);
31+ bedrock parse-error signal typo (` ir-parse ` → ` ir_parse ` ); token-count i64 saturation.
32+
33+ ### Fixed (robustness / accounting)
34+ - Per-key rate-limit map evicts stale windows (was an unbounded per-key memory leak).
35+ - ` /admin ` usage ` requests ` no longer double-counts non-streaming cross-protocol responses.
36+ - ` /stats ` ` inflight ` is derived from the semaphore (was always 0).
37+
38+ ### Changed
39+ - ** Logging:** a stderr ` tracing ` subscriber is always installed (level from ` RUST_LOG ` ); OTLP
40+ export composes on top when configured. Previously all spans/warnings were dropped unless OTLP
41+ was set. Operational warnings moved from ` eprintln! ` to structured ` tracing ` .
42+ - ** Quality:** named the magic numbers/strings (auth modes, breaker states, failover/timeout/
43+ probe/rate-window/price/window-capacity defaults, Anthropic API version); the outcome window is
44+ a ` VecDeque ` (O(1) eviction); scrubbed internal references from comments; ` Cargo.toml ` reports
45+ the real version. One unconditional dead-code allow remains (a RAII guard).
46+
847## [ 0.16.2] — 2026-05-31
948
1049### Security
0 commit comments