📝 docs(architecture): 收敛日程、调度与动作模块边界 - #217
Conversation
重新分配日程、调度和动作的实体职责:日程持有周期与例外,调度只持有触发规则和动作触发,动作先固定提醒执行;IM 细节保留给对应负责人补充。 本提交不迁移现有 TimingTask、IM Gateway、存储或运行时接口。 验证:文档模板结构与空白检查通过。 Refs 1024XEngineer#216
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
|
|
||
| | 参数名 | 类型 | 必填 | 约束 | 说明 | | ||
| | --- | --- | --- | --- | --- | | ||
| | event_id | string | 是 | 全局唯一、幂等 | 调度中心事件标识 | |
There was a problem hiding this comment.
The idempotency flow above requires accepting the same event_id only when the content fingerprint also matches, and rejecting mismatched replays. This request schema defines no content fingerprint or canonicalization rule, so an implementation cannot reliably distinguish those cases (especially for the optional context object). Please add an explicit fingerprint field/algorithm or remove that requirement.
|
|
||
| | 参数名 | 类型 | 必填 | 约束 | 说明 | | ||
| | --- | --- | --- | --- | --- | | ||
| | command_id | string | 是 | 非空,幂等 | 动作模块命令标识 | |
There was a problem hiding this comment.
The action-module contract requires sending expires_at and says the scheduler must reject commands outside the strong-reminder interaction window, but this scheduler API has no expires_at (and action_trigger has no equivalent expiry field). As written, the scheduler cannot enforce the documented expiry rule independently. Add the expiry input/storage semantics or clarify that validation is exclusively owned by the action module.
|
@fennoai # 角色设定
你执行交叉校验:文档描述 和 代码/硬件实际设计 是否对齐;文档漏项;设计与业务需求冲突;边界场景缺失;可量产/可落地风险;兼容性隐患;资料前后自相矛盾全部揪出。 强制输出规则
|
Review 结论共 28 条:P0 4 条、P1 15 条、P2 7 条、P3 2 条。P0+P1 共 19 条。以下结论基于固定范围 P0【P0】 【P0】 【P0】 【P0】 P1【P1】文档将 【P1】 【P1】 【P1】文档多处只写 ISO 8601 datetime(如 【P1】 【P1】 【P1】新 【P1】新文档使用 【P1】调度事件契约包含 【P1】强提醒依赖有效窗口( 【P1】动作模块声称负责校验身份( 【P1】所有新增事件和命令都缺少 【P1】日程变更只取消“尚未发布”触发( 【P1】文档支持 【P1】 【P1】动作恢复只写“从记录恢复待处理工作”( 【P1】旧 【P1】 【P1】动作幂等依赖“内容指纹”( P2【P2】 【P2】动作模块声明负责查询执行和命令结果( 【P2】 【P2】 【P2】唯一约束写“最多一条未删除触发”( 【P2】 【P2】两份正式架构文档被放入 P3【P3】“行业调研”只列 Calendar/RFC 链接( 【P3】文档标题直接标记 V2,但仓库没有 V1 链接、废弃声明、生效范围和负责人( 总评Review 整体结论:不通过。 重灾区是:① occurrence 数据来源与稳定身份;② 交付风险总评:高风险。 这两份文档目前只能算讨论草案,不能作为代码迁移、数据库建模或接口联调基线。按现稿推进,会同时产生漏提醒、重复提醒、取消后仍提醒、snooze 无限制、状态无法流转和协议不兼容。 是否允许进入下一阶段:不允许。 先关闭全部 P0,并完成 P1 中的统一契约、迁移矩阵和并发/恢复语义,再进入代码设计或数据迁移。此次 PR 没有硬件 BOM、原理图、PCB、结构件或硬件测试资料,硬件域不做推断性评审。 验证: |
移除调度中心到动作模块的中转,改由 Runner 在提交 Outbox 后直接调用语音提醒与 IM Port。\n\n日程继续拥有 RRULE、时区与例外;调度中心只持有具体 trigger 和可靠投递记录。本文档尚未实现对应代码。\n\nRefs 1024XEngineer#216
结论
建立日程、调度中心和动作三个模块的最小边界文档,供后续代码迁移和契约设计使用。请 Reviewer 重点确认实体所有权和接口是否足够简单,以及动作文档为 IM 模块负责人保留的空白是否合适。
Closes #216
Refs #91
背景
现有 TimingTask 文档同时描述日程周期、任务、实例、提醒规则、提醒触发和下游动作,边界重叠。此次目标是重新分配已有事实并减少中间实体,不在文档阶段引入通用工作流抽象。
改动范围
local/scheduling-center-module.md:日程变更接入、trigger_rule、action_trigger、到期推进、snooze/dismiss 和最小接口。local/action-module.md:提醒action_execution、用户命令和与调度中心的同步协作。timer_task、timer_instance不再复制日程事实;reminder_trigger只在调度与执行边界拆分。明确没有改动:
接口与依赖影响
ExecuteAction、SubmitUserAction和提醒执行历史模型;IM 接口留待补充。测试与构建证据
python3 scripts/check_commit_message.py --range upstream/main..HEAD:通过。git diff --no-index --check:通过。clang-format与仓库锁定 Ruff 0.12.7 的格式/静态检查:通过;源码规模和公共 API 文档检查:通过。./scripts/run_pre_submit_checks.sh未完成:当前机器 Node.js 为 26.5.1,仓库 IM Gateway 门禁要求 Node.js 24;按任务要求不再处理该环境阻塞。文档不引入可编译源码变化。已知风险
action_execution契约对齐。local/原本被.gitignore忽略,本 PR 有意将这两份用户要求的设计文档纳入版本控制。兼容窗口与回退
文档变更不改变运行时行为,兼容窗口为代码迁移完成前的现有 TimingTask/IM Gateway 实现。若边界评审未通过,可整体回退提交
9d68d0b,不涉及数据、协议或部署回退。Review 顺序