Text + Voice Demo Baseline physical validation — 2026-10-04, Asia/Shanghai DEMO BASELINE: PHYSICAL FAIL UI / Wearable Shell 0.6a gate: NOT PASSED Speech output: FROZEN. No Read Screen, AUTO_REPLY, AUTO_SUMMARY, buffered playback, or streaming playback was invoked on hardware. Speech playback start count: 0. Baseline branch: codex/demo-text-voice-baseline-0.5.1 Baseline / Gateway source: 0f4f47ccbe79142a1b8cc324c62b856ef6433ff6 Firmware behavior source: 6bffe571b7c1b61cfdb168b0f7a03737bad394f1 Tracked firmware / boards diff against 6bffe57: EMPTY Firmware VERSION: 0.5.1 Firmware provisioning: original baseline profile, user-confirmed powellli hotspot. An unsupported legacy CONFIG_DEVICE_LAB_SPEECH_TRACE line was removed from the private provisioning file. No tracked firmware/server source was modified. This is a newly rebuilt candidate from physically proven source, not a byte-identical copy of the historical physical-pass binary. merged-flash.bin: 2,123,712 bytes SHA256: 099ac2b8d25bf1c04fb5181344d59466fe34b509eb50377486821d8e30facf0b firmware.bin: 2,058,176 bytes SHA256: dff6d7cf4a4bacf86f8806f68407a53c4d066167a7b88fe5eb676e5e82482dbb Mac SHA256: MATCHES LIGHTHOUSE Mac artifact: /Users/lili/workspace/esp32-dev/.cache/demo-baseline-validation-20261004/firmware-hotspot Serial port: /dev/cu.usbmodem1101 Chip: ESP32-S3 revision v0.2, 16 MB Flash, 8 MB PSRAM Flash: PASS, esptool write hash verified Gateway PID: 419467 Gateway WorkingDirectory: /home/lighthouse/esp32-dev/.cache/demo-text-voice-baseline-0.5.1 Gateway ExecStart: same worktree/scripts/run-server.sh Gateway status: active/running Gateway start: 2026-10-04 20:56:13 CST Gateway NRestarts: 0 Gateway health: PASS Speech Mode for restored target: OFF Restored Pi target: agent:pi:01a0fcd2-7b96-77fb-a57a-40bbfb9fe5da Maintenance restart count: 1. No subsequent Gateway restart. buffered-experiment.conf: saved and moved outside the active drop-in directory. All Speech experiment branches and worktrees: preserved. No merge into main. Remote evidence: /home/lighthouse/esp32-dev/.cache/demo-baseline-validation-20261004-PSHmES Software validation, rerun on this baseline: Python: 138 PASS, one existing deprecation warning Node: 18 PASS Firmware host helpers / render: PASS HTTP / WebSocket smoke: PASS Pi / Codex authenticated TLS WSS Voice smoke: PASS, FAKE STT ESP-IDF v5.5.4 build: PASS git diff --check: PASS Restored server health/Admin/JS/server/status pages: HTTP 200 Existing Pi control settings endpoint: HTTP 200 Boot: Wi-Fi connected: PASS Cloud connected / hello acknowledged: PASS Device online / original Agent target restored: PASS Speech OFF: PASS PI / IDLE screen: user confirmed normal Basic monitor pages: user confirmed normal, returned to PI Idle 5 min: PASS Window: 21:05:02–21:10:02, 300.1 seconds, 61 samples Unexpected offline / WSS reconnect / reboot during this window: 0 / 0 / 0 Gateway active throughout; PID unchanged; NRestarts=0 Text Agent: PASS for displayed and delivered behavior RUNNING: PASS Elapsed timer: PASS Chinese activity: PASS Tool activity: PASS A APPROVE: PASS, physical A click while approval=1 B REJECT: PASS, separate harmless sleep 1 request, physical B click while approval=1 DONE: PASS final_text: exact backend match “检查完成”, 12 UTF-8 bytes; user confirmed display Chinese rendering: PASS, user confirmed Reject task final_text: exact backend match “已取消”, 9 UTF-8 bytes; user confirmed Notification vibration: completed; minimum free stack 2016–2028 bytes Voice 1: complete single-voice physical path PASS, after an earlier WSS reconnect Voice ID: 58c10ac51284da79 VOICE_RX start: device serial voice_start sent=1; Gateway INFO marker NOT EMITTED VOICE_RX end: device serial voice_end sent=1; Gateway INFO marker NOT EMITTED Upload: 46 chunks, 162,288 PCM bytes; capture failure=none Maximum send time: 282 ms STT: successful transcript was delivered; Gateway STT INFO marker NOT EMITTED STT provider duration: UNKNOWN, not present in journal Transcript: displayed; user confirmed correct; no transcript content saved here A SEND: PASS, voice_decision queued and voice_state=SENT Pi received: PASS, user explicitly confirmed receipt and response Agent reply: DONE, final_bytes=307; user confirmed device reply display Voice repeated: 1: NOT RUN 2: NOT RUN 3: NOT RUN Post-Voice idle 3 min: NOT RUN Stopped additional physical tests after the earlier unexpected disconnect was discovered. The first disconnect was noticed retrospectively while examining the single-voice trace; the prior “still no disconnect” progress statement was explicitly corrected. No further recording was requested. Unexpected offline: 1 WSS reconnect: 1 Wi-Fi disconnect: 0 Reboot: 0 Stack overflow: 0 Watchdog / heap failure: 0 observed These counts cover the final hotspot baseline serial evidence, not the earlier wrong-network boot/preflight or planned flash resets. Exact failure boundary: WSS/TLS receive failed during idle after the successful Text task and before Voice recording. This is not an STT failure. Exact initiating root cause and Gateway WebSocket close code/reason remain UNKNOWN. First connection lasted about 504 seconds. DONE preceded the failure by 60.8 s. Last successful application heartbeat was 27.8 s before the receive error; configured application heartbeat interval is 30 s. No explicit no-PONG failure was logged. RSSI was -38 dBm, PS=1, internal_free=97935, dma_largest=31744. No Wi-Fi disconnect, heap failure, or Gateway process restart was observed. The current evidence does not distinguish hotspot/public route stalls from ESP32 TLS/WebSocket receive behavior, or identify which peer initiated closure. First relevant serial log: E (511373) transport_base: esp_tls_conn_read error, errno=No more processes W (511373) transport_ws: Requested to read 2, actually read 0 bytes E (511373) transport_ws: Error read data(-1) E (511373) websocket_client: esp_transport_read() failed with -1, transport_error=ESP_OK, tls_error_code=0, tls_flags=0, errno=11 I (511373) CLOUD: [CLOUD] link reason=receive-error bytes=728 parts=1 elapsed_ms=10004 rssi=-38 ps=1 internal_free=97935 dma_largest=31744 W (511403) CLOUD: [CLOUD] disconnected I (519603) CLOUD: [CLOUD] connected First relevant Gateway log: 2026-10-04T21:12:55+08:00 device-gateway[419467]: INFO: device esp32s3-28848543a200 offline 2026-10-04T21:12:55+08:00 device-gateway[419467]: INFO: connection closed 2026-10-04T21:13:03+08:00 device-gateway[419467]: INFO: device esp32s3-28848543a200 online board=m5stack-stopwatch firmware=0.5.1 No close code/reason or corresponding Cloudflare service error was logged in the inspected 21:12:40–21:13:10 window. Additional diagnostic gap: voice.py uses logger device_gateway.voice, outside the configured uvicorn.error logger hierarchy. With this launcher its effective level is WARNING; INFO is disabled. Therefore existing [VOICE_RX]/[VOICE_STT] lifecycle markers were suppressed. The failure is in diagnostic visibility, not proof of failed STT. Next smallest diagnostic action: Enable the existing content-free Voice INFO diagnostics and record Gateway WebSocket close code/reason, then repeat only a same-firmware Text-to-idle connection observation. Correlate closure with serial receive-error/heartbeats. Do not change PS, TCP buffers, TX locking, timeout values, STT, or Speech output. No such code/deployment change was made during this run. Preservation: Mac tracked source unchanged; config/wifi-secondary.local.json preserved. Historical physical-pass merged SHA still present unchanged: 673ba20d8d010a562e441c7f136ec48afcb0853f45d684e40c489465c0009cbf Factory backup SHA before/after matches: 910416566f113205d7eddc9739c4ea9d7cf0e5dec7dab20c73e4a269f7a6b33a Serial monitor and Gateway journal capture remain active for follow-up.