✨ feat(timing): 支持提醒规则创建与更新 - #161
Conversation
为提醒规则管理提供原子批量写入,避免逐条保存造成部分更新。 服务校验 weak/strong snooze、日程归属和准点 strong 唯一性;内存 fake 与主机测试覆盖成功、冲突和写入失败路径。 Host、架构、Profile、Python 检查及 Node 24 Gateway CI 已通过;本机缺少 GNU GCC,gcov 覆盖率由 CI 确认。 Closes 1024XEngineer#141
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
I found one issue that can break the rule uniqueness guarantee under concurrent upserts.
Verified locally with cmake -S tests/host -B /tmp/voicelife-host-tests-pr161 && cmake --build /tmp/voicelife-host-tests-pr161 && ctest --test-dir /tmp/voicelife-host-tests-pr161 --output-on-failure.
|
@fennoai 你是资深后端/全栈架构师 + 嵌入式硬件工程师复合型专家,执行严格、客观、不留情面的代码仓库Review,请遵循下面所有评审规则,逐条输出审查结果,禁止敷衍、禁止只说空话、禁止笼统概括。 评审维度
输出要求
现在开始对提供的仓库代码/PR变更、硬件资料、结构模型进行评审 |
严格 Review 结果结论:不建议直接合并到可上机/可接生产 Adapter 的分支。当前 host 用例通过,但 Upsert 语义仍有并发原子性、幂等、资源上限和生产持久化契约缺口。PR 未包含硬件驱动、原理图或结构模型变更,因此硬件专项只能评估 timing 规则对下游语音/硬件执行链路的风险,不能验证引脚、电平或结构干涉。
验证
汇总① 整体仓库风险总结:本 PR 的业务主路径能在 host fake 下工作,但把“规则全局约束”和“并发一致性”留在服务层读写窗口中,进入生产 SQLite/NVS Adapter 后会出现重复强提醒、丢更新、重试重复创建和资源耗尽风险。硬件相关直接代码未改,但提醒系统会驱动语音/设备动作,重复或错误触发会向硬件执行链路放大。 ② 优先级整改清单:先修 Store 原子事务/CAS、upsert 幂等键、snooze/offset/batch/string 上限;再补 channel/source allowlist、disabled rule 行为、持久化后返回值一致性;最后拆分测试并补齐并发、边界、字段映射和 terminated task 用例。 ③ 长期架构与软硬件协同优化方案:把 TimingPolicy 扩展为统一规则策略中心;为 Store Port 定义生产级事务协议和 SQLite 索引;为 Runner/Trigger materialization 定义规则变更后的失效重建机制;在硬件执行入口前增加通道授权和去重保护,保证异常规则不会造成重复语音打断、设备误动作或 flash 写入风暴。 |
服务层基于旧快照校验后写入时,多个并发请求可能绕过准点强提醒唯一性。 Store Port 现在要求在同一原子写入边界复核该不变量;内存 fake 和 Store 合同测试覆盖第二个 writer 被拒绝的场景。 ./scripts/run_checks.sh 已通过。 Refs 1024XEngineer#141
|
Review 复核结论(以 Issue 141 / 父 Issue 137 为准) 我按关联 Issue 141 的验收与范围外,以及父 Issue 137 的模块边界逐项复核。本 PR 只交付
补充:Codecov 报告的 patch coverage 为 85%,高于仓库 80% 门槛,CI 的 coverage gate 已通过;该报告不构成阻塞。另一条仅含 因此,本轮没有发现 |
合入 upstream/main 后,保留 UpsertReminderRules 的验收测试,并保留其余未实现服务接口的 unavailable 回归断言。\n\n完整提交前门禁已通过。\n\nRefs 1024XEngineer#141
主线已包含 UpdateTimerTask 和 CancelTimerTask,本次合并保留两者并恢复 UpsertRules Port、内存 fake、提醒规则服务测试和 Store 原子性测试。\n\n完整提交前门禁已通过。\n\nRefs 1024XEngineer#141
结论
完成 Issue #141:
UpsertReminderRules已支持原子创建与更新提醒规则。请重点评审批量 Store Port 的原子语义、规则冲突边界和 snooze 约束。背景
现有 TimingTask Service 仅为该接口返回
kUnavailable,无法安全地管理用户定义的提醒规则。改动范围
TimingTaskStorePort::UpsertRules,承诺同任务规则批量全成或全败,且不修改已物化的 trigger。DefaultTimingTaskService::UpsertReminderRules:创建分配 ID,更新保留 ID,返回完整规则列表。接口与依赖影响
TimingTaskStorePort增加纯虚UpsertRules;现有内存实现和测试替身已同步实现。TDD 记录
timing_task_service_test中的合法 weak/strong upsert 用例在 stub 的kUnavailable上失败。测试与构建证据
./scripts/run_host_tests.sh -R timing_task_service_test./scripts/run_checks.sh:14 个 Host 测试、公共 API 文档、架构、Profile、Python 检查通过;idf.py build通过。pnpm --dir services/im-gateway run ci通过。已知风险
Issue 未定义 strong snooze 的业务数值上限,因此本提交只拒绝非正次数和间隔;具体最大值应通过独立规格收紧,避免在实现中擅自固化产品策略。
兼容窗口与回退
新 Port 尚无生产 Adapter,实现当前只影响内存 fake 和 Host 测试。若需回退,直接回退本 PR 即可恢复原 stub 行为,无数据迁移或兼容窗口。
Closes #141