> For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.

# Task Accuracy Baseline v1 Scenario Review

> **Current legacy scenario snapshot（2026-07-15）**：本页的 expected decisions 对应旧 `taskDecisions[] / typeCategory / closeResult` executable contract，只用于回归兼容，不代表 V3 产品目标。V3 scenarios 应按 [Task System Design V3](/product-design/v3/tasks-feature/task-domain-lifecycle.md) 的 Task Policy、Task-specific Outcome 和 Next Action contract 重建。

这些 scenario 用 production prompt + production Zod schema 跑 Golden Eval。这里先给产品评审用：看 expected decision 是否符合业务，不讨论模型当前能否稳定命中。

## 0. Review Principle and Coverage Matrix

**Primary 导向：Task Decision 质量。**

- 这个 matrix 是 **`typeCategory × decision action / eval bucket`**。
- 数字表示当前 executable scenario 数量；`forbidden` 表示架构禁止；`-` 表示 Baseline v1 暂未覆盖。
- 先看覆盖表，再往下 review 每个 scenario 的 `Expected` / `Not expected`。

| typeCategory            | create\_open | create\_closed | close | progress | update | no-op | safety |
| ----------------------- | -----------: | -------------: | ----: | -------: | -----: | ----: | -----: |
| `lead_outreach`         |  `forbidden` |              - |     2 |        1 |      - |     1 |      1 |
| `lead_follow_up`        |            1 |              1 |     3 |        2 |      1 |     - |      3 |
| `booked_not_converted`  |            1 |              1 |     1 |        1 |      1 |     - |      1 |
| `cancellation_risk`     |            1 |              1 |     1 |        1 |      1 |     - |      - |
| `retention`             |            1 |              1 |     1 |        1 |      1 |     - |      1 |
| `win_back`              |            1 |              1 |     1 |        1 |      1 |     1 |      - |
| `upgrade`               |            1 |              1 |     1 |        1 |      1 |     - |      - |
| `renewal`               |            1 |              1 |     1 |        1 |      1 |     - |      - |
| `referral`              |            1 |              1 |     1 |        - |      1 |     - |      - |
| cross-category / policy |            - |              - |     - |        - |      - |     3 |      1 |

Scenario count: 57

Quick legend:

- `create_open` / `create_closed` / `close` / `update` 是 `taskDecisions[]` 里的 action。
- `progress` 在 schema 里叫 `record_progress`。
- `no-op` 不是 action，表示正确结果是 `taskDecisions=[]`。
- `safety` 不是 action，是 eval bucket，用来测 DNC、duplicate、forbidden create、hallucinated taskRef 等 policy/guard 边界。
- Scenario ID `C1-C57` 按本文 review 顺序编号；`C` 代表 executable golden eval case。

Notes for review:

- 这不是全排列测试。`Contact × Task × CloseResult × ProgressType × Channel × Direction × Evidence` 会爆炸，而且很多组合没有业务意义。Baseline v1 先覆盖会改变 mutation 的关键判断点；以后哪个 cell 不稳，再加 targeted scenarios。
- `lead_outreach` 是 system-owned objective：AI 不能 create，但必须能处理 existing open `lead_outreach`，例如 `record_progress no_answer` 或 `close wrong_number`。这也是未来 Vapi / SMS agent 需要遵守的 task ownership 边界。
- `create_closed` 只适合没有 prior open task，且 objective 在同一通 call/message 里出现又解决。线下已经知道客户可能取消时，通常应先有 open `cancellation_risk`，后续电话再 `record_progress` / `update` / `close`。

## 0.1 P0 Demo Candidate Pack

这张表来自 `GOLDEN_CASES[].demoCandidate`，不是单独维护的 wish list。

一句话：`matrix` 是覆盖地图，`demoCandidate` 是从覆盖地图里挑出来的演示路线。

- `needs_model_validation`：业务 expected 可以先 review，进入真实模型 eval 后再决定是否放 demo。
- `blocked_known_gap`：业务上重要，但当前不稳定或有 gap，不能放现场 demo。
- 最终 demo pack 只从连续稳定通过的 case 里挑。

| P0 ID | Scenario ID                                | Status                   | 中文场景                                         | 为什么适合 demo                                              |
| ----- | ------------------------------------------ | ------------------------ | -------------------------------------------- | ------------------------------------------------------- |
| P0-01 | `C1-lead-outreach-create-probe`            | `needs_model_validation` | 新 lead 主动来电问课程和价格，还没预约                       | 展示 AI 能从 customer intent 创建 actionable task。            |
| P0-02 | `C19-already-booked-no-new-task`           | `needs_model_validation` | open lead follow-up，客户预约 intro class         | 展示成功 outcome 会关闭 open task。                             |
| P0-03 | `C20-final-outcome-vocabulary`             | `blocked_known_gap`      | open lead follow-up，客户明确不感兴趣                 | 展示不会让 staff 继续追 dead task，但当前模型稳定性还未达 demo 标准。          |
| P0-04 | `C52-dnc-stops-outreach`                   | `needs_model_validation` | 客户 SMS 回复 STOP                               | 展示 DNC 安全边界和主动外联停止规则。                                   |
| P0-05 | `C29-no-answer-no-task`                    | `needs_model_validation` | 员工打 outbound call 没人接                        | 展示 attempt 不等于 close，正确动作是 record\_progress。            |
| P0-06 | `C30-voicemail-records-progress`           | `blocked_known_gap`      | 员工 outbound 留 voicemail                      | 展示 progress events / attempt count，但当前模型稳定性还未达 demo 标准。 |
| P0-07 | `C11-create-closed-cancel-saved`           | `needs_model_validation` | member 来电要 cancel，当场被挽留成功                    | 展示 one-touch resolved outcome 用 create\_closed 记录。      |
| P0-08 | `C4-create-retention-unresolved-complaint` | `needs_model_validation` | member 有未解决投诉                                | 展示 unresolved complaint 会形成 retention risk task。        |
| P0-09 | `C17-wrong-number-closes-open-outreach`    | `needs_model_validation` | wrong number 证据明确                            | 展示 invalid contact path 会关闭 open outreach task。         |
| P0-10 | `C48-routine-confirmation-noop`            | `needs_model_validation` | routine confirmation，没有 unresolved objective | 展示 AI 不会把普通 logistics 乱建成 task。                         |

## 1. Create Open: 什么时候应该新建 open task

这一组验证：AI 是否能识别“新的、未解决、staff action 还能改变结果”的 objective，并创建正确的 `typeCategory`。
`lead_outreach` 不在 create\_open 里不是漏掉，而是架构边界：first-touch SLA 由 lead-tracking/system 创建，contacts-analyzer AI 不能创建 `lead_outreach`。但是如果 `lead_outreach` 已经 open，AI 仍然必须能对它 `record_progress` / `close`。

### `lead_follow_up`

#### C1-lead-outreach-create-probe: 无 open task 的 engaged lead 主动咨询，创建 lead\_follow\_up

- Priority: `P0-demo`
- Review status: `approved`
- Bucket: `create_open`
- Type category signal: `lead_follow_up`
- Human label: 新 lead 来电咨询(尚无人跟进) → 必须开一个跟进任务,且类型要对
- Demo candidate: `P0-01` / `needs_model_validation`

Existing state:

- Contact 是 lead/new
- 没有 open task
- 有 lead record

New evidence:

- Inbound call
- 客户问 class schedule / intro offer
- 还没有 booking

Expected:

- create\_open lead\_follow\_up

Not expected:

- create\_open lead\_outreach
- close/update/record\_progress with invented taskId

Why: 客户已经主动 inbound engagement，且目标尚未解决；这不是 cold lead 初次外联，而是需要 staff follow-up 的 active objective。

### `booked_not_converted`

#### C2-create-booked-not-converted-after-intro: 客户完成 intro class 但还没买会员，create booked\_not\_converted

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_open`
- Type category signal: `booked_not_converted`
- Human label: lead 完成体验课但还没买会员 → 创建 booked\_not\_converted 任务

Existing state:

- Contact 是 booked lead
- 没有 open task

New evidence:

- Outbound post-intro call
- 客户确认 completed intro class
- 客户还没有购买 membership

Expected:

- create\_open booked\_not\_converted

Not expected:

- create\_open lead\_follow\_up
- close converted
- taskDecisions=\[]

Why: 客户已经过了预约阶段，下一目标是把体验课后的高意向窗口转成 membership。

### `cancellation_risk`

#### C3-create-cancellation-risk-new-open: 会员首次表达 cancel intent，create cancellation\_risk

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_open`
- Type category signal: `cancellation_risk`
- Human label: 会员首次表达想取消 → 创建 cancellation\_risk 任务

Existing state:

- Contact 是 active member
- 没有 open cancellation\_risk task

New evidence:

- Inbound call
- 客户问 how to cancel
- 还没有 manager save / final cancellation

Expected:

- create\_open cancellation\_risk

Not expected:

- create\_closed cancel\_saved
- close cancelled
- taskDecisions=\[]

Why: 取消意图已经出现，但 intervention 还可能改变结果；这就是 open cancellation\_risk objective。

### `retention`

#### C4-create-retention-unresolved-complaint: 未解决投诉带来流失风险，create retention

- Priority: `P0-demo`
- Review status: `approved`
- Bucket: `create_open`
- Type category signal: `retention`
- Human label: 会员投诉体验差且未解决 → 创建 retention 任务
- Demo candidate: `P0-08` / `needs_model_validation`

Existing state:

- Contact 是 active member
- 没有 open retention task

New evidence:

- Inbound complaint call
- 客户不满意 class quality
- manager review promised but not done

Expected:

- create\_open retention

Not expected:

- create\_open cancellation\_risk unless explicit cancel intent
- create\_closed issue\_resolved
- taskDecisions=\[]

Why: 投诉没有解决且影响 retention，staff 后续动作仍能改变结果。

### `win_back`

#### C5-create-win-back-churned-inbound: churned member 主动表达 rejoin interest，create win\_back

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_open`
- Type category signal: `win_back`
- Human label: 流失会员主动问重新加入 → 创建 win\_back 任务

Existing state:

- Contact lifecycleStage = churned
- 没有 open win\_back task

New evidence:

- Inbound call
- 客户问 rejoin promotion
- staff 需要发送 reactivation options

Expected:

- create\_open win\_back

Not expected:

- create\_open lead\_follow\_up
- proactive win\_back without inbound intent
- taskDecisions=\[]

Why: churned 用户主动回来问，是可推进的 win-back objective。

### `upgrade`

#### C6-create-upgrade-interest: 会员表达 upgrade interest 但未购买，create upgrade

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_open`
- Type category signal: `upgrade`
- Human label: 会员询问升级方案但没决定 → 创建 upgrade 任务

Existing state:

- Contact 是 active member
- 没有 open upgrade task

New evidence:

- Inbound call
- 客户问 4/month -> unlimited
- 需要 staff 发详情和 follow-up

Expected:

- create\_open upgrade

Not expected:

- close upgraded
- create\_open retention
- taskDecisions=\[]

Why: 这是明确 revenue opportunity，且未完成购买，需要 staff 推进。

### `renewal`

#### C7-create-renewal-payment-failure: 客户主动说 payment failed，需要更新 card，create renewal

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_open`
- Type category signal: `renewal`
- Human label: 会员付款失败需要人工恢复 → 创建 renewal 任务

Existing state:

- Contact 是 active member
- 没有 open renewal task

New evidence:

- Inbound SMS
- 客户明确说 membership payment failed
- 客户需要 help update card

Expected:

- create\_open renewal

Not expected:

- create\_open retention
- close renewed
- taskDecisions=\[]

Why: payment recovery 是 renewal objective；还没有证据显示 card 已修复。

### `referral`

#### C8-create-referral-guest-interest: 会员主动提带朋友来上课，create referral

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_open`
- Type category signal: `referral`
- Human label: 会员想带朋友来体验 → 创建 referral 任务

Existing state:

- Contact 是 active member
- 没有 open referral task

New evidence:

- Inbound SMS
- 客户提到具体 friend Maya
- 问 guest pass / weekend class

Expected:

- create\_open referral

Not expected:

- create\_open lead\_follow\_up on current member
- taskDecisions=\[]

Why: 推荐人是当前 member，目标是获取或安排被推荐人，这是 referral acquisition work。

## 2. Create Closed: 同一 interaction 出现又解决的 objective

这一组验证：没有 prior open task，但业务 objective 在同一通 call/message 里出现并解决时，系统应该留下 closed record，而不是完全 no-op，也不是创建一个多余 open task。

### `lead_follow_up`

#### C9-create-closed-lead-booked-same-call: 新 lead 同一通电话咨询并预约，create\_closed lead\_follow\_up

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_closed`
- Type category signal: `lead_follow_up`
- Human label: 新 lead 来电并当场预约 intro → create\_closed lead\_follow\_up / booked

Existing state:

- Contact 是 lead/new
- 没有 open task
- 没有 prior lead\_follow\_up

New evidence:

- Inbound call
- 客户咨询 intro class
- 同一通电话里 booked Saturday 10am

Expected:

- create\_closed lead\_follow\_up
- closeResult = booked

Not expected:

- create\_open lead\_follow\_up
- create\_open lead\_outreach
- taskDecisions=\[]

Why: lead follow-up objective 出现并在同一通电话里完成；应该留下 closed record，而不是生成 open task。

### `booked_not_converted`

#### C10-create-closed-booked-not-converted-converted-same-call: post-intro conversion 当场完成，create\_closed booked\_not\_converted

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_closed`
- Type category signal: `booked_not_converted`
- Human label: 体验后客户来电并当场买会员 → create\_closed booked\_not\_converted / converted

Existing state:

- Contact 是 booked lead
- 没有 open booked\_not\_converted task

New evidence:

- 客户 completed intro class
- 同一通电话里 purchased membership

Expected:

- create\_closed booked\_not\_converted
- closeResult = converted

Not expected:

- create\_open booked\_not\_converted
- close booked
- taskDecisions=\[]

Why: post-intro conversion objective 当场完成，应该记录 converted closed task。

### `cancellation_risk`

#### C11-create-closed-cancel-saved: 会员来电要取消但当场被挽留成功，create\_closed cancellation\_risk

- Priority: `P0-demo`
- Review status: `approved`
- Bucket: `create_closed`
- Type category signal: `cancellation_risk`
- Human label: 会员来电要取消但当场被挽留 → 记录一个已完成的取消风险任务
- Demo candidate: `P0-07` / `needs_model_validation`

Existing state:

- Contact 是 active member
- 没有 open cancellation\_risk task

New evidence:

- Inbound call
- 客户提出 cancel
- 同一通电话里接受 freeze / 决定留下

Expected:

- create\_closed cancellation\_risk
- closeResult = cancel\_saved

Not expected:

- create\_open cancellation\_risk
- taskDecisions=\[]
- close existing task because none exists

Why: objective 在同一通电话里出现又解决；不应该留下 open task，但也不能完全没有记录。

### `retention`

#### C12-create-closed-billing-issue-resolved: billing complaint 当场解决，create\_closed retention

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_closed`
- Type category signal: `retention`
- Human label: 账单投诉同一通电话里解决 → create\_closed retention / issue\_resolved

Existing state:

- Contact 是 active member
- 没有 open retention task

New evidence:

- Inbound billing complaint
- fee waived
- 客户确认 issue resolved

Expected:

- create\_closed retention
- closeResult = issue\_resolved

Not expected:

- create\_open retention
- taskDecisions=\[]

Why: 同一通电话出现并解决的业务 objective 应留下 closed record，而不是 open task。

### `win_back`

#### C13-create-closed-win-back-rejoined-same-call: churned member 当场 rejoin，create\_closed win\_back

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_closed`
- Type category signal: `win_back`
- Human label: 流失会员来电并当场重新加入 → create\_closed win\_back

Existing state:

- Contact lifecycleStage = churned
- 没有 open win\_back task

New evidence:

- Inbound call
- 客户 asked about rejoining
- 同一通电话里 reactivated membership

Expected:

- create\_closed win\_back
- closeResult = win\_back

Not expected:

- create\_open win\_back
- close converted
- taskDecisions=\[]

Why: win-back objective 出现并完成在同一 interaction；没有必要留下 open task。

### `upgrade`

#### C14-create-closed-upgrade-purchased-same-call: upgrade objective 当场完成，create\_closed upgrade

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_closed`
- Type category signal: `upgrade`
- Human label: 会员询问升级并当场购买 → create\_closed upgrade / upgraded

Existing state:

- Contact 是 active member
- 没有 open upgrade task

New evidence:

- 客户 asked about upgrade
- 同一通电话里 purchased upgrade

Expected:

- create\_closed upgrade
- closeResult = upgraded

Not expected:

- create\_open upgrade
- record\_progress customer\_considering
- taskDecisions=\[]

Why: upgrade revenue objective 当场完成，应该记录 closed outcome。

### `renewal`

#### C15-create-closed-renewal-card-fixed-same-call: payment recovery 当场完成，create\_closed renewal

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_closed`
- Type category signal: `renewal`
- Human label: 付款失败来电并当场修复 → create\_closed renewal / renewed

Existing state:

- Contact 是 active member
- 没有 open renewal task

New evidence:

- 客户来电处理 failed payment
- card updated
- payment processed

Expected:

- create\_closed renewal
- closeResult = renewed

Not expected:

- create\_open renewal
- update only
- taskDecisions=\[]

Why: renewal/payment recovery objective 在同一通电话里完成，应记录 closed outcome。

### `referral`

#### C16-create-closed-referral-obtained-same-message: referral 信息一次性给全，create\_closed referral

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `create_closed`
- Type category signal: `referral`
- Human label: 会员直接发来朋友联系方式 → create\_closed referral / referral\_obtained

Existing state:

- Contact 是 active member
- 没有 open referral task

New evidence:

- Inbound SMS
- 客户提供 friend name
- 客户提供 friend phone number

Expected:

- create\_closed referral
- closeResult = referral\_obtained

Not expected:

- create\_open referral
- create\_open lead\_follow\_up on recommender
- taskDecisions=\[]

Why: referral objective 出现并完成在同一条 message；应该记录 referral\_obtained。

## 3. Close: 什么时候已有 task 应该结束

这一组验证：open task 的 objective 已经成功、失败、无效、blocked、exhausted，AI 是否能选择正确 `closeResult`。
Lead close outcomes 不是单一情况：可能是 booked、converted、not\_interested、wrong\_number、do\_not\_contact、already\_member、unable\_to\_reach。review 时看的是“证据是否足以让这个 objective 结束”，不是只看 lifecycleStage。

### `lead_outreach`

#### C17-wrong-number-closes-open-outreach: 电话确认 wrong number，close wrong\_number

- Priority: `P0-demo`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `lead_outreach`
- Human label: 号码明确错误 → 关闭 open outreach task
- Demo candidate: `P0-09` / `needs_model_validation`

Existing state:

- Contact 是 lead
- Open task: T1 lead\_outreach

New evidence:

- Outbound call connected
- 接电话的人明确说 wrong number

Expected:

- close wrong\_number on T1

Not expected:

- record\_progress no\_answer
- create\_open lead\_follow\_up
- taskDecisions=\[]

Why: wrong number 让 outreach objective 无效，继续 follow-up 会浪费 staff 时间。

#### C18-exhausted-attempts-close-unable-to-reach: attempt threshold 边界：第二次 no-answer 后是否 close unable\_to\_reach

- Priority: `P1-baseline`
- Review status: `known_gap`
- Bucket: `close`
- Type category signal: `lead_outreach`
- Human label: 已有一次未接尝试，又一次没接 → threshold=2 时关闭 unable\_to\_reach
- Known gap: Product decision confirmed: threshold=2 means attemptCount=1 + another failed attempt should close unable\_to\_reach. Deterministic writer support is tracked separately. (retaintive/callytics-infrastructure#1142)

Existing state:

- Contact 是 lead/attempted
- Open task: T1 lead\_outreach
- T1 attemptCount = 1

New evidence:

- 又一次 outbound no\_answer
- 默认 LEAD\_ATTEMPT\_THRESHOLD = 2

Expected:

- close unable\_to\_reach on T1

Not expected:

- record\_progress only
- create\_open lead\_follow\_up
- taskDecisions=\[]

Why: V1 policy 已确认：threshold=2 表示第一次 failed outreach 记录 progress，第二次 failed outreach 直接 close unable\_to\_reach。最后一次 attempt 暂时由 close reason/evidence 表达；future progress\_then\_close 或 deterministic auto-close 见 #1142。

### `lead_follow_up`

#### C19-already-booked-no-new-task: 客户已预约 intro class，关闭 open lead\_follow\_up

- Priority: `P0-demo`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `lead_follow_up`
- Human label: 客户已约好体验课 → 不再开新任务,原跟进任务按"已预约"关闭
- Demo candidate: `P0-02` / `needs_model_validation`

Existing state:

- Contact leadStatus = booked
- Open task: T1 lead\_follow\_up

New evidence:

- Inbound human conversation
- 客户确认 Saturday 10am intro class
- 没有未解决 billing / complaint / manager issue

Expected:

- close booked on T1
- leadStatus stays booked
- 不创建新 task

Not expected:

- create\_open lead\_follow\_up
- create intake/waiver/arrival task
- taskDecisions=\[]

Why: lead\_follow\_up 的 objective 是让客户预约；预约成功就是 close booked。后续 logistics 不应该变成 task。

#### C20-final-outcome-vocabulary: 客户明确拒绝 offer，关闭为 not\_interested

- Priority: `P0-demo`
- Review status: `known_gap`
- Bucket: `close`
- Type category signal: `lead_follow_up`
- Human label: 客户明确拒绝 → 任务用"不感兴趣"关闭,不用旧版词汇
- Demo candidate: `P0-03` / `blocked_known_gap`
- Known gap: close decision no-ops on firm rejection — #1091 examples/causality + dueAt-vs-recording rule reached the first 5-run majority (2026-06-10: 1/5 baseline → 3/5); remove after two consecutive majority rounds; taskId refs stay reliable (zero bad refs across 9+ rounds) (retaintive/callytics-infrastructure#1091)

Existing state:

- Contact 是 connected lead
- Open task: T1 lead\_follow\_up

New evidence:

- 客户说已经加入别的 gym
- 客户明确 not interested
- 客户要求不要继续 pitch

Expected:

- close not\_interested on T1
- leadStatus = not\_interested

Not expected:

- taskDecisions=\[]
- close do\_not\_contact unless explicit channel opt-out
- record\_progress

Why: firm rejection 已经让 objective 失败；不关闭会让 staff 继续追一个 dead task。

#### C21-close-lead-follow-up-already-member: lead task 发现客户已经是 member，close already\_member

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `lead_follow_up`
- Human label: open lead\_follow\_up 发现客户已是会员 → close already\_member

Existing state:

- Open task: T1 lead\_follow\_up
- Contact 当前被当作 lead

New evidence:

- 客户说已经是 active member
- 只是 email/account mismatch

Expected:

- close already\_member on T1

Not expected:

- create\_open lead\_follow\_up
- record\_progress
- close converted

Why: lead objective 已经不适用；这不是新成交，而是身份识别错误。

### `booked_not_converted`

#### C22-close-booked-not-converted-converted: open booked\_not\_converted，客户购买 membership，close converted

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `booked_not_converted`
- Human label: 体验后客户购买 membership → close converted

Existing state:

- Open task: T1 booked\_not\_converted

New evidence:

- 客户购买 unlimited membership
- payment / start date confirmed

Expected:

- close converted on T1

Not expected:

- close booked
- create\_open booked\_not\_converted
- taskDecisions=\[]

Why: converted 表示 paid membership purchase；不是只预约 intro。

### `cancellation_risk`

#### C23-close-cancellation-cancelled: 已有 cancellation\_risk，客户确认继续取消，close cancelled

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `cancellation_risk`
- Human label: 已有取消风险任务，客户确认继续取消 → 任务按 cancelled 关闭

Existing state:

- Contact 是 active member
- Open task: T1 cancellation\_risk

New evidence:

- Inbound call
- 客户确认 still wants to cancel
- staff sent cancellation form

Expected:

- close cancelled on T1

Not expected:

- create\_open cancellation\_risk
- update only
- close cancel\_saved

Why: save objective 已失败且 cancellation 正在推进，open task 应关闭为 cancelled。

### `retention`

#### C24-close-retention-issue-resolved: retention complaint 已解决，close issue\_resolved

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `retention`
- Human label: 已有 retention 投诉任务，客户确认满意 → close issue\_resolved

Existing state:

- Open task: T1 retention

New evidence:

- manager follow-up connected
- 客户确认 solution fair / satisfied

Expected:

- close issue\_resolved on T1

Not expected:

- update only
- create\_open retention
- taskDecisions=\[]

Why: 客户确认满意，retention objective 已完成。

### `win_back`

#### C25-close-win-back-rejoined: win\_back 成功 rejoin，close win\_back

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `win_back`
- Human label: 流失会员重新加入 → close win\_back

Existing state:

- Open task: T1 win\_back

New evidence:

- former member reactivated membership
- confirmed first class back

Expected:

- close win\_back on T1

Not expected:

- close converted
- create\_open win\_back
- taskDecisions=\[]

Why: win\_back 是 former member re-enroll，不应和新 lead conversion 混淆。

### `upgrade`

#### C26-close-upgrade-upgraded: upgrade task 成功购买，close upgraded

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `upgrade`
- Human label: 会员完成升级购买 → close upgraded

Existing state:

- Open task: T1 upgrade

New evidence:

- 客户 accepted upgrade
- staff processed upgrade

Expected:

- close upgraded on T1

Not expected:

- create\_open upgrade
- record\_progress customer\_considering

Why: upgrade objective 已完成。

### `renewal`

#### C27-close-renewal-card-fixed: renewal/payment recovery 已完成，close renewed

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `renewal`
- Human label: payment recovery 完成 → close renewed

Existing state:

- Open task: T1 renewal

New evidence:

- card updated
- failed payment processed successfully

Expected:

- close renewed on T1

Not expected:

- update payment link sent
- create\_open renewal
- taskDecisions=\[]

Why: payment recovery objective 已达成。

### `referral`

#### C28-close-referral-obtained: referral 目标完成，close referral\_obtained

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `close`
- Type category signal: `referral`
- Human label: 推荐人信息已拿到 → close referral\_obtained

Existing state:

- Open task: T1 referral

New evidence:

- 客户提供被推荐人姓名 Maya Chen
- 客户提供 phone number

Expected:

- close referral\_obtained on T1

Not expected:

- create\_open lead\_follow\_up on recommender
- update only

Why: referral task 锚在推荐人身上；拿到具体 referral contact 就完成推荐目标。

## 4. Record Progress: 什么时候只是记录一次尝试

这一组验证：open objective 还没完成，但发生了一次有效过程事件时，AI 应该 `record_progress`，不应该 close，也不应该 duplicate create。

### `lead_outreach`

#### C29-no-answer-no-task: 店员打给 lead 没人接，在已有 lead\_outreach 上记录进展

- Priority: `P0-demo`
- Review status: `approved`
- Bucket: `record_progress`
- Type category signal: `lead_outreach`
- Human label: 跟进中的 lead 一通没接通 → 只记一次"未接"尝试,不重复开任务
- Demo candidate: `P0-05` / `needs_model_validation`

Existing state:

- Contact 是 active lead
- Open task: T1 lead\_outreach
- T1 attemptCount = 0

New evidence:

- Outbound call
- callState = no\_answer
- 客户没有任何回复

Expected:

- record\_progress no\_answer on T1
- task 保持 open
- 后续由 dueAt 安排下一次 follow-up

Not expected:

- close unable\_to\_reach
- create\_open lead\_follow\_up
- taskDecisions=\[]

Why: 单次 outbound no-answer 是一次员工尝试，不是目标完成或失败；已有 lead\_outreach 就推进原 task，不能重复创建 lead\_follow\_up。

### `lead_follow_up`

#### C30-voicemail-records-progress: 店员给 open lead\_follow\_up 留 voicemail，记录 left\_voicemail

- Priority: `P0-demo`
- Review status: `known_gap`
- Bucket: `record_progress`
- Type category signal: `lead_follow_up`
- Human label: 员工给客户留了语音 → 在已有跟进任务上记一次进展,不重复开任务
- Demo candidate: `P0-06` / `blocked_known_gap`
- Known gap: record\_progress no-ops on staff-voicemail events — #1091 examples/causality + dueAt-vs-recording rule lifted it to the 4/5 acceptance bar (2026-06-10: 2/3 → 3/3 → 3/5 → 4/5); remove after a second consecutive ≥4/5 round (retaintive/callytics-infrastructure#1091)

Existing state:

- Contact 是 active lead
- Open task: T1 lead\_follow\_up
- T1 attemptCount = 0

New evidence:

- Outbound call
- callState = voicemail
- staff left voicemail asking customer to call back

Expected:

- record\_progress left\_voicemail on T1
- task 保持 open
- attemptCount 后续由 writer +1

Not expected:

- close unable\_to\_reach
- create\_open lead\_follow\_up
- taskDecisions=\[]

Why: 留言是过程态 evidence。若不记录 progress，attempt count 不会推进，后续 unable\_to\_reach 规则也无法稳定判断。

#### C31-progress-follow-up-scheduled: 客户约定具体 follow-up 时间，record\_progress follow\_up\_scheduled

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `record_progress`
- Type category signal: `lead_follow_up`
- Human label: 客户约定周五再聊 → record\_progress follow\_up\_scheduled

Existing state:

- Open task: T1 lead\_follow\_up

New evidence:

- 客户 still interested
- 客户要求 Friday morning follow-up

Expected:

- record\_progress follow\_up\_scheduled on T1

Not expected:

- close booked
- create\_open lead\_follow\_up
- taskDecisions=\[]

Why: 客户没有完成 booking，但给了明确下一次 follow-up 时间。

### `booked_not_converted`

#### C32-progress-booked-not-converted-customer-considering: booked\_not\_converted 客户还在考虑，record\_progress customer\_considering

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `record_progress`
- Type category signal: `booked_not_converted`
- Human label: 体验后客户还在考虑 → record\_progress customer\_considering

Existing state:

- Open task: T1 booked\_not\_converted

New evidence:

- post-intro outbound call connected
- 客户 liked workout
- 客户要和 spouse 商量后决定

Expected:

- record\_progress customer\_considering on T1

Not expected:

- close converted
- close not\_interested
- create\_open booked\_not\_converted

Why: post-intro conversion objective 还在进行中；客户没有拒绝，也没有购买，只是仍在考虑。

### `cancellation_risk`

#### C33-progress-customer-considering: 客户接通但还在考虑，record\_progress customer\_considering

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `record_progress`
- Type category signal: `cancellation_risk`
- Human label: 客户接通但还在考虑 → 记录 customer\_considering, 不关闭

Existing state:

- Contact 是 active member
- Open task: T1 cancellation\_risk

New evidence:

- Outbound call connected
- 客户仍在考虑
- 没有 save / cancel 最终结果

Expected:

- record\_progress customer\_considering on T1

Not expected:

- close cancel\_saved
- close cancelled
- update only

Why: 目标还在进行中；这次通话是有效进展，但 outcome 未完成。

### `retention`

#### C34-progress-callback-requested: 客户要求 future callback，record\_progress callback\_requested

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `record_progress`
- Type category signal: `retention`
- Human label: 客户要求经理明天回电 → record\_progress callback\_requested

Existing state:

- Open task: T1 retention

New evidence:

- Inbound call
- 客户无法继续聊
- 要求 manager tomorrow afternoon call back

Expected:

- record\_progress callback\_requested on T1

Not expected:

- close issue\_resolved
- update only
- create\_open retention

Why: objective 没解决，但客户给了明确 callback request。

### `win_back`

#### C35-progress-win-back-callback-requested: win\_back 客户要求 callback，record\_progress callback\_requested

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `record_progress`
- Type category signal: `win_back`
- Human label: win\_back 客户要求晚点回电 → record\_progress callback\_requested

Existing state:

- Open task: T1 win\_back

New evidence:

- Outbound call connected
- former member still interested
- 客户要求 tomorrow evening callback

Expected:

- record\_progress callback\_requested on T1

Not expected:

- close win\_back
- create\_open win\_back duplicate
- taskDecisions=\[]

Why: former member 没有 rejoin，也没有拒绝；这是明确 callback request。

### `upgrade`

#### C36-progress-no-answer-on-upgrade: open upgrade 上一次 outbound no-answer，record\_progress no\_answer

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `record_progress`
- Type category signal: `upgrade`
- Human label: 给 upgrade lead 打电话没人接 → record\_progress no\_answer

Existing state:

- Open task: T1 upgrade
- T1 attemptCount = 0

New evidence:

- Outbound call
- callState = no\_answer

Expected:

- record\_progress no\_answer on T1

Not expected:

- close unable\_to\_reach
- create\_open upgrade
- taskDecisions=\[]

Why: 任何 open objective 上的 staff no-answer attempt 都应该推进 progress，而不是重复创建或关闭。

### `renewal`

#### C37-progress-text-sent-on-renewal: 发出 payment recovery SMS，record\_progress text\_sent

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `record_progress`
- Type category signal: `renewal`
- Human label: open renewal 上发了 payment link SMS → record\_progress text\_sent

Existing state:

- Open task: T1 renewal

New evidence:

- Outbound SMS
- staff sent secure payment update link
- 客户尚未确认 card fixed

Expected:

- record\_progress text\_sent on T1

Not expected:

- close renewed
- create\_open renewal
- taskDecisions=\[]

Why: 发送链接是一次推进尝试，不是 payment recovery 完成。

## 5. Update: 同一个 objective 还在，但下一步变了

这一组验证：同一个 open task 仍然成立，但新证据改变 priority、timing、objection、manager path 或 next action 时，AI 应该 update 原 task。

### `lead_follow_up`

#### C38-update-lead-follow-up-pricing-objection: 同一个 lead objective 有新 pricing objection，update 原 task

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `update`
- Type category signal: `lead_follow_up`
- Human label: open lead\_follow\_up 新增 pricing objection → update suggestedActions

Existing state:

- Open task: T1 lead\_follow\_up

New evidence:

- 客户仍有兴趣
- 新增 price concern
- 需要发送 intro package options

Expected:

- update suggestedActions on T1

Not expected:

- create\_open lead\_follow\_up
- close not\_interested
- record\_progress only

Why: objective 未完成，但 next action 从普通 call 变成处理价格异议。

### `booked_not_converted`

#### C39-update-booked-not-converted-pricing-objection: booked\_not\_converted 新增价格异议，update suggestedActions

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `update`
- Type category signal: `booked_not_converted`
- Human label: booked\_not\_converted 新增 pricing objection → update

Existing state:

- Open task: T1 booked\_not\_converted

New evidence:

- Inbound SMS
- 客户 liked intro class
- 客户觉得 unlimited too expensive
- 客户问 lower monthly option

Expected:

- update suggestedActions on T1

Not expected:

- create\_open booked\_not\_converted duplicate
- close not\_interested
- record\_progress only

Why: conversion objective 未结束，但 next action 变成处理价格异议和推荐更低方案。

### `cancellation_risk`

#### C40-update-cancellation-risk-save-offer: cancellation\_risk 仍 open，但出现具体 save offer，update

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `update`
- Type category signal: `cancellation_risk`
- Human label: cancellation\_risk 新增 freeze save path → update

Existing state:

- Open task: T1 cancellation\_risk

New evidence:

- 客户仍有 cancel risk
- two-month freeze 可能可接受
- 需要 manager approve

Expected:

- update suggestedActions on T1

Not expected:

- close cancel\_saved
- close cancelled
- create\_open cancellation\_risk

Why: 还没有 saved，也没有 cancelled；但 next action 从普通挽留变成 manager approve freeze。

### `retention`

#### C41-update-retention-manager-callback: 已有 retention task，新投诉细节改变 next action

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `update`
- Type category signal: `retention`
- Human label: 已有投诉处理任务，新证据改变下一步 → 更新 suggestedActions

Existing state:

- Contact 是 active member
- Open task: T1 retention

New evidence:

- billing dispute details clarified
- manager callback promised tomorrow

Expected:

- update suggestedActions on T1

Not expected:

- close issue\_resolved
- create\_open retention
- record\_progress no\_answer

Why: 问题仍未解决，但下一步行动发生变化，所以应 update 原 task。

### `win_back`

#### C42-update-win-back-price-barrier: win\_back 新增 price barrier / promo preference，update

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `update`
- Type category signal: `win_back`
- Human label: win\_back 新增价格障碍 → update

Existing state:

- Open task: T1 win\_back

New evidence:

- Inbound SMS
- 客户 might rejoin
- 客户只考虑 cheaper 8x/month option
- 客户要求发送 promo

Expected:

- update suggestedActions on T1

Not expected:

- create\_open win\_back duplicate
- close win\_back
- record\_progress text\_sent

Why: win-back objective 仍 open，但下一步从普通 rejoin outreach 变成发送符合价格偏好的方案。

### `upgrade`

#### C43-update-upgrade-package-preference: upgrade 目标不变，但客户偏好改变，update

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `update`
- Type category signal: `upgrade`
- Human label: upgrade 任务新增 package preference → update

Existing state:

- Open task: T1 upgrade

New evidence:

- Inbound SMS
- 客户不想 unlimited
- 客户想看 8x/month option

Expected:

- update suggestedActions on T1

Not expected:

- create\_open upgrade duplicate
- close upgraded
- record\_progress text\_sent

Why: 还是同一个 upgrade objective，但下一步销售动作要改。

### `renewal`

#### C44-update-renewal-payment-link-sent: renewal 任务下一步变成确认 payment link，update

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `update`
- Type category signal: `renewal`
- Human label: renewal 新证据是 payment link 已发但未完成 → update

Existing state:

- Open task: T1 renewal

New evidence:

- 客户接通
- payment link 已发
- 客户还没有完成 card update

Expected:

- update suggestedActions on T1

Not expected:

- close renewed
- create\_open renewal

Why: 计划发生变化：不是再解释 payment failure，而是 follow up 确认 link 是否完成。

### `referral`

#### C45-update-referral-benefit-question: referral 任务出现 credit/benefit 待处理，update

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `update`
- Type category signal: `referral`
- Human label: referral 任务新增 referral credit 问题 → update

Existing state:

- Open task: T1 referral

New evidence:

- 客户说 friend booked Saturday
- 客户问 referral credit 是否确认

Expected:

- update suggestedActions on T1

Not expected:

- create\_open referral duplicate
- taskDecisions=\[]

Why: referral objective 未必完全结束，因为 benefit 处理仍需 staff action。

## 6. No-op / Negative: 什么情况下 AI 不应该动

这一组验证：不是所有 event 都应该变成 task。cold lead record、campaign no reply、routine confirmation、terminal/vendor/non-customer 都应该避免无意义 mutation。

### `lead_outreach`

#### C46-cold-lead-record-only-no-ai-create: cold lead 只有 lead record，没有 engagement，AI 不创建 lead\_follow\_up

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `negative_noop`
- Type category signal: `lead_outreach`
- Human label: 只有 cold lead 记录、没有互动 → AI 不创建 follow-up task

Existing state:

- Contact 是 lead/new
- 没有 open task
- 只有 lead record

New evidence:

- 没有 inbound call/SMS/reply
- 没有两方 conversation

Expected:

- taskDecisions=\[]

Not expected:

- create\_open lead\_follow\_up
- create\_open lead\_outreach

Why: cold lead 首次外联属于 lead-tracking 的 deterministic lead\_outreach SLA；contacts-analyzer 不应该重复创建。

### `win_back`

#### C50-noop-churned-campaign-no-inbound: churned contact 没有 inbound rejoin intent，不创建 win\_back

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `negative_noop`
- Type category signal: `win_back`
- Human label: churned contact 只收到 campaign 没回复 → 不主动 create win\_back

Existing state:

- Contact lifecycleStage = churned
- 没有 open win\_back task

New evidence:

- Outbound campaign SMS
- 没有 customer reply / inbound call

Expected:

- taskDecisions=\[]

Not expected:

- create\_open win\_back

Why: V1 不做 proactive win-back create；churned contact 必须主动表达 rejoin intent。

### `cross_category_or_policy`

#### C47-noop-campaign-no-reply: campaign/broadcast 没有客户回复，不创建 individual task

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `negative_noop`
- Type category signal: `cross_category_or_policy`
- Human label: 群发 campaign 没有客户回复 → no-op

Existing state:

- Contact 是 lead/new
- 没有 open task

New evidence:

- Outbound campaign SMS
- 没有 inbound reply / call

Expected:

- taskDecisions=\[]

Not expected:

- create\_open lead\_follow\_up
- create\_open lead\_outreach

Why: 系统不能把每条群发触达都变成个人任务；必须有客户 intent / reply。

#### C48-routine-confirmation-noop: routine confirmation / parking logistics，不创建 task

- Priority: `P0-demo`
- Review status: `approved`
- Bucket: `negative_noop`
- Type category signal: `cross_category_or_policy`
- Human label: 客户只是确认到店时间 → 不创建任务
- Demo candidate: `P0-10` / `needs_model_validation`

Existing state:

- Contact leadStatus = booked
- 没有 open task

New evidence:

- Inbound call
- 只确认 class time / parking
- 问题当场回答

Expected:

- taskDecisions=\[]

Not expected:

- create\_open lead\_follow\_up
- create intake/waiver/arrival task

Why: 这是 logistics，不是新的 customer-level objective；系统不应该把每个客服问题都变成 task。

#### C49-noop-terminal-contact: vendor/corporate/terminal contact，不创建 fitness task

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `negative_noop`
- Type category signal: `cross_category_or_policy`
- Human label: terminal / non-customer 联系人不进入 fitness task workflow

Existing state:

- Contact lifecycleStage = unknown
- lifecycleState = terminal
- 没有 open task

New evidence:

- Inbound vendor pitch
- 不是 customer / lead / member

Expected:

- taskDecisions=\[]

Not expected:

- create\_open referral
- create\_open retention
- create\_open lead\_follow\_up

Why: V1 fitness workflow 只处理 customer/member/lead objective；vendor 不属于任务体系。

## 7. Safety / Policy Guard: 高风险 mutation 防线

这一组验证：DNC、duplicate、forbidden create、hallucinated taskRef 等高风险行为必须被 prompt/schema/policy guard 控制。

### `lead_outreach`

#### C51-safety-lead-outreach-create-forbidden: lead\_outreach create forbidden

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `safety`
- Type category signal: `lead_outreach`
- Human label: cold lead 需要首触达也不能由 AI create lead\_outreach

Existing state:

- Contact 是 cold lead/new
- 没有 open task

New evidence:

- New lead record only
- 没有 customer engagement

Expected:

- taskDecisions=\[]

Not expected:

- create\_open lead\_outreach
- create\_open lead\_follow\_up

Why: lead\_outreach creation 属于 lead-tracking SLA，不属于 contacts-analyzer AI。

### `lead_follow_up`

#### C52-dnc-stops-outreach: 客户 SMS 回复 STOP，标记 DNC 并停止主动外联

- Priority: `P0-demo`
- Review status: `approved`
- Bucket: `safety`
- Type category signal: `lead_follow_up`
- Human label: 客户回 STOP 短信 → 标记"勿扰"并停止一切主动外联
- Demo candidate: `P0-04` / `needs_model_validation`

Existing state:

- Contact 是 active lead
- Open task: T1 lead\_follow\_up
- doNotContact = false

New evidence:

- Inbound SMS
- subject = STOP. Do not contact me again.

Expected:

- doNotContact = true
- close do\_not\_contact on visible open outreach task

Not expected:

- create\_open
- update suggestedActions
- record\_progress

Why: DNC 是 hard stop。AI 不能把 STOP 当成普通 objection，也不能继续生成外联任务。

#### C53-no-taskid-hallucination: 没有 visible open task 时，AI 不准编造 taskId

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `safety`
- Type category signal: `lead_follow_up`
- Human label: 客户没有任何打开的任务 → AI 不准编造任务 ID 去关/改任务

Existing state:

- Contact 是 active lead
- 没有 open task

New evidence:

- Outbound voicemail attempt
- 没有 prompt-visible taskRef

Expected:

- 不输出 close/update/record\_progress/reopen
- 最多 create\_open lead\_follow\_up

Not expected:

- taskId = UUID
- taskId = T1
- close/update/record\_progress

Why: writer 只能接受 prompt 展示过的 T1/T2 ref。没有 open task 时引用 taskId 就是 hallucination。

#### C54-close-phone-opt-out-do-not-contact: 电话中明确 opt-out，close do\_not\_contact

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `safety`
- Type category signal: `lead_follow_up`
- Human label: 客户明确要求不要再联系 → close do\_not\_contact 并 DNC

Existing state:

- Open task: T1 lead\_follow\_up
- doNotContact = false

New evidence:

- 客户说 remove me from your list
- 客户说 do not call or text again

Expected:

- doNotContact = true
- close do\_not\_contact on T1

Not expected:

- close not\_interested only
- record\_progress
- create\_open

Why: 这是 channel-level opt-out，不只是拒绝 offer；后续 outbound 必须停止。

### `booked_not_converted`

#### C56-safety-duplicate-booked-not-converted-open: 已有同类 open booked\_not\_converted，不允许 duplicate create

- Priority: `P1-baseline`
- Review status: `needs_product_decision`
- Bucket: `safety`
- Type category signal: `booked_not_converted`
- Human label: 已有 booked\_not\_converted，不允许 duplicate create

Existing state:

- Open task: T1 booked\_not\_converted

New evidence:

- post-intro follow-up connected
- 客户仍在考虑 membership options
- 没有 final purchase / rejection

Expected:

- 不 create\_open booked\_not\_converted
- 允许 record\_progress customer\_considering 或 update

Not expected:

- create\_open booked\_not\_converted duplicate

Why: same category open task 已存在；即使 latest event 仍指向同一 objective，也只能推进原 task。

Product questions:

- 对于“仍在考虑但没有新 next action”的 post-intro call，产品上更希望 record\_progress customer\_considering 还是 update？当前 assertion 只锁住不能 duplicate create。

### `retention`

#### C57-safety-duplicate-same-category-open: 已有同类 open retention task，不允许 duplicate create

- Priority: `P1-baseline`
- Review status: `needs_product_decision`
- Bucket: `safety`
- Type category signal: `retention`
- Human label: 同一 category 已有 open task，新证据不能 duplicate create

Existing state:

- Open task: T1 retention

New evidence:

- 客户重复同一个 complaint
- 没有新 outcome
- manager response 已经 promised

Expected:

- 不 create\_open retention
- 允许 update 或 no-op，取决于是否认为新 evidence 改变 next action

Not expected:

- create\_open retention duplicate

Why: DB 也会挡 duplicate，但 prompt 层应先做对，避免无效 proposal。

Product questions:

- 重复 complaint 但没有新信息时，产品上更希望 no-op 还是 record/update 一次？当前 assertion 只锁住不能 duplicate create。

### `cross_category_or_policy`

#### C55-noop-existing-dnc-no-create: doNotContact=true 时不创建 proactive task

- Priority: `P1-baseline`
- Review status: `approved`
- Bucket: `safety`
- Type category signal: `cross_category_or_policy`
- Human label: contact 已经 DNC，即使有营销机会也不创建任务

Existing state:

- Contact doNotContact = true
- 没有 open task

New evidence:

- Outbound marketing SMS
- 没有 customer inbound response

Expected:

- taskDecisions=\[]
- doNotContact remains true

Not expected:

- create\_open lead\_follow\_up
- create\_open win\_back
- record\_progress without task

Why: DNC 是 hard stop；没有 visible open task 可关闭时，就不产生新 task。
