✨ 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
结论
补齐 #257 未完成的 #235 设备侧闭环:绑定码直接呈现到 OLED 并由系统 TTS 播报,轮询终态会给出确定的成功或重新绑定提示。
Refs #235
变更
BindingResult投递到 Runtime 交互事件循环,避免后台任务直接访问显示或语音硬件。pending显示绑定 <六码>与有效期并只播报一次;already_active恢复显示但不重复播报;confirmed、expired、cancelled、timed_out产生固定终态 OLED/TTS 提示。TDD 与验证
./scripts/run_host_tests.sh -R 'binding_use_case_test|im_binding_mcp_tools_test|binding_presentation_test'(3/3)。./scripts/run_checks.sh(57/57 C++、81 Python,1 skipped)与python3 scripts/firmware.py build esp32s3-voicelife-pcb-pcm。clang-format --dry-run --Werror,并通过git diff --check。check_format.sh仍被main既有的tests/host/timing_runtime_test.cc:201格式问题阻断;该文件未包含在本 PR。剩余验收
真实 PCB/公众号流程、断网恢复以及数据库唯一 active binding 仍需按 #235 第 6 节在真实 Profile 与 Gateway 环境完成,不能由主机 mock 代替。