✨ feat(im): 完成设备端微信绑定呈现闭环 - #262
Conversation
绑定结果通过 Runtime 事件循环驱动 OLED 与系统播报;待绑定码在普通语音回合结束后恢复,confirmed/expired/cancelled 产生确定的终态提示。为 origin 或凭据重绑增加单调代次隔离,迟到结果不会覆盖新配置。 重启采用“明确重新开始”策略:不恢复本地待绑定会话,下一次语音命令创建新的会话。 绑定主机测试、完整 run_checks 及 VoiceLife PCB 固件构建已通过;全仓格式检查仍被 main 已有的 timing_runtime_test.cc 格式问题阻断。 Refs 1024XEngineer#235
GCC 的 -Werror=missing-field-initializers 要求 BindingResult fixture 显式初始化新增的 message 字段;补齐空值以恢复上游主机测试与覆盖率构建。 binding_presentation_test 已通过。 Refs 1024XEngineer#235
你的身份你是一名从业12年的四川资深产品经理,深耕硬件配套软件、嵌入式后台、业务系统产品,说话川式直白犀利,绝不留情面,不委婉客套,不照顾情绪,只讲问题、风险、必须改成啥样。 本次输出硬性规则
我会给你输入材料接下来我会粘贴:PRD/需求文档片段、接口文档、业务代码片段。 |
Review 结论这次不是“补齐展示”这么简单,代码确实把绑定码送到了 Runtime,但闭环里还有多处断点:重复命令不恢复、创建失败不反馈、轮询任务可能永久失活、终态可能静默、TTS 文本会被截断,真机上线后用户会遇到“屏幕看到了但没播报”“已经在绑定但屏幕没有码”“一直显示等待但后台早就不轮询了”等问题。
P0【阻塞:不能上线,必须立刻改,不改直接打回】【P0】缺少 #235 第 6 节真实验收条款、Gateway 唯一 active binding 约束、断网恢复规则和硬件显示/播报限制,当前 PR 只能证明 host mock 能跑,不能证明设备闭环符合需求|风险后果|真实公众号绑定、重启、断网、重复 active、OLED 溢出和 TTS 失败路径都无法验收,禁止把“3 个 host 测试通过”当成上线依据|明确整改要求|补齐 PRD/接口文档和真实 Profile/Gateway/PCB 验收记录,至少给出状态矩阵、重启策略、断网策略、服务端取消语义、OLED 每行字节限制和 TTS 最大文本长度,并逐项绑定到测试用例 【P0】代码没有覆盖“创建失败/凭据拒绝/Runtime 未 ready”的设备反馈闭环,MCP 回调只在 【P0】轮询任务创建失败后只把 【P0】 P1【严重:可以临时跑,但线上必出事故,本轮迭代必须修复】【P1】重复调用 【P1】后台终态 【P1】 【P1】 【P1】 【P1】终态到达普通对话期间, 【P1】有界事件队列采用“满了丢最旧”,绑定结果、重绑清理事件和普通交互事件共用同一队列,没有消息优先级或关键事件保留机制|风险后果|高负载下可能先丢 【P1】重绑清理依赖 【P1】 【P1】终态播报只保存一个 【P1】绑定终态触发 【P1】 【P1】 P2【优化:功能能跑,但业务逻辑/健壮性/可维护性差,后续版本要整改】【P2】MCP 输出固定使用 【P2】 【P2】 【P2】新增测试主要覆盖纯函数映射和 【P2】绑定轮询任务在 【P2】 【P2】轮询状态 【P2】MCP schema、 P3【建议:不影响运行,属于经验、规范、可读性层面优化】【P3】事件队列入队逻辑在 【P3】 【P3】PR 描述写了“只播报一次”,但代码没有显式的播报幂等键,当前只是依赖轮询任务退出和 验证结果
整体结论重灾区有三个:MCP 结果没有完整投递、轮询任务生命周期有竞态、TTS/事件队列不是可靠交付。这会直接造成绑定码显示与后台状态脱节、终态静默、成功/失败播报丢失,以及新会话永远不轮询。当前结论:打回,先修 P0/P1,再做真实 Gateway + PCB 闭环验收;host 侧 3 个测试通过不足以证明可上线。 |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
所有 Start 结果都投递设备呈现;失败、凭据拒绝与会话不存在不再只停留在 MCP 返回。轮询任务使用代次租约接管新会话,创建失败会终止本地 pending 并反馈失败,避免旧任务退出吞掉新的轮询请求。 终态在普通对话期间延后到待机时一并显示和播报;固定绑定话术使用明确容量契约,系统播报队列满时保留待播内容。 TDD 覆盖结果投递、失败映射、任务失败恢复、轮询代次交接与话术容量。run_checks、VoiceLife PCB 固件构建通过。 Refs 1024XEngineer#235
绑定创建可能超过 MCP 原有的三秒等待,导致会话已经创建,设备却先向上层报告失败。 统一十秒 HTTP 请求预算,并为 MCP 响应增加两秒调度余量,防止成功副作用与失败提示并存。 验证:mcp_worker_policy_test、绑定相关主机测试及 ESP32-S3 实机绑定流程通过。 Refs 1024XEngineer#235
绑定工具此前被通用 MCP 呈现误判为日程操作,短暂覆盖真实绑定码并显示错误业务文案。 为绑定工具生成受控摘要并在 Runtime 跳过通用浮层,未知工具则回退为中性操作文案。 验证:linx_mcp_bridge_test、绑定相关主机测试及实机绑定码页面通过。 Refs 1024XEngineer#235
通用 TTS 收尾会自动进入 follow-up 聆听,导致绑定码播报后页面被“聆听中”覆盖十余秒。 将活跃回合中的绑定码结果标记为终结型回复,播报结束直接回待机恢复绑定页,同时取消延迟重复播报;普通问答仍保留连续聆听。 验证:voice_interaction_controller_test、binding_presentation_test 及 ESP32-S3 实机完整绑定流程通过。 Refs 1024XEngineer#235
PCB Assembly 的 Start 先前沿用空实现,显示端口虽能接收快照,却没有初始化真实面板。 将 SSD1306 初始化接入平台启动生命周期,并通过可注入函数覆盖成功和失败传播。 验证:platform_assembly_test 与 ESP32-S3 固件构建通过。 Refs 1024XEngineer#235
默认 16 KiB 上限无法容纳较长的下行控制或文本帧,分片重组会提前拒绝合法消息。 将受控消息上限提高到 64 KiB,并用传输契约测试锁定默认容量。 Refs 1024XEngineer#235
语音与 Wi-Fi 并发后内部堆容易碎片化,TLS 的 16 KiB 接收片段可能无法连续分配。 使用 mbedTLS 默认内存策略,使大缓冲可利用已启用的 PSRAM,降低 HTTPS 建连失败概率。 Refs 1024XEngineer#235
“收到!”依赖后续语音事件覆盖,服务端短暂无事件时会永久停留在 OLED。 由交互事件循环消费显示租约,到期后主动清空确认文本并恢复聆听状态。 Refs 1024XEngineer#235
本地 VAD 可能因实机底噪错过静音端点,旧逻辑会在聆听超时时直接中止并丢弃已采集语音。 将超时路径转入 finalizing,发送 listen.stop 并等待最终 STT,再由有界超时收尾。 Refs 1024XEngineer#235
实机绑定与语音并发问题缺少内部堆碎片证据,难以区分总量不足和最大连续块不足。 在语音证据与 IM HTTP 初始化/失败边界记录内部堆、最大连续块和 PSRAM 余量。 Refs 1024XEngineer#235
绑定终态此前依赖后续语音事件清理,TTS 异常时会使成功或失败提示永久停留;直接清理又会错误回到待机。 为终态呈现增加 3 秒独立租约,成功到期后清空提示并启动采集,其他终态恢复待机;普通交互仍可立即接管显示。 主机测试 59/59、ESP32-S3 构建与实机绑定流程通过。 Refs 1024XEngineer#235
结论
补齐 #257 未完成的 #235 设备侧闭环,并完成真实 PCB/微信公众号验证:绑定码能够稳定创建、显示和播报,公众号确认后设备显示“绑定成功”;慢请求不再先报失败,绑定播报结束也不会进入无意义的 follow-up 聆听。
Closes #235
变更
BindingResult投递到 Runtime 交互事件循环;用 generation 隔离重绑后的迟到结果。pending显示并播报同一六码,already_active恢复但不重复播报,终态给出固定 OLED/TTS 提示。im.binding.start提供独立工具语义,禁止通用“日程操作已完成”浮层覆盖绑定码。TDD 与验证
mcp_worker_policy_test、linx_mcp_bridge_test、binding_presentation_test、voice_interaction_controller_test、platform_assembly_test和 Linx 传输契约。./scripts/run_pre_submit_checks.sh:cmake --build build/esp32s3-voicelife-pcb-pcm -j2通过,固件已烧录至 ESP32-S3 并校验成功。真机证据
MCP_REQUEST_REJECTED timeout。IM_BINDING_TOOL_OVERLAY_SUPPRESSED=1,未再显示“日程操作已完成”。绑定 582006页面,中间没有进入“聆听中”。IM_BINDING_STATUS=confirmed,设备显示“绑定成功”。风险与后续