From 99a67435b0e26c38a35d88e36497540ecde8a4f7 Mon Sep 17 00:00:00 2001 From: Yasyf Mohamedali Date: Mon, 14 Sep 2026 03:42:52 -0700 Subject: [PATCH] =?UTF-8?q?docs:=20=F0=9F=93=9D=20fix=20a=20stale=20retry-?= =?UTF-8?q?transience=20comment=20and=20split=20the=20changelog=20by=20ver?= =?UTF-8?q?sion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SidecarError's doc comment claimed a host marks a response transient by pattern-matching the composed message and a bare three-digit number leaking through would read as a retryable 5xx. That stopped being true in v0.13.1 (#4): is_transient now reads only the CLI's last non-empty error line, and counts a 5xx only after a `status` or `API Error` marker, never a bare number, so it now names the keywords (`overloaded`, `rate limit`, `status`/`API Error` 5xx) that interpolated text could actually trip. CHANGELOG.md's Unreleased section carried the 0.12.0, 0.13.0, and 0.13.1 entries with no version headings, because the commits landing the 0.13.0 and 0.13.1 changes never renamed the section the way 4faadf0 did for 0.12.0. Split them under dated `## [0.12.0]`, `## [0.13.0]`, and `## [0.13.1]` headings (attributed by cross-referencing each tag's CHANGELOG.md and commit dates) and added the matching compare links, leaving Unreleased empty. Claude-Session: https://claude.ai/code/session_015yr73szXYEmbjtNVLxnetK --- CHANGELOG.md | 14 +++++++++++++- .../Sources/SpawnllmApple/SidecarError.swift | 5 +++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc54f44..dc493ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.13.1] - 2026-09-14 + ### Fixed - **A permanent CLI error no longer retries because the echoed prompt contains a three-digit number.** The retry policy matched any bare `5xx`, `overloaded`, @@ -17,6 +19,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `ERROR: ...` and `claude` prints `API Error: ...`, and counts a 5xx only in a status position, such as `"status":503`, `last status: 502`, `API Error: 500`, or an HTTP backend's `exited 503:` header. A 4xx is never transient. + +## [0.13.0] - 2026-09-02 + +### Fixed - **A newline-free stderr blob past 64 KiB no longer crashes a CLI-backed run.** `_tee_stderr` drained stderr with `async for`, which uses `StreamReader.readline` and caps a line at 64 KiB — a longer newline-free @@ -39,6 +45,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `("user", "project", "local")` to restore what non-isolated runs did before, or `()` to load none. `--settings` is no substitute, because settings merge: a `{"hooks":{}}` payload leaves the inherited hooks in place. + +## [0.12.0] - 2026-07-28 + +### Changed - **The Apple backend no longer needs the `apple` extra, `apple-fm-sdk`, or Xcode.** A prebuilt Swift sidecar ships inside the macOS platform wheel (`macosx_26_0_arm64`), so installing spawnllm on an Apple-Intelligence-capable @@ -395,7 +405,9 @@ First release, published to PyPI as `spawnllm`. generation. - Click CLI: `spawnllm backends` and `spawnllm call`. -[Unreleased]: https://github.com/yasyf/spawnllm/compare/v0.12.0...HEAD +[Unreleased]: https://github.com/yasyf/spawnllm/compare/v0.13.1...HEAD +[0.13.1]: https://github.com/yasyf/spawnllm/compare/v0.13.0...v0.13.1 +[0.13.0]: https://github.com/yasyf/spawnllm/compare/v0.12.0...v0.13.0 [0.12.0]: https://github.com/yasyf/spawnllm/compare/v0.11.0...v0.12.0 [0.11.0]: https://github.com/yasyf/spawnllm/compare/v0.10.0...v0.11.0 [0.10.0]: https://github.com/yasyf/spawnllm/compare/v0.9.1...v0.10.0 diff --git a/swift/spawnllm-apple/Sources/SpawnllmApple/SidecarError.swift b/swift/spawnllm-apple/Sources/SpawnllmApple/SidecarError.swift index 65c9de9..0bd5ee4 100644 --- a/swift/spawnllm-apple/Sources/SpawnllmApple/SidecarError.swift +++ b/swift/spawnllm-apple/Sources/SpawnllmApple/SidecarError.swift @@ -16,8 +16,9 @@ public enum ErrorKind: String, Sendable { } /// Messages are constants and never interpolate framework text, model output, or token -/// counts: a host marks a response transient by pattern-matching the composed message, and -/// a bare three-digit number leaking through would read as a retryable 5xx. +/// counts: a host marks a response transient by pattern-matching the composed message +/// for `overloaded`, `rate limit`, or a `status`/`API Error` 5xx, and arbitrary +/// interpolated text could trip one of those keywords by accident. public struct SidecarError: Error, Equatable, Sendable { public let kind: ErrorKind public let message: String