Wearable preferences/NVS failure and reboot recovery PASS
Battery percent/filter/invalid/error retention and compact NET rates PASS
Wearable shell immediate navigation/draft and UTC clock PASS
RX8130 UTC / fixed Demo UTC+8 / day, month, year, leap rollover PASS
Wearable RAM structs: DevicePreferences=10 LoadedPreferences=24 UiState=48 NVSBlob=23 PASS
Wearable renderer round-safe Watch/Agent/Help/Settings; all sizes/themes; UTF-8 paging PASS
CJK subset generator coverage PASS (GB2312 Level 1 3755/3755, glyphs=5000, 中/这 covered)
Production raw button polling / all Settings Back paths / Settings Voice starts=0 / Approval ownership PASS (host)
Production shell gestures / offline settings / Apply failure / Voice / Approval modal priority PASS (host)
Raw GPIO / 30ms debounce / >600ms Hold A / Settings Back / no Voice or trailing CLICK PASS (host)
Network callbacks / new hello / generation / authoritative DONE / Voice interruption / stale operation PASS (host)
....
----------------------------------------------------------------------
Ran 4 tests in 1.654s

OK
Raw GPIO / 30ms debounce / >600ms Hold A / Settings Back / no Voice or trailing CLICK PASS (host)
Agent render / Read Screen / UTF-8 / redraw selection PASS (host only)
TAP version 13
# Subtest: positive inspection grammar; mutations, composition and unknown tools need approval
ok 1 - positive inspection grammar; mutations, composition and unknown tools need approval
  ---
  duration_ms: 1.78968
  type: 'test'
  ...
# (node:940742) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
# (Use `node --trace-warnings ...` to show where the warning was created)
# Subtest: official Pi tool_call hook blocks until decision; approve/reject, timeout and runtime shutdown
ok 2 - official Pi tool_call hook blocks until decision; approve/reject, timeout and runtime shutdown
  ---
  duration_ms: 122.350081
  type: 'test'
  ...
# Subtest: accepted Pi approval waits past the old limit using a controlled clock
ok 3 - accepted Pi approval waits past the old limit using a controlled clock
  ---
  duration_ms: 3.005132
  type: 'test'
  ...
# Subtest: a session has one owner and an existing runtime receives input
ok 4 - a session has one owner and an existing runtime receives input
  ---
  duration_ms: 19.691243
  type: 'test'
  ...
# Subtest: text activity batches by character threshold without splitting Unicode
ok 5 - text activity batches by character threshold without splitting Unicode
  ---
  duration_ms: 4.208781
  type: 'test'
  ...
# Subtest: text activity flushes on the throttle timer
ok 6 - text activity flushes on the throttle timer
  ---
  duration_ms: 31.198195
  type: 'test'
  ...
# Subtest: plain text removes noisy markdown and redacts credentials
ok 7 - plain text removes noisy markdown and redacts credentials
  ---
  duration_ms: 0.327264
  type: 'test'
  ...
# Subtest: tool summaries keep only a short safe action
ok 8 - tool summaries keep only a short safe action
  ---
  duration_ms: 0.508444
  type: 'test'
  ...
# Subtest: final reply excludes commentary, tools and prior assistant messages
ok 9 - final reply excludes commentary, tools and prior assistant messages
  ---
  duration_ms: 0.386686
  type: 'test'
  ...
# Subtest: registered Pi handlers emit live activity and settled final independently
ok 10 - registered Pi handlers emit live activity and settled final independently
  ---
  duration_ms: 442.39664
  type: 'test'
  ...
# Subtest: target polling preserves focused select and open options
ok 11 - target polling preserves focused select and open options
  ---
  duration_ms: 6.181524
  type: 'test'
  ...
# Subtest: pending target request is not overwritten by a stale poll
ok 12 - pending target request is not overwritten by a stale poll
  ---
  duration_ms: 1.526035
  type: 'test'
  ...
# Subtest: approval polling preserves buttons, focus and in-flight decisions
ok 13 - approval polling preserves buttons, focus and in-flight decisions
  ---
  duration_ms: 2.127013
  type: 'test'
  ...
# Subtest: approval buttons submit their own ID and binary decision
ok 14 - approval buttons submit their own ID and binary decision
  ---
  duration_ms: 3.968991
  type: 'test'
  ...
# Subtest: unified target selector includes Pi and Codex
ok 15 - unified target selector includes Pi and Codex
  ---
  duration_ms: 1.356096
  type: 'test'
  ...
# Subtest: effort options follow selected model metadata and hide for Pi
ok 16 - effort options follow selected model metadata and hide for Pi
  ---
  duration_ms: 3.044434
  type: 'test'
  ...
# Subtest: an old pending approval stays actionable without a human decision
ok 17 - an old pending approval stays actionable without a human decision
  ---
  duration_ms: 2.515371
  type: 'test'
  ...
# Subtest: speech mode binds the selected device target and test has no arbitrary text
ok 18 - speech mode binds the selected device target and test has no arbitrary text
  ---
  duration_ms: 1.995075
  type: 'test'
  ...
1..18
# tests 18
# suites 0
# pass 18
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 694.423634
........................................................................ [ 51%]
.....................................................................    [100%]
=============================== warnings summary ===============================
.venv/lib64/python3.11/site-packages/starlette/testclient.py:51
  /home/lighthouse/esp32-dev/.cache/physical-ui-cleanup-0.6a/server/.venv/lib64/python3.11/site-packages/starlette/testclient.py:51: DeprecationWarning: The anyio.abc.BlockingPortal alias is deprecated, use anyio.from_thread.BlockingPortal instead.
    _PortalFactoryType = Callable[[], AbstractContextManager[anyio.abc.BlockingPortal]]

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
141 passed, 1 warning in 5.73s
HTTP PASS: http://127.0.0.1:50395/health
Admin PASS: HTML and API status
WSS PASS: hello/hello_ack via ws://127.0.0.1:50395/device/ws
Gateway -> Device PASS: server_snapshot received
Device -> Cloud PASS: heartbeat and button_event recorded
Cloud -> Device PASS: display_message received
Pi -> Gateway -> Device PASS: RUNNING and DONE target states
gateway TCP/WebSocket smoke test passed
PI authenticated TLS WSS voice transport + FAKE STT + confirmed input: PASS
CODEX authenticated TLS WSS voice transport + FAKE STT + confirmed input: PASS
