From 72d562e4c71ff75b340f754a77548eb0b1dd5b7d Mon Sep 17 00:00:00 2001 From: Brett Kinny Date: Thu, 29 Oct 2026 19:06:38 +1000 Subject: [PATCH] release: fw-v1.3.5 Bump the firmware submodule to BrettKinny/StackChan c074907 (firmware 1.3.5: the #196 codec-open fix) and update the CHANGELOG, compatibility matrix, README pin note and the docs test. Source-only: no binaries are published. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NRqp6NDnGKg1DWFd9qrkjW --- CHANGELOG.md | 7 +++++++ COMPATIBILITY.md | 8 ++++---- README.md | 2 +- firmware | 2 +- tests/test_docs_onboarding.py | 2 +- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e5afef..f994359 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +## [fw-v1.3.5] - 2026-10-29 + +Firmware only (`BrettKinny/StackChan@dotty`, submodule `c074907`). Source-only: the server address is compiled in, so build it yourself with your own `CONFIG_OTA_URL` (SETUP.md §2). Drafted with AI assistance (Claude Opus 5.5) and smoke-tested on a physical StackChan. + +### Fixed +- **No reboot when the audio codec fails to open** (#196): one failed I2C read from the speaker amp while it powered up made opening the codec fail, and an `ESP_ERROR_CHECK` rebooted the robot mid-reply. Opening the speaker or microphone now tries three times, 20 ms apart. If all three fail, that audio is dropped and the next attempt to use it retries after 500 ms. While the microphone is off it reads silence, not the last buffer, and volume, gain and close errors are logged instead of rebooting. Bench (2026-10-29): the robot booted, rejoined WiFi, connected with all 15 tools, woke to the wake word and played a full spoken reply. This was one smoke test, not a soak; the I2C error is rare and did not happen during it. + ## [server-v0.2.0] - 2026-10-29 `server-v0.2.0-rc.1` promoted to a final release with no server code changes; the full list of changes is under `[server-v0.2.0-rc.1]` below. Pair it with `fw-v1.3.4`. Drafted with AI assistance (Claude Opus 5.5). diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index 8e83999..f85daaa 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -13,14 +13,14 @@ For protocol wire formats see `docs/protocols.md`. | Component | Current Version | Protocol / Interface | Breaking Change Policy | |---|---|---|---| -| StackChan firmware (`BrettKinny/StackChan@dotty`) | `fw-v1.3.4` release; submodule `5b361e5` | Xiaozhi WebSocket protocol, MCP over WS (JSON-RPC 2.0), StateManager event contract | Build the pinned submodule; do not substitute the official upstream tree or OTA-update without coordinated verification | +| StackChan firmware (`BrettKinny/StackChan@dotty`) | `fw-v1.3.5` release; submodule `c074907` | Xiaozhi WebSocket protocol, MCP over WS (JSON-RPC 2.0), StateManager event contract | Build the pinned submodule; do not substitute the official upstream tree or OTA-update without coordinated verification | | xiaozhi-esp32-server (local build) | `xiaozhi-esp32-server-piper:local` | Custom LLM provider API, `.config.yaml` schema, Xiaozhi WS server | Rebuild image only after checking upstream changelog for provider API or config schema changes | | dotty-pi (pi agent) | `dotty-pi:0.1.0` | pi RPC (JSONL over stdio), the seven `dotty-pi-ext` voice tools | Pin the image tag; pi-version or model changes need end-to-end cutover testing | | dotty-behaviour | `dotty-behaviour:0.1.0` | HTTP API (`/api/perception/*`, `/api/vision/*`, `/api/audio/*`, `/health`) | Endpoint signatures stable; perception event-schema changes require firmware + xiaozhi review | | bridge.py (dashboard) | `dotty-bridge:0.1.0` image from repo HEAD | `/ui` dashboard, `/admin/*`, `/health` | Dashboard/admin service only post-#36; admin route changes require updating dashboard callers | -The public `fw-v1.3.4` superproject tag (2026-10-28) is the current -coordinated release pointer. It pins firmware submodule `5b361e5` and the +The public `fw-v1.3.5` superproject tag (2026-10-29) is the current +coordinated release pointer. It pins firmware submodule `c074907` and the matching server-side patches. It is source-only: build it with your own `CONFIG_OTA_URL` (SETUP.md §2). Draft PRs and a dirty submodule are not a released compatibility set. @@ -117,4 +117,4 @@ versions work with which firmware versions. --- -Last verified against the repository and `fw-v1.3.4` pin: 2026-10-28. +Last verified against the repository and `fw-v1.3.5` pin: 2026-10-29. diff --git a/README.md b/README.md index a4caf00..91151e6 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Full policy: [`AI_TRANSPARENCY.md`](./AI_TRANSPARENCY.md). Behaviour is **one of six states** (`idle / talk / story_time / security / sleep / dance`) plus two independent toggles (`kid_mode`, `smart_mode`), all owned by the firmware StateManager. Voice phrases, camera events and dashboard controls all go through it. Bench checks are tracked in [#38](https://github.com/BrettKinny/dotty-stackchan/issues/38). -> Note: `firmware/` is a release pointer, not the active development checkout. The pinned build (`fw-v1.3.4`, `5b361e5`) includes the StateManager, but later fixes may only be on the active fork, so check your actual revision. See "Firmware iteration" in [`CLAUDE.md`](./CLAUDE.md) and the submodule note in [`docs/modes.md`](./docs/modes.md). +> Note: `firmware/` is a release pointer, not the active development checkout. The pinned build (`fw-v1.3.5`, `c074907`) includes the StateManager, but later fixes may only be on the active fork, so check your actual revision. See "Firmware iteration" in [`CLAUDE.md`](./CLAUDE.md) and the submodule note in [`docs/modes.md`](./docs/modes.md). The 12-pixel LED ring shows the current state at a glance. **Left ring pixels 0-5 are the state arc.** All six show the state colour, matching the dashboard's state buttons: diff --git a/firmware b/firmware index 5b361e5..c074907 160000 --- a/firmware +++ b/firmware @@ -1 +1 @@ -Subproject commit 5b361e551ee5d08d5dba7e8ae33d420fd1090ab4 +Subproject commit c074907965b0f1e12dd59968094b61ecfdb7cdd7 diff --git a/tests/test_docs_onboarding.py b/tests/test_docs_onboarding.py index d9dc854..3bff5d2 100644 --- a/tests/test_docs_onboarding.py +++ b/tests/test_docs_onboarding.py @@ -84,7 +84,7 @@ def test_current_docs_do_not_claim_the_firmware_submodule_lacks_state_manager() def test_compatibility_doc_matches_the_current_public_contract() -> None: compatibility = (ROOT / "COMPATIBILITY.md").read_text(encoding="utf-8") - assert "`fw-v1.3.4`" in compatibility + assert "`fw-v1.3.5`" in compatibility assert "the seven `dotty-pi-ext` voice tools" in compatibility assert "No formal versioning is adopted yet" not in compatibility assert "scripts/backup.sh" not in compatibility