docs(management): v2计划第五轮复查——回复率分子分母同源修正(P1#5)+配置种子等补充

- P1#5:宽表串类三列改由fact计算模块同源输出(串末条归属日),
  不再取msg_daily_stats日切聚合——混口径会使多日未回串膨胀分母,
  回复率低估甚至>100%;msg计数/负载列与串算法无关仍取msg_daily_stats
- P2/P3:Task3补默认配置v1.0种子落库;时效说明;metric_version默认v1;
  call_followup多账号语义进Task0核实;继承索引补v1 §12.1/12.2;
  测试补分子分母同源判据(reply_rate<=1/threads_answered≡fact行数)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-08 16:40:35 +08:00
parent 7a7eba766d
commit 8257086921
@@ -30,6 +30,7 @@
| 2 | **stat_daily_staff 是 friend+room 混合口径**:`sent/recv/threads/answered/fr` 五列聚合无 kind 过滤,群消息污染首响/回复率。v1 说「从 stat_daily_staff 拷贝」不可行 | `app/storage/staff_summary.py` `recompute_days` 聚合循环 | 宽表消息串类列从 msg_daily_stats 按 `peer_kind='friend'` **全量自算**(account_map 归并模式复用);管理页与现有看板排行的数字差异属口径不同,各自标注 |
| 3 | **「降温」定义冲突**:上游整合计划(`2026-09-08-yunke-data-intelligence-management-plan.md` §8.1/§15)降温=频次低于个人基线;现有 churn/客户资产分层=距今天数区间。两套「降温」会并存打架 | `app/analytics/metrics.py` churn 三分法 | 一期生命周期 4 列统一用**现有距今天数口径**;频次基线降温后置二期;差异写入 metric-definitions |
| 4 | **对账口径必须预写死**:fact(跨日精确)与 msg_daily_stats 三列(日切近似)即使 friend 口径也不相等,差集=跨夜闭合串 | 同 #1 | Task 2 验收断言:fact 样本集 ⊇ 日切被回串,差集=跨夜串;禁止相等断言 |
| 5 | **回复率分子分母必须同源**:v2 初稿宽表串类列(cust_threads 等)取自 msg_daily_stats 日切聚合,而回复率分子取自 fact(跨日)——多日未回串使日切分母膨胀,回复率被低估甚至 >100% | 本轮复查发现(#2 修正的连带遗漏) | 宽表串类三列改由 fact 计算模块**同源输出**(按串末条归属日的 threads/answered/fr_sum);msg_sent/recv 与 active_friends/rooms 与串算法无关,仍取 msg_daily_stats |
### 1.2 P2 级(性能/实现修正)
@@ -82,6 +83,7 @@
- 每个被回串一个样本:`fr_ms = 员工首条回复 ts − 串末条客户消息 ts`;
- 样本归属 = 串末条消息所在**上海自然日**(跨夜串不再丢失);
- 只写 `peer_kind='friend'`(1:1)行——群串语义不成立且占串数大头,不写;
- 模块同时输出**每日串聚合**(threads/answered/fr_sum,同按串末条归属日)供宽表消费——回复率分子分母同源(§1.1 #5);
- 按会话全历史计算,幂等模式=按会话 delete+insert。
**表结构**:
@@ -109,8 +111,10 @@
```text
PK: (day, channel, user_id, metric_version)
1:1 消息列(自算,friend 过滤 + account_map 归并):
msg_sent, msg_recv, cust_threads, threads_answered, fr_sum_ms
消息计数列(msg_daily_stats 自算,friend 过滤 + account_map 归并;与串算法无关):
msg_sent, msg_recv
串类列(fact 计算模块同源输出,跨日精确、按串末条归属日——与回复率分子同口径):
cust_threads, threads_answered, fr_sum_ms
负载列:
active_friends(1:1 distinct 客户), active_rooms(distinct 群)
首响日值(趋势图用,从 fact 算):
@@ -131,7 +135,9 @@ PK: (day, channel, user_id, metric_version)
- `activated_customer_count` 一期不做:「有效激活」定义是 v1 §21 #4 未决口径(几轮互动/几天窗口),随二期频次基线生命周期一起定义;
- `customer_threads` 更名为 `cust_threads`(与 msg_daily_stats/stat_daily_staff 现有列名对齐)。
**metric_version 语义**:只影响**派生列**(分位/生命周期/通话跟进);消息拷贝列与版本无关。算法演进时新版本并行落表不覆盖旧数据。
**metric_version 语义**:只影响派生列(生命周期/通话跟进的算法口径);消息计数与串类事实列与版本无关。默认值 `v1`,算法演进时新版本并行落表不覆盖旧数据。
**时效说明**:宽表内消息计数列随写钩子近实时(msg_daily_stats),串类列随 fact 重算(4h/夜间)——同表两种时效;computed_at 取宽表生成时间,data_complete 标注 fact 是否已覆盖当日。
**评分用周期值的计算来源**(不在宽表存储):周期 P50/P90、2h/24h 回复率一律从 fact 表精确计算(SQL 窗口函数),宽表日值仅供趋势展示。
@@ -163,7 +169,8 @@ message(按会话全历史,跨日精确算法) [新 storage/first_r
→ first_reply_fact
│
└─→ employee_metric_daily [新 storage/employee_metrics.py:
msg_daily_stats(friend) + fact + customer + phone_call]
msg 计数(msg_daily_stats,friend) + 串类/分位(fact 同源)
+ customer 生命周期 + phone_call]
→ 期聚合/四对比(上期/个人基线4周/团队中位数)
→ 试算评分 + 异常规则 [management/]
→ 周/月快照(不可变) [management/snapshots]
@@ -226,10 +233,10 @@ message(按会话全历史,跨日精确算法) [新 storage/first_r
| 任务 | 内容 | 相对 v1 的变化 | 估时 |
|---|---|---|---|
| Task 0 | 口径冻结:回测员工名单(3-5 名覆盖微信为主/WA 为主/群为主/高负载/低样本)+ 默认配置落库 + **四项核实**(phone_call 表结构与客户标识 join 键、customer 归属字段与换人规则、员工主数据来源、群占比抽样量化混合口径偏差) | 默认值已确认,工作量缩减 | 0.5 天 |
| Task 0 | 口径冻结:回测员工名单(3-5 名覆盖微信为主/WA 为主/群为主/高负载/低样本)+ 默认配置落库 + **五项核实**(phone_call 表结构与客户标识 join 键、call_followup 多账号语义——员工任一账号跟进即算、customer 归属字段与换人规则、员工主数据来源、群占比抽样量化混合口径偏差) | 默认值已确认,工作量缩减 | 0.5 天 |
| Task 1 | 5 张表模型 + migration + 模型冒烟测试 | 6→5 张表;核实项前置完成 | 1-1.5 天 |
| Task 2 | fact 独立计算模块(跨日精确算法)+ 宽表生成(friend-only 自算+生命周期+通话)+ 生命周期共享函数提炼(analytics 调用点不动)+ 两条回填 CLI | **删除「_thread_stats 兼容扩展」**(不再需要);验收含对账判据(§1.1 #4)+ 写钩子零改动确认 | 2.5-3.5 天 |
| Task 3 | scoring.py:归一化/四对比/样本保护 + 配置校验 | 含 100/70 归一试算逻辑 | 2 天 |
| Task 2 | fact 独立计算模块(跨日精确算法,同源输出每日串聚合供宽表)+ 宽表生成(消息计数 friend 自算+串类取 fact+生命周期+通话)+ 生命周期共享函数提炼(analytics 调用点不动)+ 两条回填 CLI | **删除「_thread_stats 兼容扩展」**(不再需要);验收含对账判据(§1.1 #4/#5)+ 写钩子零改动确认 | 2.5-3.5 天 |
| Task 3 | scoring.py:归一化/四对比/样本保护 + 配置校验 + **默认配置 v1.0 种子落库**(受控 CLI,Task 11 快照的前置依赖) | 含 100/70 归一试算逻辑 | 2 天 |
| Task 4 | anomalies.py 规则集 | 数据源:fact(P90 恶化)、B2(待回复增长)、宽表(骤降/过载) | 1 天 |
| Task 5 | 管理 API(dashboard/employees/detail/metrics/drilldown/metric-definitions) | 窗口函数分位 + 性能目标 | 2-3 天 |
| Task 6 | 前端公共组件与路由(api/management.ts、useManagementFilters、components、router、MainLayout) | 按文档 | 1.5-2 天 |
@@ -264,6 +271,7 @@ message(按会话全历史,跨日精确算法) [新 storage/first_r
- **口径判别**(P1#2 防线):seed 同员工 friend+room 两类会话,断言宽表 1:1 列不含 room 串;
- **分位数精确性**:构造已知 fr_ms 集合,断言周期 P50/P90 精确值;窗口函数 SQLite/MySQL 双方言一致;
- **fact 超集断言**(P1#4):fact ⊇ 日切被回串,差集=跨夜串,不做相等断言;
- **分子分母同源**(P1#5):任意窗口 reply_rate ≤ 1;宽表 threads_answered ≡ fact 行数(同窗口);存在多日未回串时宽表 cust_threads < 日切口径值(分母不再膨胀);
- **fact 回填幂等**:重跑不重不漏;
- **快照不可变**:冻结后 PATCH 拒绝(后端强制);
- 评分边界:正/反向指标、阈值边界、权重合计、样本不足不评分、空值≠0、缺失维度不默认 0/100;
@@ -294,6 +302,7 @@ message(按会话全历史,跨日精确算法) [新 storage/first_r
- 页面内容细则:v1 §5-§9(驾驶舱布局/KPI 卡清单、员工总览六视图、员工详情页签、快照页、二三期概要);
- 评分标准化公式与等级:v1 §10.2/§10.4;
- 后端模块目录与分层职责:v1 §12.1/§12.2(其中 storage 两模块以本文 §3/§4 为准);
- API 通用响应约定全文:v1 §12.4;
- 前端可视化规范全文:v1 §13.4;
- 验收标准:v1 §19;