Skip to content

activities.mdx 三语把「合同结束前 60 天的续约提醒」当成重复任务的用例:既不是 60 天(按合同自己的 renewal_notice_days,默认 30),也不是重复任务 #883

Closed

Description

@yinlianghui

来源:实施 #871(quotes 页接受链路)时按「同一句 60 天说法是否还写在别处」全仓 grep 的顺带发现。#871 只改 content/docs/sales/quotes.mdx 三语,本条落在另一页,不在那个 PR 的范围内。

文件面

content/docs/sales/activities.mdx:73 + activities.zh-Hans.mdx:73 + activities.zh-Hant.mdx:73(三语同款),在 ## Recurring tasks / 重复任务一节的「用例」列表里:

- *Renewal reminder 60 days before contract end* — set automatically by the contract flow.
- *合同结束前 60 天的续约提醒*——由合同流程自动设置。
- *合約結束前 60 天的續約提醒*——由合約流程自動設定。

同一节的另外两个用例(季度回访、每日站会)都是真的重复任务,所以这一条读起来就是「系统会替你排一条 60 天的重复续约提醒」。

与源码的两处不符

1. 不是 60 天。 写死 60 天的那条激活期任务已经从 src/objects/contract.hook.ts 删掉了,原因写在 contract.hook.ts:121-124 的注释里。今天排续约提醒的是 contract_renewal 定时 flow(src/flows/contract-renewal.flow.ts),它每天 08:00 扫一次,只看 status: 'activated' 的合同(:48),窗口取每份合同自己的 renewal_notice_days——src/objects/contract.object.ts:157-162,defaultValue: 30,逐份可设,判定在出边 b1 上:

timestamp(vars.currentContract.end_date + "T00:00:00Z") <= daysFromNow(int(vars.currentContract.renewal_notice_days))

2. 不是重复任务。 flow 的 create_renewal_task 节点(contract-renewal.flow.ts:86-98)写的字段只有 subject / type: 'follow_up' / priority: 'high' / status: 'not_started' / due_date / owner_id / related_to_type / related_to_account——没有任何重复相关字段。它每天重新出现的机制也不是 recurrence,而是扫描 + 幂等闸门:只要该合同还挂着一条未完成的 Renewal due: contract … 任务,当天就算已处理(find_existing_task + 出边 b3);把它标记完成,只要合同仍在窗口内,第二天早上会新建另一条任务。这与「完成当前实例后系统生成下一个实例、直到重复结束日期」是两套完全不同的东西——把它放进重复任务的用例列表,读者会去合同或任务上找那个并不存在的 recurrence 设置。

影响

读者按这页设定预期:合同到期前 60 天会有一条重复的续约提醒。实际窗口默认是 30 天且逐份合同可调,且只对已激活的合同成立(草稿合同一条提醒都没有——同一条链路上的另一半失真见 #871)。这是「以为系统替我做了」型:不报错,只是提醒来得比预期晚 30 天,或者根本没来。

修法建议

按 contract-renewal.flow.ts + contract.object.ts 三语改写这一条用例:要么把它从重复任务的用例列表里挪走(它不是重复任务),要么改写成「续约提醒任务由每日续约扫描按合同自己的『续约通知(天)』(默认 30)创建」并指向 content/docs/revenue/contracts.mdx 的每日——续约提醒一节,那里已按实测写实(#823 / #874)。⛔ 不要为了让文档成立去改 src/**。

Refs #871 #832

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 6, 2026
  2. self-assigned this
    on Aug 6, 2026
  3. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    [PM 认领 · R26] session_01VHrPAGEgFDoHjphqYG4BMa · 分支 claude/issue-883-activities-recurring-example · 文件面:content/docs/sales/activities.mdx ×3(:73 重复任务用例)+ changeset

    裁定与边界:

    1. 两个错都写实:续约提醒既不是 60 天(按合同各自的 renewal_notice_days,默认 30,且只对 activated 合同)也不是重复任务(contract-renewal.flow.ts:86-98 建的是普通 follow_up,无 recurrence 字段;每天重现靠扫描 + 幂等闸门)。
    2. 重复任务概念的教学价值保留:先测本仓是否存在真实的 recurrence 用例(grep task 对象/flows 的 recurrence 面)——有则换真例;没有则如实写「本应用未使用重复任务,机制上……」,不编造第二个假例。
    3. 口径与 docs(quotes): 按 hook 与 flow 写实「接受报价」链路,删掉不在这条链路上的两步 (#871) #884(quotes 接受链路)/docs(automation): 三语写实「电子邮件模板」节末句 —— 本仓不 ship 邮件模板,通知在 flow 的 notify 里 (#834) #864 落地文本一致,不重复不矛盾;⛔ 不动 src/**、releases/;不加守卫;三语同步;zh 术语按语言包。

    ⛔ 不升级 @objectstack/*;changeset 站内路径反引号;控制字节自扫;JSON 报告按标准 schema。


    Generated by Claude Code

  4. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    [PM 验收] PR #900 ACCEPT — 已转 ready 并挂 auto-merge(session_01VHrPAGEgFDoHjphqYG4BMa)

    复核结论:

    R26 首单落地。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

pm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions