Task Accuracy Baseline v1 Scenario Review
Current legacy scenario snapshot(2026-07-15):本页的 expected decisions 对应旧
taskDecisions[] / typeCategory / closeResultexecutable 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。
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 openlead_outreach,例如record_progress no_answer或close wrong_number。这也是未来 Vapi / SMS agent 需要遵守的 task ownership 边界。create_closed只适合没有 prior open task,且 objective 在同一通 call/message 里出现又解决。线下已经知道客户可能取消时,通常应先有 opencancellation_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 里挑。
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。