assignment-progress.spec.ts
4.87 KB
-
feat(plan): S2.6 完成口径改判 —— 看池子状态,不等回写 · 124d3b19
产品裁决:「完成」不需要等成功,只要知道**这个患者的召回还在不在池、有没有被抑制**, 两者任一成立就说明这单处理过了。成功不成功先不统计。 否掉原案的「转化率」:它卡在 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>luoqi committed