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 的 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
typeCategorycreate_opencreate_closedcloseprogressupdateno-opsafety
lead_outreachforbidden-21-11
lead_follow_up11321-3
booked_not_converted11111-1
cancellation_risk11111--
retention11111-1
win_back111111-
upgrade11111--
renewal11111--
referral111-1--
cross-category / policy-----31

Scenario count: 57

Quick legend:

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

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

这一组验证:AI 是否能识别“新的、未解决、staff action 还能改变结果”的 objective,并创建正确的 typeCategorylead_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

  • 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。