Skip to content

time-relative sweep 非幂等:每次扫描对同一记录重复铸行(5s interval 下 70 秒 15 条重复提醒),需要落库幂等键 #10220

Description

@os-zhuang

现象(P1:time-relative 扫描非幂等——每次扫描对同一记录重复铸行)

2026-08-20 rig 实测(objectstack 4389fe932#8362 的重绑修复已验证 OK):contract_expiry_remindertimeRelative:{object:'contract', dateField:'due_date', offsetDays:[3]} → create_record 建提醒)在把 start 节点 schedule 改为 5 秒 interval 后:

  • 第一次扫描:精确命中 T+3 的那份合同,创建 1 条提醒 ✅(匹配语义、模板插值、lookup 全对)
  • 之后每次扫描再铸一条一模一样的:~70 秒内同一份合同累计 15 条重复提醒

扫描本身没有任何"本窗口已处理过该记录"的记忆。5s interval 是放大镜,不是前提——日频 cron 下同样会重复:

  1. kernel 被驱逐重建后当天再次扫描(云环境驱逐是常态:freshness probe ~10s,每次 AI auto-publish 都 bump);
  2. flow 声明了更密的 schedule(spec 允许 start 节点自带 schedule/interval);
  3. 未来若做"错过窗口的 catch-up sweep"(cloud#1288 的方向),没有幂等键就根本不敢做。

对用户可见的后果:提醒列表被同一合同刷屏;若 flow 动作是发通知/邮件则是重复打扰。2026-08-13 的运行同样观察到(16→20 行),当时随 #8362 口头提及、未单独立案。

修复要求

  1. 给 time-relative sweep 引入幂等键:(flowName, recordId, dateField 值所在窗口日, offset) 唯一——已为该键执行过就跳过。落点可以是 sys_automation_run 查询或专用去重表;
  2. 幂等记录要能在 kernel 重建后存活(进程内 Set 不够,必须落库);
  3. 回归测试:同一窗口内连续两次 sweep,断言目标动作只执行一次;kernel 重建后同窗口再 sweep,仍不重复。

关联:#8362(重绑修复,已验证);cloud#1288(云端定时任务架构——catch-up sweep 依赖本 issue)。

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions