Overview

Socket Session

                                            ┌──────────────────────────────────┐     │
                                            │Register│                         │     │
                                            │────────┘                         │     │
                  ┌─────────────────────────│  1.inner root                    │◄────│
                  │                         └──────────────────────────────────┘     │
                  │                                           │                      │
                  │                                           │                      │
                  ▼                                           ▼                      │
  ┌──────────────────────────────────┐      ┌──────────────┐───────────────────┐     │
  │Auth│                             │      │Activate&Bind │                   │     │
  │────┘                             │      └──────────────┘                   │     │
  │  1.OTA(v1,v2)                    │◄─────│  1.OTA(v1,v2)                    │◄────│
  │  2.Nostr                         │      │  2.Nostr                         │     │
  └──────────────────────────────────┘      └──────────────────────────────────┘     │
                  │              │                                                   │
                  │              └────────────────────────────┐                      │
                  │ (Bearer Token)                            │ (JWT)                │
                  ▼                                           ▼                      │
  ┌───────────────────┐──────────────┐       ╔══════════════════════════════════╗    │
  │Protocol Translator│              │       ║Restful │                         ║    │
  └───────────────────┘              │       ║────────┘                         ║────┘
  │  1.XiaoZhi                       │       ║                                  ║
  └──────────────────────────────────┘       ╚══════════════════════════════════╝
                  │
                  │
                  ▼
  ┌────────────┐─────────────────────┐
  │Input Filter│                     │
  └────────────┘                     │
  │  1.Recorder                      │
  │  2.McpRouter                     │───────────────────────────────────────────┐
  └──────────────────────────────────┘                                           │
                  │                                                              │
                  │ Frame                                                        │ Frame
                  ▼                                                              ▼
  ┌───────────────────────────────────────────────────┐       ┌──────────────────────────────────┐
  │ Session │                                         │       │ Mcp Session │                    │
  │─────────┘                                         │       │─────────────┘                    │
  │     ▲                            │                │       │                                  │
  │     │                            │ Pipeline Event │       │                                  │
  │     │ Round Event                │                │       │   ┌───────────────────────────┐  │
  │     │                            ▼                │       │   │Mcp Registry│              │  │
  │   ┌───────────────────────┐──────────────────┐    │       │   │────────────┘              │  │
  │   │ Round(shadow/running) │                  │    │   ┬──────►│  1.Device Mcp Client      │  │
  │   └───────────────────────┘                  │    │   │   │   │  2.External Mcp Client    │  │
  │   │                 ▲            │           │    │   │   │   │                           │  │
  │   │                 │            │ Pipeline  │    │   │   │   │                           │  │
  │   │                 │ Tap Event  │ Event     │    │   │   │   │                           │  │
  │   │                 │ (broadcast)▼           │    │   │   │   │                           │  │
  │   │               ┌──────────┐───────────┐   │    │   │   │   │                           │  │
  │   │               │ Pipeline │           │   │    │   │   │   └───────────────────────────┘  │
  │   │               └──────────┘           │   │    │   │   └──────────────────────────────────┘
  │   │               │ 1. VAD               │   │    │   │       │
  │   │               │ 2. ASR               │   │    │   │       │
  │   │               │ 3. Turn              │   │    │   │       │
  │   │               │ 4. Ling(LLM)    ◄─────────────────┘       │
  │   │               │ 5. TTS               │   │    │           │
  │   │               └──────────────────────┘   │    │           │
  │   │                              │           │    │           │
  │   │                              │ Pipeline  │    │           │
  │   │                              │ Event     │    │           │
  │   │                              ▼           │    │           │
  │   └──────────────────────────────────────────┘    │           │
  │                                  │                │           │
  │                                  │ Pipeline       │           │
  │                                  │ Event          │           │
  │                                  ▼                │           │
  └───────────────────────────────────────────────────┘           │
                  │                                               │
                  │ FrameResult                                   │
                  │                                               │
                  ▼                                               │
  ┌─────────────┐────────────────────┐                            │
  │Output Filter│                    │         FrameResult        │
  └─────────────┘                    │◄───────────────────────────┘
  │  1.Recorder                      │
  └──────────────────────────────────┘
                  │
                  │
                  ▼
  ┌───────────────────┐──────────────┐
  │Protocol Translator│              │
  └───────────────────┘              │
  │  1.XiaoZhi                       │
  └──────────────────────────────────┘
                  │
                  │
                  ▼

Restful

                                                               ┌────┐──────────────────────────┐
                                                               │Docs│                          │
                                                               └────┘                          │
                                                               │  1.Scalar                     │
                                                               │                               │
                            │                                  └───────────────────────────────┘
                            │ Request
                            │
                            ▼
  ┌──────────────────────────────────────────────────┐         ┌────┐──────────────────────────┐
  │Layer│                                            │         │Task│                          │
  │─────┘                                            │         └────┘                          │
  │                                                  │         │  1.Security cleanup loop      │
  │           ┌────────┐─────────────────────┐       │         │                               │
  │           │CORS    │                     │       │         │                               │
  │           └────────┘                     │       │         └───────────────────────────────┘
  │           │                              │       │
  │           └──────────────────────────────┘       │
  │                         │                        │
  │                         │                        │
  │                         ▼                        │
  │           ┌────────┐─────────────────────┐       │
  │           │Tracing │                     │       │
  │           └────────┘                     │       │
  │           │                              │       │
  │           └──────────────────────────────┘       │
  │                         │                        │
  │                         │                        │
  │                         ▼                        │
  │           ┌───────────┐──────────────────┐       │
  │           │Body Limit │                  │       │
  │           └───────────┘                  │       │
  │           │                              │       │
  │           └──────────────────────────────┘       │
  │                         │                        │
  │                         │                        │
  │                         ▼                        │
  │           ┌────────┐─────────────────────┐       │
  │           │Timeout │                     │       │
  │           └────────┘                     │       │
  │           │                              │       │
  │           └──────────────────────────────┘       │
  │                         │                        │
  │                         │                        │
  │                         ▼                        │
  │           ┌────────┐─────────────────────┐       │
  │           │Security│                     │       │
  │           └────────┘                     │       │
  │           │  1.Access log                │       │
  │           │  2.Rate Limit                │       │
  │           │  3.Auth                      │       │
  │           └──────────────────────────────┘       │
  │                                                  │
  │                                                  │
  │                                                  │
  └──────────────────────────────────────────────────┘
                            │
                            │ Response
                            │
                            ▼

IOT


     ┌─────────────────┐─────────────┐    ┌───────────────┐───────────────┐
     │ Input Controller│             │    │ Reporter      │               │
     └─────────────────┘             │    └───────────────┘               │
     │                               │    │                               │
     │  ┌──────────────────────┐     │    │                               │
     │  │Device Signal Input│  │     │    │                               │
     │  │───────────────────┘  │     │    │                               │
  │─►│  │  1.Device Signal     │     │    │                               │
  │  │  │  2.Intent(JSON)      │     │    └───────────────────────────────┘
  │  │  │                      │     │              │        ▲
  │  │  │                      │     │              │ Query  │ Query Response
  │  │  └──────────────────────┘     │              ▼        │
  │  │            │                  │    ┌───────────────┐───────────────┐
  │  │            ▼                  │    │ State Manager │               │
  │  │  ┌─────────────┐────────┐     │    └───────────────┘               │
  │  │  │Input Limiter│        │     │    │ 1. Render State               │
  │  │  └─────────────┘        │     │    │ 2. Demand State               │
  │  │  │                      │     │◄───│                               │
  │  │  │                      │     │    │                               │
  │  │  └──────────────────────┘     │    │                               │
  │  │                               │    └───────────────────────────────┘
  │  └───────────────────────────────┘               │             ▲   │
  │             ▲  │               │ Signal          │             │   │
  │             │  │               │                 │             │   │
  │             │  │               ▼                 ▼             │   │
  │             │  │              ┌───────────────┐──────┐         │   │
  │             │  │  Intent      │Intent Resolver│      │         │   │
  │             │  └────────────► └───────────────┘      │         │   │
  │             └─────────────────│                      │         │   │
  │                   Ack         │                      │         │   │
  │                               └──────────────────────┘         │   │
  │                                             │                  │   │
  │                                             │ Intent           │   │
  │                                             │                  │   │
  │                   ┌─────────────────────────│──────────────────│───│──┐
  │                   │ Loop Logic│             │                  │   │  │
  │                   │───────────┘             │                  │   │  │
  │                   │                         ▼                  │   │  │
  │                   │           ┌───────────┐───────────────┐    │   │  │
  │                   │           │ Intent Bus│               │    │   │  │
  │                   │           └───────────┘               │    │   │  │
  │                   │           │                           │    │   │  │
  │                   │           │                           │    │   │  │
  │                   │           └───────────────────────────┘    │   │  │
  │                   │                        │                   │   │  │
  │                   │                        │ Intent            │   │  │
  │                   │                        │                   │   │  │
  │                   │                        ▼                   │   │  │
  │                   │     ┌──────┐──────────────────────────┐    │   │  │
  │                   │     │ Logic│                          │    │   │  │
  │                   │     └──────┘                          │◄───┘   │  │
  │                   │     │                                 │        │  │
  │                   │     │                                 │        │  │
  │                   │     │                                 │        │  │
  │                   │     │                                 │        │  │
  │                   │     │                                 │        │  │
  │                   │     │                                 │        │  │
  │                   │     │                                 │        │  │
  │                   │     │                                 │        │  │
  │                   │     │                                 │        │  │
  │                   │     └─────────────────────────────────┘        │  │
  │                   │                                                │  │
  │                   │             ┌──────────────────────────────────┤  │
  │                   │             │                               ┌──┘  │
  │                   │             ▼                               ▼     │
  │                   │   ┌─────────────┐────┐     ┌──────────┐────────┐  │
  │                   │   │ Configurator│    │     │ Render   │        │  │
  │                   │   └─────────────┘    │     └──────────┘        │  │
  │                   │   │                  │     │                   │  │
  │                   │   │                  │     │                   │  │
  │                   │   └──────────────────┘     └───────────────────┘  │
  │                   │                                                   │
  │                   └───────────────────────────────────────────────────┘
  │                                            │
  │                                            │
  │                                            │ Signal(Config,Render)
  │                                            │
  │                                            ▼
  │                   ┌───────┐───────────────────────────────────────────┐
  │                   │ Board │                                           │
  │                   └───────┘                                           │
  │                   │                                                   │
  │                   │       ┌──────────────┐────────────────────┐       │
  │                   │       │ Configuration│                    │       │
  │                   │       └──────────────┘                    │       │
  │                   │       │                                   │       │
  │                   │       │                                   │       │
  │                   │       └───────────────────────────────────┘       │
  │                   │                        │                          │
  │                   │                        │                          │
  │                   │                        ▼                          │
  │                   │       ┌───────────────────────────────────┐       │
  │                   │       │ Device│                           │       │
  └───────────────────│       │───────┘                           │       │
                      │       │                                   │       │
                      │       │                                   │       │
                      │       └───────────────────────────────────┘       │
                      │                                                   │
                      └───────────────────────────────────────────────────┘

Status

Column reference:

ColumnDescriptionPossible Values
PriorityPriority level🔴 P0 / 🟠 P1 / 🟡 P2 / 🔵 P3
StatusFeature completeness✅ Complete / ⚠️ Defective (stub/incomplete) / ❌ Not implemented
TestAutomated tests exist✅ Yes / ❌ No / — N/A
ItemFeature name—
DescBrief description—
LinkFile path or Issue link(TBD)

Priority reference:

LevelMeaningExamples
🔴 P0Infrastructure / severe bug affecting runtimeCore-path gaps, auth & security, race defects
🟠 P1Required featureCore product capabilities needed before release
🟡 P2Enhancement featurePolish, admin UI, optional protocol support
🔵 P3Optional optimizationExperience polish, power tuning, non-blocking

Priorities are assigned by humans; agents only record them and must ask a human when unclear, never infer.

Register

PriorityStatusTestItemDescriptionLink
🟡 P2❌❌Built-in rootCreated by migration only; no runtime registration endpoint

Auth

OTA Authentication

PriorityStatusTestItemDescriptionLink
🟠 P1✅✅OTA v1Basic device authentication, returns ws_url+token (real JWT when activated, empty otherwise)
🟠 P1❌❌Firmware distributionOTA returns version: "0.0.1" + url: null; no actual firmware download link
🟡 P2❌❌MQTT supportOTA returns mqtt: null; MQTT protocol not implemented
🟠 P1❌❌OTA v2Full authentication + device info reporting + firmware distribution (currently returns static data)

Nostr Authentication

PriorityStatusTestItemDescriptionLink
🟡 P2❌❌NIP-98 authenticationNot implemented

WS Authentication

PriorityStatusTestItemDescriptionLink
🔴 P0✅✅Bearer Token validationAuthorization header + query param fallback, JWT decode validation

Token lifecycle

PriorityStatusTestItemDescriptionLink
🟠 P1❌❌Refresh revocationRefresh tokens cannot be revoked; logout only drops them client-side
🟠 P1❌❌Token loggingAccess/refresh tokens written in plain text into tracing span fields

Activate & Bind

OTA Activation

PriorityStatusTestItemDescriptionLink
🟠 P1✅✅OTA v1Activation code verification + device info persistence
🟠 P1❌❌OTA v2Full activation flow (incl. challenge code verification), not implemented

Nostr Binding

PriorityStatusTestItemDescriptionLink
🟡 P2❌❌Binding/role registrationNot implemented

Protocol Translator

XiaoZhi

PriorityStatusTestItemDescriptionLink
🔴 P0✅❌Input frame parsinghello/listen/abort/mcp/voice fully parsed
🔴 P0✅❌Output frame serializationSTT/LLM/TTS/Audio/Error fully serialized
🟠 P1❌❌Missing message typessystem/alert/wake_word not implemented

Input Filter

Recorder (Input)

PriorityStatusTestItemDescriptionLink
🟡 P2✅✅Input persistenceFrame data persisted to database

McpRouter

PriorityStatusTestItemDescriptionLink
🟠 P1✅✅MCP frame routingIntercept Frame::Mcp → McpSession

Session

Listener

PriorityStatusTestItemDescriptionLink
🔴 P0✅✅VAD (Silero)Earshot implementation, frame-level voice detection
🔴 P0✅✅ASR (sherpa-onnx)XAsr model, 16kHz mono
🔴 P0✅✅Voice Break detectionSilence timeout triggers TurnComplete
🟠 P1✅✅Continued Conversationauto/realtime modes, auto re-enter voice listening after TTS
🟡 P2❌❌Semantic VAD / layered turnLayer1 Silero only; missing punctuation/semantic layer
🟠 P1❌❌VoiceprintIdentify the speaker alongside ASR and inject into the LLM; needs registration/management, voiceprint vectors and context injection
🟠 P1❌❌Dynamic VAD parametersSilence thresholds are fixed; need runtime adjustment by dialogue state
🟠 P1❌❌ASR settle + reopenASR right after VAD silence can lose the final phonemes; no turn reopen
🟠 P1❌❌Multiple ASR providersOnly one sherpa-onnx implementation; no model switching or fallback
🟡 P2❌❌Filler/hesitation detectionASR uh/um/呃/嗯 + short audio (<3 s) should not trigger the LLM
🟡 P2❌❌Ambient listening modePassive listening without a wake word + active response; needs a privacy design (no raw audio stored)
🟡 P2❌❌ASR input constraints16 kHz mono only; Asr is not Sync, so it cannot be shared across threads
🔵 P3❌❌Speaker diarizationSeparate speakers in multi-person scenes
🔵 P3❌❌Server-side AECClient-side AEC only; no echo cancellation on the server

Round

PriorityStatusTestItemDescriptionLink
🟠 P1✅✅Shadow/Running dual roundsPre-created shadow round reduces switch latency
🟠 P1✅✅Barge-in + lockoutConfigurable lockout window (default 250ms)
🟠 P1✅✅Epoch message filteringStale round messages dropped; keeps TTS status notifications
🔴 P0✅—stop_round raceFixed; 5s timeout fallback
🟠 P1✅✅AudioPacerThrottles audio output by output_frame_duration
🟠 P1❌❌Opus-to-PCM prebufferNo downlink prebuffer, so network jitter shows up directly as playback stalls

LingCore

PriorityStatusTestItemDescriptionLink
🔴 P0✅✅Qwen3 LLM (candle)Streaming generation; thread safety fixed
🟠 P1✅✅Splitter (sentencex)Chinese/English sentence splitting; 700ms timeout fallback
🟠 P1✅✅ToolCall loopLLM → MCP tool → result injection → LLM regeneration
🟠 P1✅✅History managementContext truncation (max_prompt_len) and persistence
🟡 P2⚠️❌Emotion detectionAlways returns "happy"; no real analysis
🟡 P2❌❌Personalized memoryLong-term preferences/user profile storage not implemented
🟠 P1❌❌RAG knowledge baseMCP can connect, but there is no built-in vector retrieval
🟠 P1❌❌Intent detectionNo separate intent layer; intent comes from a single LLM pass
🟠 P1❌❌LLM history blockingWriting session history to the DB blocks the whole generation thread
🟡 P2❌❌Agent orchestrationLLM + MCP tool chain autonomously executing multi-step tasks
🔵 P3❌❌describe O(n)Rebuilds the full message history on every call
🔵 P3❌❌Guided reasoning dialogueEducation-mode guidance; needs prompt engineering + dialogue state

TTS

PriorityStatusTestItemDescriptionLink
🔴 P0✅✅MatchaTTS + Opussherpa-onnx engine, Opus-encoded output
🟠 P1✅✅Two-stage streamingtoken-level fast first packet + sentence-level steady state
🟡 P2✅❌TTFA/RTF instrumentationTime-to-first-audio/real-time-factor performance monitoring
🔵 P3✅❌Fade-outTail fade-out eliminates click
🟠 P1❌❌Piper/Kokoro enginesReplace or supplement MatchaTTS; Piper suits the edge, Kokoro has the better quality/size ratio
🟠 P1❌❌Multilingual TTSSingle language today; the ESP32 ASR side already supports 25+ languages
🟠 P1❌❌Multiple TTS providersOnly one implementation; no engine switching or fallback
🟠 P1❌❌Quick ReplyPlay "I'm here" while the LLM thinks, lowering perceived latency
🟠 P1❌❌Dynamic voice switchingSwitch TTS voice automatically from voiceprint recognition
🟠 P1❌❌Tail hold buffer~240 ms frame cache so the final syllable is not cut (fade-out is implemented)
🟡 P2❌❌Inter-sentence silenceFixed silence → punctuation-driven (comma 0.3 s / period 0.6 s)
🟡 P2❌❌Conversational prosodyBreath/hesitation/laughter prosody to sound more human
🟡 P2❌❌Emotion-adaptive toneDetect emotion labels and adjust tone
🔵 P3❌❌Voice cloningMatchaTTS supports reference audio; the config surface is missing
🔵 P3❌❌TTS clone overheadArc<str> vs String clone storm
🔵 P3❌❌Audio normalizationadaptive_normalize() exists but is not wired into the TTS output

McpSession

McpRegistry

PriorityStatusTestItemDescriptionLink
🟠 P1✅✅Tool registration/aggregationMultiple client tools merged, routed by name

Device Mcp Client

PriorityStatusTestItemDescriptionLink
🟠 P1✅✅rmcp transport layerDevice MCP protocol bridging, full handshake

External Mcp Client

PriorityStatusTestItemDescriptionLink
🟡 P2✅✅HTTP remote MCPConnect to external MCP servers, tool list cached

MCP Authentication

PriorityStatusTestItemDescriptionLink
🔴 P0✅✅/mcp endpoint authenticationBearer JWT auth + rmcp default Host validation

Tool ecosystem

PriorityStatusTestItemDescriptionLink
🟠 P1❌❌Home integrationHome Assistant and similar, reached through MCP
🟠 P1❌❌Device-to-device callsDevices call each other like phones; needs an MQTT gateway + contacts
🟠 P1❌❌Music playbackA baseline feature; needs LRC lyric sync
🟠 P1❌❌Timer/reminder/alarmNo scheduling or reminder mechanism at all
🟡 P2❌❌Plugin systemNo plugin architecture; extensions require changing core code
🟡 P2❌❌MCP MarketThird-party tool aggregation + one-click import + hot reload
🟡 P2❌❌MCP debug consolePer-agent endpoints, live call testing + per-agent filtering
🟡 P2❌❌MCP tool aggregationPreset tool library (DingTalk/QQ/system monitoring/WebPilot/math)
🟡 P2❌❌MQTT gatewayMQTT+UDP → WS bridge: distributed deployment + balancing + HMAC
🟡 P2❌❌Config wizard + end-to-end testFirst-run wizard + per-component latency tests + visualization

Output Filter

Recorder (Output)

PriorityStatusTestItemDescriptionLink
🟡 P2✅✅Output persistenceFrame/round data persisted to database
🟠 P1❌❌Recorder capVec<RecordEntry> is unbounded, so concurrent load grows memory without limit

Restful

PriorityStatusTestItemDescriptionLink
🔴 P0✅✅POST /api/auth/loginAccount/password auth, returns access/refresh tokens
🔴 P0✅✅POST /api/auth/access_tokenRefresh token exchange
🟠 P1✅✅POST /api/auth/reset_passwordJWT auth, old-password verification
🟠 P1✅✅GET /api/auth/userReturns current user info
🟡 P2✅❌GET /api/stats/summaryOverview stats (devices/sessions/message count/avg latency)
🟡 P2✅❌GET /api/stats/trendsTrend data (daily device/session/message trends)
🟡 P2✅❌GET /api/stats/latencyLatency percentile data (P50/P90/P99 etc.)
🔴 P0✅✅Rate LimitingGitHub-style token bucket: auth/ota per-IP fixed window (20/15min, 30/min) + core per-user (1000/h) + X-RateLimit-* response headers + per-account login failure lockout (5/15 min)
🔴 P0✅✅GET /api/security/rate_limitAuth introspection endpoint, returns auth/ota/core quotas & live usage; does not consume quota itself
🟡 P2❌❌Invite Code systemRegistration invite code generation/validation not implemented
🟠 P1✅❌Device management CRUDList/activate (by code/by ID)/disable/enable/delete endpoints implemented (missing detail view)
🔵 P3❌❌Session export/deleteSessions can only be viewed, not exported or deleted

Admin UI

PriorityStatusTestItemDescriptionLink
🟠 P1✅❌Dashboard page6 StatCards, TrendsChart, LatencyChart, RecentSessionsTable, LatencyTable
🟠 P1✅✅Session list/detailSearch/date filter/pagination/SessionDetail component
🟠 P1✅✅Security event monitoringRate-limit/login outcome events persisted + admin query (type/IP filter + pagination) + 30-day auto-cleanup
🟡 P2❌❌User CRUD management UIUser list/create/delete/role management not implemented
🟡 P2❌❌RBAC managementToken usage/conversation duration/device activity/permission roles not implemented
🟡 P2❌❌MCP dashboardMulti-endpoint management/tool sync/access control/logs not implemented
🟡 P2❌❌System monitoringServer health/connection count/resource usage/error rate not implemented

Flutter App

PriorityStatusTestItemDescriptionLink
🟠 P1❌❌Shared client protocoldevice identity integration (isomorphic with IoT), WS voice + telemetry + MCP tool surfaceSpec
🟡 P2❌❌USB peripheral telemetryAndroid first (OTG/USB-Host); iOS voice + screen only
🟡 P2❌❌CI/CDiOS/Android build/sign/release pipeline not implemented
🟠 P1❌❌Flutter WS/auth integrationScaffold exists; WS connection and authentication are not wired in

IoT

PriorityStatusTestItemDescriptionLink
🔴 P0✅✅apps/iot skeletoncore/chip/bsp/app four layers; esp32c6 no_std (riscv32imac, no espup/ESP-IDF needed)
🔴 P0⚠️✅core peripheral/capability modulesBoard capability traits (HasLight/HasInput) composition tested; base (network/config/HTTP/OTA) pending P1
🔴 P0✅✅LED appWS2812 RGB LED (GPIO8) + RMT driver; declarative rendering + breathing animation
🔴 P0✅✅Button appBootButton (GPIO9) debounce → Intent → intent bus → state dispatch → render diff
🔴 P0✅—Build/flash tasksmoon check/test/build/flash, artifacts .elf/.bin; espflash in devShell
🔴 P0✅—CI integrationmoon ci builds firmware and uploads artifact
🔴 P0⚠️—CD releaseiot release workflow (tag vanling-iot@x.y.z) publishes; end-to-end not yet tested
🟠 P1❌❌On-device configsoftAP config webpage + peripheral capability enable/disable + config persistence
🟠 P1❌❌Open input (Other Input) + AckJSON/Server commands into intent bus + command Ack (see IOT diagram)
🟠 P1❌❌Telemetry upload ① persistenceHTTP short transactions + device_key, persisted into server store
🟠 P1❌❌Screen displayPaged rendering peripherals (home/config/ota local pages; chat voice-driven)Spec
🟠 P1❌❌Server capability negotiationhello capability set → dynamic pipeline assembly + hot reload
🟠 P1❌❌Telemetry session read ②MCP home_state + device MCP live direct queries
🟠 P1❌❌Status query (Reporter)Query/Response read-only State Manager snapshot (see IOT diagram)
🟠 P1❌❌Server auth tighteningWS accepts device JWT only; telemetry attributed per device
🟠 P1❌❌Server IoT APITelemetry ingestion + device management
🟠 P1⚠️✅Business composition modelbin board manifest move-injects capabilities; product tier = feature alias; criteria in features.md
🟠 P1❌❌Multi-chip port baseFamily split crates iot-chip-<f>/iot-bsp-<f> + main cfg family entry + toolchain/CI matrix
🟡 P2❌❌ESP32-S3 (Szpai) board supportxtensa-esp32s3 target + Szpai szpi-bsp + moon dual-board task + display-HasLight
🟠 P1❌❌First non-esp family migration-stm32 variant: app family alias + entry block + thumbv7em + firmware scoping
🟠 P1❌❌Voice assistant peripheralOpus codec + WS voice client + wake word
🔴 P0✅✅Hardware-free regression smokeHost std harness (intent → state → render behavior assertions) + esp-emu C6 silicon boot smoke, mandatory in CIEmulation & smoke
🟠 P1❌❌On-device validation/regressionespflash flashing + real-device smoke test (boot log/LED/button)
🟠 P1❌—Firmware web installerdocs/static/flasher/ static single page (GitHub Pages): upload bin → client-side parse (magic/ChipID/flash params/CRC/SHA256) → esptool-js WebSerial flash merged.bin to 0x0; real-chip comparison guards against wrong flashing; Chrome/Edge only, with GUI/esptool fallback
🟡 P2❌❌OTA firmware upgradeVersion check/download verification/dual-partition rollback
🟡 P2❌❌MQTT extended telemetryrumqttd broker + QoS/LWT online status + transport negotiation (prefer MQTT, fallback HTTP)
🟡 P2❌❌Reconnect/bufferingRetransmission and message buffering
🔵 P3❌❌SNTP time syncTrustworthy data timestamps
🔵 P3❌❌Low-power/deep sleepLong standby power optimization, after model selection converges
🔵 P3❌❌Watchdog/reset strategyTask watchdog + panic reset recovery strategy

Infrastructure

PriorityStatusTestItemDescriptionLink
🟠 P1✅✅email UNIQUE constraintUNIQUE constraint added to user.email migration (nullable, adapts to existing empty email records)
🔴 P0✅✅Graceful shutdown orderingServer CancellationToken drives axum/WS/Matrix orderly graceful shutdown
🔴 P0✅—Runtime racebuild() runs synchronously; set() happens-before any worker thread; race-free
🟠 P1✅✅Automatic timestamp fillbefore_save added to Config entities; create/update timestamps auto-filled
🟠 P1❌❌Foreign keysMissing FKs for round.session_id, round_data.round_id, frame.round_id
🟠 P1⚠️❌MCP lock orderingThe old mcp_host.rs is gone and the current component takes no cross-instance locks; re-check before reintroducing multi-endpoint aggregation
🔵 P3❌❌MCP error handlingError mapping and retries are incomplete