Production VoiceDelivery END tail-loss / terminal ACK / hard expiry / STT reconnect / invalidation / offline cleanup PASS
Voice production upload policy PASS
Wearable preferences/NVS failure and reboot recovery PASS
Battery percent/filter/invalid/full-calibration/charge-state and compact NET rates PASS
voice_recording_store_test: ok
Settings Network / Known Networks / Forget All confirmation 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=12 LoadedPreferences=24 UiState=280 NVSBlob=25 WiFiProfile=104 WiFiStoreMax=521 PASS
Wearable renderer round-safe Watch/Agent/Help/Settings; glance rows, battery icon, date/time order; all sizes/themes PASS
Agent Live == manual page 0; pages tile the body with no overlap/gap PASS
Watch glance host thresholds/hysteresis, task mapping, Codex percent/reset, redraw policy PASS
Transcript cache: hot path / CN-TW collision / caller metrics / missing / PSRAM failure PASS
CJK subset generator coverage PASS (GB2312 Level 1 3755/3755, glyphs=5000, 中/这 covered)
Wi-Fi provisioning secrets boundary: no password logs, no token exposure, Portal keeps passwords private, fixed AP password defined once PASS
Production Wi-Fi binding: real USB context, checked driver returns, exact-length credential copy PASS
Ownership guard lifetimes / both lock orders / transition wait boundaries / 7 negative mutations PASS
Old station waiter cannot clear a successful B connection PASS
Concurrent takeover cannot interleave resolve and durable commit PASS
Approval invalidates queued Portal worker before any driver call PASS
Old worker cannot clear or overwrite a newer request PASS
Delayed Portal cleanup cannot cancel a newer candidate PASS
Preempted active candidate's late result leaves new A untouched PASS
Driver failures and associated-SSID mismatch never persist B PASS
Storage failure releases the unpersisted link for recovery PASS
Failed candidate releases ownership and restores A with Portal still active PASS
Pending station A disconnect still falls back to known B PASS
Station driver failure cleans the old link before trying B PASS
GOT_IP during connect is observed (snapshot before connect) PASS
Late disconnect cannot clear new association; genuine disconnect releases steady state PASS
Approval snapshot is lock-free; UI reporting never holds Wi-Fi locks PASS
Production hello / Gateway handshake / History menu binding PASS
SSID is required
SSID is required
Saved. Connection test: PASS.
Saved. Connection test: PASS.
ok   test_add_effective_timeout_exceeds_firmware
ok   test_add_never_prints_password
ok   test_add_verdict_wording_is_honest
ok   test_build_command_add_encodes_values
ok   test_build_command_simple_verbs
ok   test_cli_add_has_timeout_headroom_over_firmware
ok   test_cli_add_prompts_with_getpass
ok   test_cli_add_reports_rejected
ok   test_cli_has_no_password_flag
ok   test_cli_rejects_missing_ssid
ok   test_cli_status_roundtrip
ok   test_decode_preserves_invalid_escape
ok   test_encode_decode_round_trip
ok   test_encode_matches_firmware_rules
ok   test_format_list_is_human_readable
ok   test_format_missing_end_is_not_success
ok   test_parse_add_verdict
ok   test_parse_error
ok   test_parse_incomplete
ok   test_parse_list_decodes_ssid
ok   test_parse_status
ok   test_parse_status_decodes_utf8_ssid
ok   test_redaction_removes_password
Mac Wi-Fi helper: encoding round-trip, verdicts, redaction, no-argv password, timeout headroom PASS
Production raw button polling / all Settings Back paths / Settings Voice starts=0 / Approval ownership PASS (host)
Double A/B top-level only / openAgentSessionPicker reuse / Speech Mode APPLY PASS (host)
Touch virtual A/B / top-level swipe / Agent browse / History controls / Settings entries PASS (host)
Touch contact epoch ownership / stale cancellation / Long release PASS (host)
History multi-screen message paging / touch parity / reset PASS (host)
History cross-page fetch/cache traversal PASS (host)
Navigator stale-epoch ownership / legal Long finish PASS (host)
Production Voice 999/1000 CANCEL, 1001 UPLOADING; transcript delivery never auto-sends; EXPIRED A no RETRY / B CLOSE PASS
Known Networks: single forget precise, Forget All confirmed twice PASS (host)
Provisioning modal: explicit entry only, gestures blocked, Hold B cancels 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)
Bounded Navigator paging/empty creation/capabilities/native choice semantics PASS
tap inside slop resolves exactly one Tap PASS
tap slop boundary 18px is inclusive PASS
swipe in four directions resolves the dominant axis PASS
swipe requires >=1.5x dominant axis PASS
long press resolves Long then LongRelease PASS
movement cancels Long and never yields Tap PASS
sub-debounce contact is ignored PASS
one primary gesture per contact PASS
left/right half splits into virtual B/A PASS
TouchTransform maps, mirrors and clamps in one place PASS
Raw TouchGesture reducer / transform PASS (host)
history cache never exceeds kCachePages PASS
history append_older makes the fetched page current PASS
history cache eviction keeps traversal linear and in range PASS
history cache older/newer boundaries PASS
AgentBrowse manual page / live tail restore / reset PASS
HistoryScreen linear paging and position PASS
HistoryScreen multi-screen message paging is linear and reversible PASS
history_bounded_text truncates on a UTF-8 boundary PASS
Bounded Agent history cache / view / UTF-8 PASS (host)
Wi-Fi profile store, validation, selection, backoff, no-auto-SoftAP, candidate-first, initialized-marker/first-run migration, Missing/Valid/Corrupt policy, candidate-disconnect ordering, exact-length credential copy, persistent recency sequence, SSID/QR PASS
T1 steady connected: 100 ticks, no reconnect PASS
T2 candidate takeover: old station waiter STALE, B wins PASS
T3 candidate failure: C discarded, station reconnects A PASS
T4 set_config failure: B never persisted PASS
T5 actual SSID mismatch: rejected, not persisted PASS
T6 candidate success: B persists and holds, no 2s reconnect PASS
T7 approval preemption: late candidate STALE, never commits PASS
reverse: late candidate cannot touch a new station generation PASS
generations are unique across ownership changes PASS
concurrency: candidate takeover always invalidates a captured station attempt (200 runs) PASS
concurrency: 4-thread hammer keeps ownership invariants (50 runs) PASS
Wi-Fi connection ownership: T1-T7 + interleavings + concurrency PASS (host)
B4 portal candidate failure: not persisted, AP stays up, station auto-reconnects A PASS
B3 steady connection: 100 ticks, no reconnect/mark_success PASS
item 12 approval preemption: AP stopped, late candidate ignored PASS
preemption beats a candidate that would otherwise succeed PASS
Wi-Fi network lifecycle: B3/B4 + Approval/Provisioning ownership PASS (host)
USB production binding: real context reaches live store (status/list/add/remove/clear) PASS (host)
Network menu: renderer order == reducer mapping, Wi-Fi Setup requires explicit confirmation PASS (host)
QR encoder byte-mode matrix match, finder invariants, growth, bounds PASS
USB Wi-Fi protocol encoding, candidate-first verdicts, redaction PASS
Portal HTML escaping, hostile-SSID safety, body bound and form parse PASS
Production hard expiry clears voice identity / keeps B CLOSE across disconnect PASS (host)
Network callbacks / new hello / generation / authoritative DONE / retained Voice on weak network / stale operation PASS (host)
Terminal notification exactly-once (DONE/FAILED, no periodic or reconnect replay) PASS (host)
Production WebSocket -> Cloud -> board History page/error dispatch PASS (host)
.....
----------------------------------------------------------------------
Ran 5 tests in 1.684s

OK
Approval modal arbitration and exactly-once notification PASS
single press waits the full gap then emits exactly one CLICK PASS
double press emits DOUBLE_CLICK with zero leading CLICK PASS
299 -> DOUBLE; 301 / exact gap -> first SINGLE then next sequence PASS
long press emits one LONG and one LONG_RELEASE with zero CLICK PASS
first short + second long -> LONG only, then LONG_RELEASE PASS
A->B / B->A never produce a DOUBLE_CLICK PASS
contact bounce produces no spurious gesture PASS
stale epoch / explicit invalidation discard pending CLICK PASS
allow_double=false keeps immediate CLICK and never doubles PASS
Raw ButtonGesture single/double/long state machine PASS (host)
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
# (node:3022759) 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: archived inspection grammar; mutations, composition and unknown tools need approval
ok 1 - archived inspection grammar; mutations, composition and unknown tools need approval
  ---
  duration_ms: 1.818494
  type: 'test'
  ...
# Subtest: production Pi pager never registers synthetic tool-call approval
ok 2 - production Pi pager never registers synthetic tool-call approval
  ---
  duration_ms: 0.390062
  type: 'test'
  ...
# Subtest: archived approval channel waits past the old limit using a controlled clock
ok 3 - archived approval channel waits past the old limit using a controlled clock
  ---
  duration_ms: 11.2769
  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: 20.527434
  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: 3.875676
  type: 'test'
  ...
# Subtest: text activity flushes on the throttle timer
ok 6 - text activity flushes on the throttle timer
  ---
  duration_ms: 30.68892
  type: 'test'
  ...
# Subtest: plain text removes noisy markdown and redacts credentials
ok 7 - plain text removes noisy markdown and redacts credentials
  ---
  duration_ms: 0.417564
  type: 'test'
  ...
# Subtest: tool summaries keep only a short safe action
ok 8 - tool summaries keep only a short safe action
  ---
  duration_ms: 0.706637
  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.422764
  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: 446.935858
  type: 'test'
  ...
# Subtest: existing-session snapshot restores native final/recent text after overlay restart
ok 11 - existing-session snapshot restores native final/recent text after overlay restart
  ---
  duration_ms: 0.555193
  type: 'test'
  ...
# Subtest: queued user requests each complete before the native agent loop settles
ok 12 - queued user requests each complete before the native agent loop settles
  ---
  duration_ms: 9.390939
  type: 'test'
  ...
# Subtest: low-level agent restarts inside one user turn keep the running timer anchored
ok 13 - low-level agent restarts inside one user turn keep the running timer anchored
  ---
  duration_ms: 6.43486
  type: 'test'
  ...
# Subtest: official confirm/select/input/editor preserve native answers
ok 14 - official confirm/select/input/editor preserve native answers
  ---
  duration_ms: 2.121513
  type: 'test'
  ...
# Subtest: native abort/timeout/session close cannot replay replies
ok 15 - native abort/timeout/session close cannot replay replies
  ---
  duration_ms: 6.688637
  type: 'test'
  ...
# Subtest: target polling preserves focused select and open options
ok 16 - target polling preserves focused select and open options
  ---
  duration_ms: 4.188753
  type: 'test'
  ...
# Subtest: pending target request is not overwritten by a stale poll
ok 17 - pending target request is not overwritten by a stale poll
  ---
  duration_ms: 1.126575
  type: 'test'
  ...
# Subtest: approval polling preserves buttons, focus and in-flight decisions
ok 18 - approval polling preserves buttons, focus and in-flight decisions
  ---
  duration_ms: 1.375182
  type: 'test'
  ...
# Subtest: approval buttons submit their own ID and binary decision
ok 19 - approval buttons submit their own ID and binary decision
  ---
  duration_ms: 2.906426
  type: 'test'
  ...
# Subtest: unified target selector includes Pi and Codex
ok 20 - unified target selector includes Pi and Codex
  ---
  duration_ms: 1.929853
  type: 'test'
  ...
# Subtest: effort options follow selected model metadata and hide for Pi
ok 21 - effort options follow selected model metadata and hide for Pi
  ---
  duration_ms: 0.978748
  type: 'test'
  ...
# Subtest: an old pending approval stays actionable without a human decision
ok 22 - an old pending approval stays actionable without a human decision
  ---
  duration_ms: 1.691174
  type: 'test'
  ...
# Subtest: speech mode binds the selected device target and test has no arbitrary text
ok 23 - speech mode binds the selected device target and test has no arbitrary text
  ---
  duration_ms: 1.361477
  type: 'test'
  ...
# Subtest: native approval buttons preserve all offered decisions and labels
ok 24 - native approval buttons preserve all offered decisions and labels
  ---
  duration_ms: 1.250316
  type: 'test'
  ...
1..24
# tests 24
# suites 0
# pass 24
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 718.178938
........................................................................ [ 21%]
........................................................................ [ 42%]
........................................................................ [ 63%]
........................................................................ [ 84%]
.....................................................                    [100%]
=============================== warnings summary ===============================
.venv/lib64/python3.11/site-packages/starlette/testclient.py:51
  /home/lighthouse/esp32-dev/.cache/main-promotion-test-20261009/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
341 passed, 1 warning in 6.75s
HTTP PASS: http://127.0.0.1:40093/health
Admin PASS: HTML and API status
WSS PASS: hello/hello_ack via ws://127.0.0.1:40093/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
