产品裁决:「完成」不需要等成功,只要知道**这个患者的召回还在不在池、有没有被抑制**,
两者任一成立就说明这单处理过了。成功不成功先不统计。
否掉原案的「转化率」:它卡在 plan_executions 11% 回写率上,永远只能输出「样本不足」,
等于这一格报表上线即死。新口径的两条判据是**互补不是重复**:
出池 status='superseded' 引擎按客观事实判定该患者已无活信号(治疗真做了/诊断没了)
⭐ **零回写依赖** —— 接住不写回访的 89%
被抑制 snoozedUntil > now 客服写了回访结果(约下次/拒绝/放弃)
接住写了的 11%
为什么现在可以不算成功、以后又不会抓瞎:出池原因记在 plan_event_logs、客观事实在
patient_facts(append-only)—— 任何时候都能回过头重算「这批人后来做没做治疗」。
不是放弃了这个数据,是它不需要现在算。
⭐ 连带抓出并修掉一个**静默缺陷**(教条 T20′ 尾):
跟踪查询写的是 `where: { supersededAt: null }`,而引擎关闭走 closeStaleActivePlan ——
`status='superseded'` 且**不建后继版本** → 这些行整个消失。
本地实测(60 条批次,8 条已出池):旧口径 planned=52,新口径 60。
**批次跑得越好、数字缩得越厉害,而缩掉的恰恰是唯一算得上成功的那批。**
(D-12 无条件继承只保住了升版本那条路 —— 后继行继承 assignment_id;
关闭这条路没有后继行,继承救不了。R12 当时只想到了前者。)
正解:拿本批全部行、按患者取最新版本(升版本时新旧行都带 assignment_id,
max(version) 天然去重;关闭时最新版就是那条 superseded 行,正好是信号)。
五桶穷尽(resolved/suppressed/closed/inHandPending/backToPool),
done + inHandPending + backToPool 恒等于 planned —— 少一个分支就是静默丢人,
主管一对数发现少了几个、而少的那几个永远查不出去哪了。回归里锁着。
助手侧双保险:提示词 + 工具描述都写死「处理率不是成功率」,
⛔ 不许把 resolved 说成「转化成功」、⛔ 不许自己拿这些数算转化率;
报处理率必须带批次年龄(跑三个月的批次天然比跑三天的好看)。
本地真实验证(60 条批次 / 8 出池 / 5 抑制):
已处理 13 = 出池 8 + 抑制 5;在手未处理 31;回池 16
五桶求和 60 = planned 60 ✅ agentStats 各人之和 60 = planned 60 ✅
列表页与详情页同一批数字一致 ✅
958 tests passing;测试数据已清理。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| enums | Loading commit data... | |
| schemas | Loading commit data... | |
| utils | Loading commit data... | |
| canonical-codes.ts | Loading commit data... | |
| clinical-signals.ts | Loading commit data... | |
| host-action-message.ts | Loading commit data... | |
| index.ts | Loading commit data... | |
| kin-relationship.ts | Loading commit data... | |
| labels.ts | Loading commit data... | |
| persona-feature-specs.ts | Loading commit data... | |
| persona-tag-filters.ts | Loading commit data... | |
| temperature.ts | Loading commit data... | |
| visit-recency.ts | Loading commit data... |