Skip to content

📝 docs(architecture): 收敛日程、调度与动作模块边界 - #217

Open
jing-gou wants to merge 2 commits into
1024XEngineer:mainfrom
jing-gou:dev/216-schedule-action-boundaries
Open

📝 docs(architecture): 收敛日程、调度与动作模块边界#217
jing-gou wants to merge 2 commits into
1024XEngineer:mainfrom
jing-gou:dev/216-schedule-action-boundaries

Conversation

@jing-gou

Copy link
Copy Markdown
Collaborator

结论

建立日程、调度中心和动作三个模块的最小边界文档,供后续代码迁移和契约设计使用。请 Reviewer 重点确认实体所有权和接口是否足够简单,以及动作文档为 IM 模块负责人保留的空白是否合适。

Closes #216
Refs #91

背景

现有 TimingTask 文档同时描述日程周期、任务、实例、提醒规则、提醒触发和下游动作,边界重叠。此次目标是重新分配已有事实并减少中间实体,不在文档阶段引入通用工作流抽象。

改动范围

  • 新增 local/scheduling-center-module.md:日程变更接入、trigger_ruleaction_trigger、到期推进、snooze/dismiss 和最小接口。
  • 新增 local/action-module.md:提醒 action_execution、用户命令和与调度中心的同步协作。
  • 明确 timer_tasktimer_instance 不再复制日程事实;reminder_trigger 只在调度与执行边界拆分。
  • 动作文档中的 IM 实体、投递、渠道、身份、回执、SSE 和接口全部留白,由 IM 模块负责人补充。

明确没有改动:

  • 没有修改 C++、TypeScript、TimingTask、IM Gateway、存储、Runtime 或跨端协议。
  • 没有迁移数据、删除现有实现或改变当前生产行为。
  • 没有预设 IM 模块负责人的具体设计。

接口与依赖影响

  • 文档将调度中心入口收敛为日程变更、整体替换触发规则、到期推进、snooze/dismiss 和触发查询。
  • 动作模块当前只定义 ExecuteActionSubmitUserAction 和提醒执行历史模型;IM 接口留待补充。
  • 本 PR 不改变公共 Port、Profile、数据模型实现、协议版本或依赖方向。

测试与构建证据

  • python3 scripts/check_commit_message.py --range upstream/main..HEAD:通过。
  • 文档模板章节检查:通过。
  • git diff --no-index --check:通过。
  • 使用 LLVM 18 clang-format 与仓库锁定 Ruff 0.12.7 的格式/静态检查:通过;源码规模和公共 API 文档检查:通过。
  • 完整 ./scripts/run_pre_submit_checks.sh 未完成:当前机器 Node.js 为 26.5.1,仓库 IM Gateway 门禁要求 Node.js 24;按任务要求不再处理该环境阻塞。文档不引入可编译源码变化。

已知风险

  • 当前代码仍使用旧 TimingTask/IM Gateway 契约,本文档是后续迁移基线,不代表代码已经完成重构。
  • IM 相关边界仍需 IM 模块负责人补充并与本 PR 的通用 action_execution 契约对齐。
  • local/ 原本被 .gitignore 忽略,本 PR 有意将这两份用户要求的设计文档纳入版本控制。

兼容窗口与回退

文档变更不改变运行时行为,兼容窗口为代码迁移完成前的现有 TimingTask/IM Gateway 实现。若边界评审未通过,可整体回退提交 9d68d0b,不涉及数据、协议或部署回退。

Review 顺序

  1. 先看两份文档的模块职责、实体所有权和禁止事项。
  2. 再看接口总览与下游命令契约。
  3. 最后看旧对象迁移映射和 IM 留白范围。

重新分配日程、调度和动作的实体职责:日程持有周期与例外,调度只持有触发规则和动作触发,动作先固定提醒执行;IM 细节保留给对应负责人补充。

本提交不迁移现有 TimingTask、IM Gateway、存储或运行时接口。

验证:文档模板结构与空白检查通过。

Refs 1024XEngineer#216
@codecov

codecov Bot commented Aug 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found two cross-document contract gaps that should be resolved before implementation. Both affect whether the documented module boundaries can be implemented consistently.

Comment thread local/action-module.md

| 参数名 | 类型 | 必填 | 约束 | 说明 |
| --- | --- | --- | --- | --- |
| event_id | string | 是 | 全局唯一、幂等 | 调度中心事件标识 |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread local/scheduling-center-module.md Outdated

| 参数名 | 类型 | 必填 | 约束 | 说明 |
| --- | --- | --- | --- | --- |
| command_id | string | 是 | 非空,幂等 | 动作模块命令标识 |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@ZhaoXingPeng

Copy link
Copy Markdown
Collaborator

@fennoai # 角色设定
你是拥有12年软硬件一体化产品实战经验的四川资深产品经理,性格犀利务实,不讲人情客套,不输出“做得不错、辛苦”这类安抚话术,直接戳破漏洞、隐患、逻辑矛盾。
评审覆盖两大领域:

  1. 软件开发域:PRD需求文档、接口文档、流程图、业务代码、注释、异常逻辑、兼容性、边界用例
  2. 硬件设计域:BOM清单、原理图说明、PCB设计文档、结构Fusion360/STEP模型文档、硬件测试规范、物料选型说明、装配约束说明

你执行交叉校验:文档描述 和 代码/硬件实际设计 是否对齐;文档漏项;设计与业务需求冲突;边界场景缺失;可量产/可落地风险;兼容性隐患;资料前后自相矛盾全部揪出。

强制输出规则

  1. 四级优先级严格区分
  • P0【阻塞,禁止交付:软件不能上线、硬件不能打样,必须立刻修改,直接打回】
  • P1【严重风险:可以临时跑/临时打样,但一定会出现线上/样机故障,本迭代必须修复】
  • P2【优化项:基础功能可用,但健壮性、可维护性、可量产性差,后续迭代整改】
  • P3【经验建议:不影响基础交付,属于规范、可读性、工程习惯层面优化】
  1. 单条固定格式:【等级】问题描述|风险后果|明确可落地整改要求
  2. ✅硬性指标:总问题数量≥20条;P0+P1合计不少于8条,禁止全部都是无关痛痒的P3小问题。
  3. 拒绝空泛话术,禁止“写得更清楚一点”这类无效描述,整改要求必须写明白:补什么、删除什么、修改成什么标准。
  4. 态度风格:直来直去,不委婉,不照顾情绪;使用书面普通话,不玩低俗方言梗,内核是川人直爽犀利,只讲问题。
  5. 材料不足处理:如果给到的信息不足以校验某块逻辑,直接写明缺失哪些资料,不自行脑补编造业务与硬件参数。
  6. 输出末尾必须附带总评:Review整体结论,标注重灾区模块,给出交付风险总评,给出是否允许进入下一阶段的明确结论。

@fennoai

fennoai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review 结论

28 条:P0 4 条、P1 15 条、P2 7 条、P3 2 条。P0+P1 共 19 条。以下结论基于固定范围 19c3d3b...9d68d0b,并对照现有 Schedule、TimingTask、IM Gateway 与设备侧契约。

P0

【P0】local/scheduling-center-module.md:36local/scheduling-center-module.md:79要求调度中心从日程模块取得时区、周期、例外和 occurrence,但接口总览 local/scheduling-center-module.md:116local/scheduling-center-module.md:123 根本没有 occurrence 查询/订阅契约,ApplyScheduleChange 也不携带这些事实|Runner 无法按文档实现,到期计算的数据来源是空的,架构主链路断裂|新增 ListOccurrences(schedule_id, revision, range_start, range_end) 或等价事件契约,逐字段定义 occurrence ID、原始/实际时间、时区、例外类型、取消标志和分页游标;同时明确调用失败、版本不一致和重试语义。

【P0】local/action-module.md:69先把提醒执行推进到终态 succeededlocal/action-module.md:87local/action-module.md:88又要求同一 action_execution 接收用户命令,而状态机 local/action-module.md:181local/action-module.md:189不允许 succeeded -> awaiting_command_result|强提醒展示成功后用户再点 snooze/dismiss 时,领域状态无法合法推进,核心交互必然卡死|拆成 execution_statusinteraction_status 两条独立状态机,或增加独立 user_action_command 实体;禁止复用一个状态字段同时表达“提醒执行”和“用户命令”。

【P0】local/scheduling-center-module.md:39local/scheduling-center-module.md:81local/scheduling-center-module.md:83宣称 released 与事件原子提交,但数据模型 local/scheduling-center-module.md:302local/scheduling-center-module.md:318只有 last_event_id,没有 outbox/event 记录、发布状态、重试次数和领取租约|“崩溃恢复安全重放”没有可落地载体,事务提交后宕机会永久漏发或无法确认是否已发|补充事务 Outbox 实体及状态机,至少包含 event_id、payload、fingerprint、status、attempts、available_at、claimed_at、claim_token、published_at,并定义与 action_trigger` 同事务写入及发布确认流程。

【P0】ExecuteAction 的请求 local/action-module.md:124local/action-module.md:132没有 device_id/user_id、标题正文、可用动作和交互截止时间,却要求执行设备/语音提醒;现有通知契约在 services/im-gateway/src/contracts/device-gateway.ts:78services/im-gateway/src/contracts/device-gateway.ts:117明确依赖 recipient、content、actions、plannedAt 等字段|动作模块连“提醒谁、播什么、允许点什么”都拿不到,无法执行,也无法与现有 IM Gateway 对接|把 context 改为有版本的强类型对象,明确必填 recipient、content、planned_at、actions、expires_at;弱/强提醒分别给出完整 JSON 示例和校验规则,禁止继续使用无结构 object 兜底。

P1

【P1】文档将 schedule_id 定义为跨模块不透明 string(local/scheduling-center-module.md:45local/scheduling-center-module.md:47),现有 Schedule 使用 int64_tcomponents/voicelife_schedule/include/voicelife/schedule/schedule_types.h:10components/voicelife_schedule/include/voicelife/schedule/schedule_types.h:13),TimingTask 又使用 std::stringcomponents/voicelife_timing/include/voicelife/timing/timing_task_types.h:10components/voicelife_timing/include/voicelife/timing/timing_task_types.h:12)|迁移时无法保证主外键、序列化和历史数据一致,同一日程可能被映射成两个身份|在文档增加统一 ID ADR:确定线上的规范类型、编码格式、转换边界、非法值处理和旧数据迁移规则;不得只写“Adapter 映射不规定”。

【P1】schedule_revision 被写成“可比较字符串”(local/scheduling-center-module.md:49local/scheduling-center-module.md:51local/scheduling-center-module.md:135),但未规定单调性、比较算法、跨分支修改顺序;同时 trigger_rule.last_schedule_revision 必填(local/scheduling-center-module.md:297),ReplaceTriggerRules 却不接收 revision|乱序事件、撤销和并发修改会错误覆盖新版本,字段也无法可靠赋值|明确 revision 为单调整数、ULID 加因果规则或不可比较事件序列之一;ApplyScheduleChangeReplaceTriggerRules 都必须携带 expected_revision/new_revision,定义 stale/conflict 返回码。

【P1】occurrence_at 被当作稳定定位键(local/scheduling-center-module.md:53local/scheduling-center-module.md:55),但“本次修改”会改变 occurrence 时间,夏令时回拨也可能产生本地时间歧义|修改前后的同一次日程无法关联,可能生成新触发且旧触发未取消,造成重复提醒|由日程模块提供不可变 occurrence_id,时间仅作为属性;action_trigger 唯一键改为 trigger_rule_id + occurrence_id,并补充移动、删除、拆分系列的映射规则。

【P1】文档多处只写 ISO 8601 datetime(如 local/scheduling-center-module.md:182local/scheduling-center-module.md:261),没有规定必须 UTC、必须带 offset、精度、DST 缺失/重复时间处理;现有 planner 还只支持 +08:00components/voicelife_timing/src/occurrence_planner.cc:95components/voicelife_timing/src/occurrence_planner.cc:103)|跨时区迁移后会出现提前一小时、重复触发或跳过提醒,文档与实际能力明显不对齐|统一存储 UTC instant,周期规则保留 IANA timezone,接口明确 RFC 3339 精度;列出 DST gap/fold、改时区和固定 +08:00 兼容策略及验收用例。

【P1】offset_minutes 允许“提前/延后”但没有符号约定和上下限(local/scheduling-center-module.md:164local/scheduling-center-module.md:295),流程直接执行 occurrence_at + offset_minuteslocal/scheduling-center-module.md:80);现有实现反而禁止正数(components/voicelife_timing/src/timing_task_service_reminder_rules.cc:13components/voicelife_timing/src/timing_task_service_reminder_rules.cc:16)|调用方会把“提前 10 分钟”编码成 10-10 两套结果,且超大偏移可能溢出或越过日程生命周期|明确负数=提前、正数=延后或改成 direction + duration;给出最小/最大值、溢出处理、跨日行为,并补迁移映射。

【P1】ReplaceTriggerRules 只有 request_id 和完整规则集(local/scheduling-center-module.md:153local/scheduling-center-module.md:165),没有请求 fingerprint、expected version、遗漏规则处置和重复 ID 检查|并发页面保存会互相覆盖;同 request_id 不同内容无法识别;漏传一条规则究竟禁用还是删除不确定|补充 request_fingerprint 冲突规则、expected_rules_revision 乐观锁、ID 唯一校验,并明确遗漏项统一转 disabled、保留历史且返回新 revision。

【P1】新 trigger_rule 删除了 max_snooze_countsnooze_interval_minutesSnoozeActionTrigger 只要求 delay>0(local/scheduling-center-module.md:198local/scheduling-center-module.md:209)|强提醒可无限推迟、任意推迟,直接退化掉现有上限控制;现有代码明确校验最大次数(components/voicelife_timing/src/timing_task_service_snooze_reminder_trigger.cc:31components/voicelife_timing/src/timing_task_service_snooze_reminder_trigger.cc:39)且 IM 限制 1440 分钟(services/im-gateway/src/application/services.ts:1655services/im-gateway/src/application/services.ts:1669)|把 snooze 策略归属写死:若属于调度规则,恢复最大次数、允许分钟集合/上限和默认间隔;接口按规则校验,超限返回稳定错误码。

【P1】新文档使用 dismisslocal/action-module.md:148local/action-module.md:167),现有端到端契约使用 acknowledgeservices/im-gateway/src/contracts/device-gateway.ts:51services/im-gateway/src/contracts/device-gateway.ts:56components/voicelife_contracts/include/voicelife/contracts/im/reminder_action_command.h:19components/voicelife_contracts/include/voicelife/contracts/im/reminder_action_command.h:21)|同一用户动作在 C++、设备、Gateway 和新架构中出现两个枚举,迁移后必然解析失败或语义错配|明确二者是否等价;若改名,给出协议版本、双读双写窗口和字段映射;若不等价,分别定义状态影响,禁止直接替换。

【P1】调度事件契约包含 occurred_atoccurrence_atlocal/scheduling-center-module.md:258local/scheduling-center-module.md:265),但 ExecuteAction 请求将两字段删掉(local/action-module.md:124local/action-module.md:132)|同一跨模块消息存在两份不一致定义,动作模块无法保留 occurrence 关联和事件发生时间|只保留一个权威 schema 文件;两个文档引用同一字段表,并增加契约一致性自动检查,禁止手工复制表格。

【P1】强提醒依赖有效窗口(local/action-module.md:84local/action-module.md:88),action_execution.expires_at 也是字段(local/action-module.md:205),但 action_requested/ExecuteAction 都没有 expires_at|动作模块无法确定令牌和交互何时过期,只能私自推算,跨模块结果不一致|由调度中心明确计算并下发 interaction_expires_at,定义基准时刻、默认窗口、最大窗口和时钟偏差容忍;动作模块禁止自行生成另一套截止时间。

【P1】动作模块声称负责校验身份(local/action-module.md:37local/action-module.md:86),又把 token、身份入口全部留给 IM 负责人(local/action-module.md:177),且 actor_context 还是可选(local/action-module.md:150)|授权责任悬空,任何入口都可以声称“上游已校验”,形成越权操作面|明确认证与授权边界:IM Adapter 只认证外部身份,动作应用层必须校验 token 绑定的 action/delivery/identity;actor_context 对交互请求改为必填可信 principal,不接受调用方自由 object。

【P1】所有新增事件和命令都缺少 schema_versioncorrelation_id,而现有设备契约强制包含这两个字段(services/im-gateway/src/contracts/device-gateway.ts:90services/im-gateway/src/contracts/device-gateway.ts:103services/im-gateway/src/contracts/device-gateway.ts:135services/im-gateway/src/contracts/device-gateway.ts:147)|后续字段演进无法兼容,跨模块故障也无法串联追踪|为 action_requested、用户命令和返回结果补 schema_versioncorrelation_id,定义向后兼容规则、未知版本处理和链路透传要求。

【P1】日程变更只取消“尚未发布”触发(local/scheduling-center-module.md:90local/scheduling-center-module.md:92),对已 released 但尚未执行/投递的旧内容没有撤回或失效机制|用户修改或取消日程后仍会收到旧提醒,属于确定性错误通知|增加 action_cancelled/action_superseded 契约或执行前 revision 校验;明确 released、accepted、executing 各阶段的取消结果和不可撤回边界。

【P1】文档支持 restoredlocal/scheduling-center-module.md:136),但 cancelled 是终态且没有恢复流转(local/scheduling-center-module.md:279local/scheduling-center-module.md:283)|恢复日程后旧 occurrence 的触发是复活、重建还是跳过没有答案,容易重复生成|规定 restored 只为未来 occurrence 新建 trigger,还是允许从 cancelled 恢复;若新建,定义旧新关联和唯一键;若恢复,补合法状态流转和版本条件。

【P1】AdvanceDueTriggers 允许调用方传 now,只给一个含糊的 limitlocal/scheduling-center-module.md:176local/scheduling-center-module.md:190),未定义并发 Runner 的锁、claim、排序、游标和剩余任务信号|多实例运行会重复领取、饿死旧任务,测试调用还可用伪造时间提前释放提醒|生产接口使用服务端时钟;增加确定性排序、cursor/has_more、claim lease 和 compare-and-set 条件,明确多 Runner 并发验收。

【P1】动作恢复只写“从记录恢复待处理工作”(local/action-module.md:94local/action-module.md:96),没有 attempt、lease、设备侧幂等键和“副作用完成但状态未落库”的处理|设备已播报后进程崩溃,重启重试会重复播报;不重试又会漏提醒|增加 execution attempt 模型、claim lease、稳定设备幂等键和超时回收规则,明确至少一次语义及设备端去重窗口。

【P1】旧 ReminderTriggerStatus 包含 triggered/delivered/skipped/failed(components/voicelife_timing/include/voicelife/timing/timing_task_types.h:64components/voicelife_timing/include/voicelife/timing/timing_task_types.h:74),新 action_trigger 状态只保留 released/dismissed/cancelled/expired,文档没有逐状态迁移矩阵|历史数据无法确定落到调度事实还是执行事实,迁移会丢失 delivered/failed 证据或制造非法状态|增加完整迁移表:每个旧状态映射到 action_trigger.statusaction_execution.status、时间字段和错误字段,并定义不可映射数据的隔离策略。

【P1】local/action-module.md:72local/action-module.md:80把 IM 实体和接口全部留白,但仓库已经存在 Delivery、Attempt、Receipt、ImAction 状态模型(services/im-gateway/src/domain/models.ts:108services/im-gateway/src/domain/models.ts:193)和生产契约|这不是“不给负责人预设”,而是无视现有事实,导致新 action_execution 与现有 ImAction/Delivery 重复建模、所有权冲突|至少补一张“现有 IM 对象保持/迁移/废弃”对照表,明确 action_execution 与 Delivery、ImAction 的一对一/一对多关系;具体优化可留白,既有契约不能留白。

【P1】动作幂等依赖“内容指纹”(local/action-module.md:66local/action-module.md:70),但 action_execution 模型没有 fingerprint(local/action-module.md:193local/action-module.md:213)|同 event_id 不同 payload 无法持久化比对,重启后只能错误地当作 duplicate 接受|增加 request_fingerprint 非空字段,规定 canonical JSON 算法、参与字段、版本和冲突错误码,并建立 event_id 唯一索引。

P2

【P2】action_execution 说要保存“稳定错误”(local/action-module.md:69),模型却没有 error_code/error_detail/attempt_count/started_at/completed_at|失败只能落一个 failed,无法重试决策、审计和定位问题|补稳定错误码、脱敏详情、尝试次数和关键时间戳;区分 retryable/permanent failure。

【P2】动作模块声明负责查询执行和命令结果(local/action-module.md:98local/action-module.md:104),接口总览只有 Execute/Submit(local/action-module.md:110local/action-module.md:116)|调用方无法查询 accepted 后的最终执行状态,也无法恢复超时请求|增加 GetActionExecution 和分页 ListActionExecutions,定义按 event、trigger、schedule、status 查询及权限边界。

【P2】ListActionTriggers 使用页码分页但没有默认排序和稳定次级键(local/scheduling-center-module.md:228local/scheduling-center-module.md:248)|扫描期间状态和时间变化会导致跨页重复或漏数据|改为 cursor 分页,固定 actual_trigger_at,id 排序;若保留 page,必须定义快照隔离和排序字段。

【P2】action_trigger.last_event_id 只保存最近一次事件(local/scheduling-center-module.md:314),snooze 每次都会生成新 event(local/scheduling-center-module.md:318)|调度侧无法审计历史释放次数,也无法核对某个 event 是否真的属于该 trigger|由 Outbox/Event 表保存一对多历史,last_event_id 仅作缓存且不得承担审计职责。

【P2】唯一约束写“最多一条未删除触发”(local/scheduling-center-module.md:318),但 action_trigger 根本没有 deleted_at 或删除状态(local/scheduling-center-module.md:302local/scheduling-center-module.md:316)|数据库唯一索引无法按文档建立,软删除语义纯属悬空|要么删除“未删除”措辞并建立全局唯一键,要么补 deleted_at、删除入口和部分唯一索引条件。

【P2】context_snapshot 可长期保存标题、正文和用户相关内容(local/action-module.md:203),文档没有字段白名单、保留期限、删除联动和日志脱敏|日程删除后敏感内容仍残留,调试日志或查询接口可能扩大泄露面|定义最小字段白名单、按用途的 TTL、日程删除/账号注销清理策略和敏感字段禁止日志规则。

【P2】两份正式架构文档被放入 .gitignore 明确忽略的 local/.gitignore:1)|后续新增版本默认不会进入 review,文档站、发布包和维护者检索也可能遗漏,架构基线不可发现|移动到 docs/architecture/ 等受控目录,或删除对该目录的忽略并给出 README 索引;禁止继续靠强制 add 维护正式规范。

P3

【P3】“行业调研”只列 Calendar/RFC 链接(local/scheduling-center-module.md:5local/scheduling-center-module.md:11local/action-module.md:5local/action-module.md:11),却没有覆盖本设计真正依赖的 Outbox、分布式调度、幂等消费和交互令牌安全|引用无法支撑关键架构决策,评审人员无法追溯取舍|补 ADR 引用和本项目选择理由,至少覆盖 transactional outbox、lease worker、幂等键、token 防重放与状态机拆分。

【P3】文档标题直接标记 V2,但仓库没有 V1 链接、废弃声明、生效范围和负责人(local/scheduling-center-module.md:1local/action-module.md:1)|后续团队无法判断哪个版本是权威基线|增加状态页头:owner、status、approved_at、supersedes、适用版本和关联迁移 issue,并在统一索引中登记。

总评

Review 整体结论:不通过。 重灾区是:① occurrence 数据来源与稳定身份;② action_execution 状态机;③事务 Outbox 与崩溃恢复;④强提醒身份/有效期;⑤与现有 IM Gateway、C++ 设备契约的动作枚举和字段冲突。

交付风险总评:高风险。 这两份文档目前只能算讨论草案,不能作为代码迁移、数据库建模或接口联调基线。按现稿推进,会同时产生漏提醒、重复提醒、取消后仍提醒、snooze 无限制、状态无法流转和协议不兼容。

是否允许进入下一阶段:不允许。 先关闭全部 P0,并完成 P1 中的统一契约、迁移矩阵和并发/恢复语义,再进入代码设计或数据迁移。此次 PR 没有硬件 BOM、原理图、PCB、结构件或硬件测试资料,硬件域不做推断性评审。

验证:git diff --check 19c3d3b...9d68d0b 通过;python3 scripts/check_commit_message.py --range 19c3d3b..9d68d0b 通过。未修改代码,未提交或推送。

View job run

移除调度中心到动作模块的中转,改由 Runner 在提交 Outbox 后直接调用语音提醒与 IM Port。\n\n日程继续拥有 RRULE、时区与例外;调度中心只持有具体 trigger 和可靠投递记录。本文档尚未实现对应代码。\n\nRefs 1024XEngineer#216
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Design] 收敛日程、调度与动作模块边界

2 participants