交付出件箱

← 返回出件箱

机构洞察 v2 · 代码交付自检报告(待长官逐条检查)

分支 feature/org-insights-rebuild(基线 origin/test @ 772c8117)· 2026-08-20 · dev3 东京云机
长官令:1+2+3 批全做到前端 · 阈值做配置表 + 读写接口 · 文案用「建档 N 天」· 暂不发 test


一、一句话结论

原型 v14 的三批改造已全部落码并全流程贯通(库表 → 服务层 → 接口 → 前端 → 测试),
唯一挂起的是第 1 批里的「4 处埋点补 channel」—— 长官定了先去 test 跑 SQL 再决定,我没动它。

本机跑不了任何测试(后端无依赖且装不下、前端无 node_modules),所以下面凡是写「已验证」的,
都是静态验证并贴了命令;凡是跑不了的,一律标「未验证」,没有一条是推断冒充的。


二、全流程贯通(改了什么,按数据流向)

层 文件 动作
库表 migrations/versions/org_insight_thresholds.py(新) 单行阈值表 + 7 条 CHECK + 同 commit 落默认行
模型 app/models/activity.py +45 行 OrgInsightThresholds(加进 Phase 52 同族,不新建文件)
注册 app/models/__init__.py import + __all__
服务 app/services/org_insight_service.py(新 · 533 行) 8 条分组聚合 + 8 状态判定 + 证据/动作/紧迫度排序 + 总览卡/频率分档
接口 app/api/admin_activity.py 重写 GET /org-insights;新增 GET/PUT /org-insights/config
前端 web/app/(dashboard)/admin/org-insights/page.tsx(786 行) 整页重构:四卡筛选器 / 警示条 / 分段柱 / 状态分诊 / 频率分档 / 口径抽屉
测试 tests/api/test_admin_activity.py、web/__tests__/org-insights-page.test.tsx 按新契约重写(未跑)

三、原型三批逐条落实(缺陷编号对应「严打 verify」那轮的坐实结论)

第 1 批

第 2 批

第 3 批(前端)


四、我做的判断,需要长官确认(这几条我自己拍的,可能要改)

  1. 三个时间窗一律以「昨天」收尾(日 = 昨天;周 = 昨天往前 7 天;月 = 昨天往前 30 天)。
    原型只写了「日 = 昨天」「周/月 = 最近 N 天滚动」,没说周/月含不含今天。我按「不含今天」统一,
    否则日窗和周窗长度口径不一致、横向比较失真。如果长官要周/月含今天,我改一行。
  2. 契约破坏性变更:响应里删掉了 cards / lens / conv / risk / up。仓库内消费方只有这一个页面
    (已 grep 全仓确认),但如果外部有人直接调这个接口,会炸。
  3. 「已流失」只按席位到期判,没把「机构被人工停用」算进去 —— 因为名单本身只取 is_active=true,
    停用机构压根不进榜(与原型核对页第 ① 段 SQL 口径一致)。
  4. 「数据不可信」的第二条判定用的是「有启用中的接口凭据 且 全时段 0 记录」,
    数据源是 api_credentials.is_active(决定 ③ 说的「凭据信息是现成的」)。
  5. miniapp 单列了第四色但示意数据没有;原型说「实施时按实际有无决定」,我选了列出来(有就显示,没有就 0 宽度不占位)。

五、验证矩阵(2026-08-20 12:0x 更新 · 已在云机本地真跑)

长官令「模拟 test 环境跑一遍」后补做。这是云机本地模拟,不是 test 环境验收:
数据是脚本造的,不是真实业务数据;但 PG / ORM / router / JWT / 迁移全是真的,0 mock。

跑起来用了什么(经长官批准装,全部 pip install --user,不动系统、不碰其他 dev):
最小依赖 sqlalchemy/asyncpg/pydantic/fastapi/httpx/pytest + pgserver(自建 PG 实例,
socket /home/dev3/pgdata3)+ redis/psycopg2/pgvector/jose/alembic。未装 torch/paddle/faiss。

⚠️ 过程中发现共享 PG(dev2 起的 5432)当前是坏的:/dev/shm 今天 04:22 被清空,
其 DSM 段丢失,所有新连接报 could not open shared memory segment。认证是通的(trust 属实),
是服务端状态问题。我没碰它,另起了自己的实例。

项 结果 证据
鉴权(真 JWT 验签) ✅ 无 token → 401;admin token → 200
8 状态判定 ✅ 10/10 全对 healthy / renew_window / cliff / untrusted×2 / no_seat / never_active / churned / low_util / worth_digging
缺陷 1(0 活动机构在榜) ✅ 从未激活、未配席位两家都在 ranking 里
状态优先级排序 ✅ 不可信 < 续费窗口 < 断崖 < 正常
admin 事件剔除 ✅ 造 99 条 admin_view,本月计数仍是 42(不是 141)
原始数字口径 ✅ 上周 42 / 剩余到期 4 天 / 报告 10→方案 5 / 标价 5000 / 在用席位 2/2
契约无分数字段 ✅ conv、risk 均不在响应里
总览四卡 + 警示 + 分档 ✅ 月卡「无上期」为 null;警示点名成功;分档家数 = 榜单家数
阈值配置表读写 ✅ GET 默认 30 → PUT 3 → 存住 → 主接口生效 → mid≥high 自动压到 3 → 该机构状态随之改变
N+1 消除 ✅ 实测恒定 机构 8 家 → 33 家,SQL 均为 9 条(旧实现 33 家 ≈ 297 条)
alembic 迁移真跑 ✅ upgrade 建表 + 默认行 (5,2,30);单行 CHECK 拒 id=2;范围 CHECK 拒 99;downgrade 回滚干净;可重复执行
仓库 pytest 全套 ❌ 跑不了(已坐实) app.main 依赖链一路要到 faiss(GB 级),按长官边界停手未装
前端 vitest / tsc / 渲染 ❌ 未跑(长官定:留到 test 验) web/node_modules 未装

真跑抓出并已修的 2 个问题

  1. 🔴 在用席位可能超过席位总数(真缺陷):活动流水里的 actor_id 若指向已删席位或脏数据,
    会算出「在用席位 3/2」→ 利用率 >100% → 低利用判定失真。
    修法:新增一条现存席位名单查询,在用席位只统计该机构当前还存在的席位(不是简单截断)。
    代价:聚合查询从 8 条变 9 条,仍与机构数无关。
  2. ⚠️ 我文档写错了口径:原写「8 条聚合查询」,实测是 9 条 —— 已把服务层和接口注释一并改正。

(另有 1 项是我断言写错、代码没问题:断崖机构的 42 次落在上一个 7 天,而分段构成看的是本周窗,
本来就该是 0。已改成用「本月计数 = 42 不是 141」来证明 admin 剔除。)

复现脚本存于 ~/reports/e2e-scripts/(e2e_org_insights.py / e2e_nplus1.py / e2e_migration.py)。

五之二、第二轮认真自检(长官 8-20 令「务必全流程贯通」后补做)

结果:67 项断言全绿(38 + 23 + 1 + 5),连跑两轮、两种顺序,互不污染。

自检抓出并修掉的 4 个问题

# 类型 问题 修法
1 🔴 前端真 bug 「近一月不活跃」窗下柱子整条空白 —— 该窗每个来源段都置 0,走了分段分支就什么都不画,连「N 席空置」文案也不出 该窗单独画一条橙色「空置席位」条,宽度按席位数归一;数值列改写「N 席空置」
2 🔴 前端真 bug 口径抽屉会静默改坏用户配置 —— 初值取的是主接口里已被压制过的 thresholds(用户存 mid=6,显示成 3),一保存就把 6 覆盖成 3 抽屉一律单独 GET /config 读库里原值,不用主接口的生效值
3 ⚠️ 测试卫生 我自己的两套测试互相下毒:深度套把阈值 PUT 成 21 没还原,主干套再断言「默认 30」就挂 深度套跑完还原默认值 + 加一条断言钉住;连跑两轮两种顺序验证
4 ⚠️ 文档撒谎 我改过的两个文件里,模块 docstring 还在写「三榜 conv/risk/up + 公式手算断言」 已改成新口径,并注明取消原因

第二轮新覆盖的分支(第一轮没测到的)

权限与入参:席位 token → 403 · 非法 range → 422 · 阈值超范围 → 422
频率分档:用满 6/3/1/0 天 → high/mid/low/idle 四档全对
其余分支:机构表旧兼容凭据也算「系统看不见」· 超 30 天窗仍报得出「最后活动 45 天前」·
建档天数 60 · 部分席位过期 ≠ 已流失 · miniapp 单列计数 · 日窗确实只算昨天(10 次,不含前天的 4)·
30 天折线长度与合计 · 日卡「比前一天」增减 · range 参数真起作用(45 天前的方案:7d 窗 0 个 / 90d 窗 1 个)·
配置行被删后 GET 不炸且 PUT 能自愈建行 · 配置表恒单行 · admin_view 审计事件真落库

仍然没有运行证据的两处(不粉饰)

一个流程缺口,需要长官定

这次重写没有任何 Phase 文档记录:它改的是 Phase 52 的产物,而 Phase 52 在进度表里是 ✅ 完工状态,
按项目规矩「禁止修改 ✅ 的 Phase」,我不能去改它的历史记录。
所以现在是「代码改了、文档体系里查不到这件事」。要不要按需求变更流程立个新 Phase,请长官定。

五之三、发版记录(2026-08-20)

浏览器验收清单(请长官或成员执行)

进 https://test.tongban.love → 平台管理 → 机构洞察

  1. 四张活跃度卡出得来,点任一张下面柱状图跟着切,卡上出现「✓ 下面正在看这个」
  2. 点「近一月不活跃」→ 柱子变成橙色空置席位条,数值列写「N 席空置」(这处是自检抓出的 bug,重点看)
  3. 机构行有状态标签(正常/续费窗口/断崖…)+ 证据列表 + 建议动作 + 「建档 N 天」
  4. 页面上不该再出现:任何「XX 分」、「续费概率 · 待 Phase 53」、「转化价值」
  5. 右上「调整口径」→ 改一个值 → 保存 → 刷新页面再打开,值还在 ←
    这一步同时间接证明迁移在 test 库真的建了表并落了默认行(我查不了 test 库)
  6. 展开某一行 → 日/周/月 次数与在用席位、30 天迷你折线

(等长官发话)

  1. 长官逐条检查本报告 + 代码(我可以按文件贴 diff)
  2. 第四节那 5 条判断,要改的告诉我
  3. 挂起的埋点 channel:核对页第 ② 段 SQL 需要在 test 真库跑,我出脚本、长官或有权限的人执行
  4. 检查通过后才谈发版(本轮不发 test,按长官令)