chore(docs): Wave 0 调研产出 + P0/P1/P2 反馈调研

建立项目级标杆文档 docs/_overview/ 作为产品全景索引,
解决"PRD 零碎、文档膨胀、跨子系统调研无入口"的问题。

主要内容:
- 00-index 总索引 + 维护协议 + 与 CLAUDE.md 关系
- 01-product-overview 产品全景脑图(6 角色 / 6 子系统 / 数据流 /
  7 业务概念 / 8+1 AI 矩阵 / 22 术语)
- 02a-miniprogram-page-matrix 小程序 21 页业务指纹
- 02b-adminweb-page-matrix admin-web 19 路由业务指纹
- 03-test-spec 测试规范 (L1-L5 分层 + 走查模板 + 75-95 case 估算)
- 04-doc-conflicts 39 条冲突索引(P0×8 / P1×13 / P2×13 + 5 子项)
- 04a/b/c-conflicts-*-detail 业务故事卡(7 字段:关联/逻辑/影响/选项/判定)
- 05-orphan-pages-cleanup admin-web 6 孤儿页面处置(1 归档 + 4 保留)
- WAVES-MASTER-PLAN.md 全 Wave 主计划(0-5,共 22-32 工作日)
- WAVE-1-KICKOFF.md Wave 1 实施 kickoff
- GLOBAL-DECISION-DASHBOARD.md 全局决策仪表板

反馈调研产物:
- 04a-feedback/ P0 两轮反馈(8+8 项决策 + D-1/2/3 + F-1/2 子代理产出)
- 04b-feedback/ P1 两轮反馈(13+1+5 项 + E-1/2/3/4 + G-1/2 子代理产出)
- 04c-feedback/ P2 反馈(13 项 + 5 子项 + H-1/2/3 子代理产出)
- NEO-DECISIONS-LOG 累积决策记录

关键追加发现 8 处 D Bug(原蓝本 0):
- P0-3 看板沙箱接入(Wave 1 W1-T1)
- P0-5 致命 1 (4 处 fdw_etl 残留, 已修 commit 17f045a)
- P0-5 致命 2 (JWT aud 缺失, 已修 commit 17f045a)
- P0-6 clearAllTasks 守卫 (Wave 3)
- P0-8 DBViewer 黑名单漏 (已修 commit 17f045a)
- P1-3 task-detail 跳转传 task_id 而非 customer_id
- P2-7 board-finance 隐式 null
- 2 个独立 Bug (page_context.created_at + ClueCategory 字典)

参考: docs/_overview/00-index.md
This commit is contained in:
Neo
2026-05-04 07:38:28 +08:00
parent c6453829a6
commit 509cf43284
44 changed files with 10789 additions and 0 deletions

View File

@@ -0,0 +1,186 @@
# P0-7 P20 SPEC 成果层验证覆盖 — 校验报告
> 日期:2026-05-04 / 触发:Neo 在 P0 反馈强调"成果层(用户视角)是最终成功标准"
> Neo 原话:"对于我而言,最终用户看到的页面/小程序是否真正达到设计目标更为重要,因为你要对最终成功负责,而客户也最看重最终使用的效果"
## 一、Neo 关心的 3 个核心问题
1. **工程层 vs 成果层分层验证** — P20 SPEC 是否两层都覆盖?
2. **admin-web 6 页 + AIPrewarm 分组 Playwright 实地走** — 是否落到 SPEC 验收?
3. **小程序财务看板 area 切换 / AI 洞察 / runtime-clock 漂移 / 各页面数据展示是否符合预期** + **任务板块多角色身份切换**(看板收口后) — 是否落到 SPEC 验收?
## 二、当前 P20 SPEC 覆盖状态(逐条核对)
### 2.1 §8 验收标准(AC1-AC13)分类
| 类别 | AC | 内容 | 视角 |
|---|---|---|---|
| 工程层 | AC2/AC3/AC4/AC6/AC8/AC9 | SQL / curl 验证 | **工程层** |
| 工程层 | AC11/AC12/AC13 | 自动化脚本 / 手工 | **工程层(标 todos 未实施)** |
| 半成果层 | AC1 | "登录小程序看 performance / task-list 当月判断" | **散点提及,无走查流程** |
| 半成果层 | AC5 | "admin-web `/logs/ai-run-logs` Drawer 抽屉" | **散点提及** |
| 半成果层 | AC7 | "admin-web `/ai/dashboard` 视觉验证" | **散点提及** |
| 半成果层 | AC10 | "普通账号登录视觉验证" | **散点提及** |
**结论**:
-**没有专门的"成果层走查"章节**
- ❌ admin-web 6 页(AI Dashboard / Operations / RunLogs / Triggers / RuntimeContext / TriggerManager)+ AIPrewarm 分组 **没有作为 AC 列出**
- ❌ 小程序看板沙箱接入(P0-3 主体) **AC 中只字未提**
- ❌ 任务板块多角色身份切换 **没有 AC 覆盖**
### 2.2 §10 跨模块覆盖矩阵
§10 矩阵列出"哪些模块已接入 runtime context"(代码层覆盖),不是"用户视角走查清单"。
§10.3 小程序页面表标了 `?` 的 3 项(board-finance / board-customer / board-coach)正是 P0-3 沙箱看板接入未完成的指针,但**没有走查脚本 / 步骤 / 期望结果模板**。
### 2.3 §12 任务清单(T1-T15)
| 任务 | 视角 |
|---|---|
| T1-T7 | 工程层(迁移 / API / 服务 / 视图) |
| T8 | `verify_sandbox_end_to_end.py` 自动化 — **自动化工程验证** |
| T9 | admin-web Playwright e2e 13/13 PASS — **半成果层**,但只覆盖 1 个页面(RuntimeContext) |
| T10 | BD_Manual + 6 份 changes 审计 — 工程层 |
| T11-T15 | 生产迁移 / 跨模块测试 / 清理脚本 / 多门店 / 实例浏览页 — 工程层 + 部分成果层 |
**结论**:T9 只覆盖 1 个 admin-web 页面(RuntimeContext),**Neo 要求的 6 页 + AIPrewarm 没覆盖**。
## 三、缺失项汇总(给 Neo 答复)
**代码层 lint / typecheck / 架构** — P20 §1.3 / §10 / §11.1 已覆盖,**无需补充**
**admin-web 6 页 Playwright 走查****未覆盖**,需要补
**AIPrewarm 分组走查****未覆盖**,需要补
**小程序看板沙箱走查**(area 切换 / AI 洞察 / runtime-clock 漂移) — 仅 §10.3 标 ? 未走查 / §13 已知冲突标"未验证",**没有走查脚本**
**小程序各页面数据展示符合预期****未覆盖**,需要补
**任务板块多角色身份切换走查**(看板收口后) — **未覆盖**,需要补
## 四、推荐 P20 SPEC § 15 patch(成果层验证章节)
**不实际修改 P20 SPEC,只列出建议增加的章节内容**,让 Neo 先看再决定是否落地。
### 建议在 P20 SPEC 末尾增加:
```markdown
## 15. 成果层验证(User-facing Acceptance)
### 15.1 验证哲学
工程层(代码/调用链/迁移)是必要的根基,但**不是终点**。最终用户看到的页面/小程序数据是否符合设计目标,才是项目成功标准。
视角分两层:
| 层级 | 验证目标 | 工具 | 通过标准 |
|---|---|---|---|
| 工程层 | 代码可运行 / 调用链通 / 迁移落库 / lint/typecheck 过 | tsc / pytest / SQL | 自动化全绿 |
| **成果层** | **页面渲染对 / 数据准确 / 交互流畅 / 角色权限对** | **Playwright + 微信开发者工具** | **逐条手工 + 截图归档** |
### 15.2 admin-web 走查清单(Playwright MCP)
每条走查 = 设置 sandbox 时间(2026-03-01) → 打开页面 → 截图 → 对照"期望展示"。
| # | 路由 | 期望展示 | 走查重点 |
|---|---|---|---|
| 15.2.1 | `/dashboard` | 顶部 sandbox 模式条带高亮 + 数据为 sandbox_date 当时数据 | 切 sandbox 后是否立刻显示"沙箱模式" + 数据是否切到虚拟日 |
| 15.2.2 | `/ai/dashboard` | 7 天趋势按真实日期(沙箱不影响)、今日/累计 token 按真实 | AC7 已要求,但要补充实地走查截图 |
| 15.2.3 | `/ai/operations` | 8 个 APP + app2a 区域财务派生 列出 / 手动触发 → 沙箱模式下日期参数对 | 触发 1 次 app2_finance,看 AI 输入是否带 sandbox_date |
| 15.2.4 | `/ai/run-logs` | 历史日志按真实写入时间排序;Drawer 抽屉显示 prompt 中的 sandbox_date | AC5 已要求,补 case |
| 15.2.5 | `/ai/prewarm` | 分组展示 area=all 8 组合 + 8 area 64 组合 = 72 / 沙箱模式下不影响预热范围 | 走查 prewarm 在 sandbox 下是否仍按真实 area 跑 |
| 15.2.6 | `/triggers?tab=ai` | AI 触发器列表 / status / cron 编辑 | 沙箱模式下显示"触发器仍按真实时钟运行"提示 |
| 15.2.7 | `/triggers?tab=biz` | 业务触发器列表 / 任务生成器 cron 7:00 | 同上 |
| 15.2.8 | `/settings/runtime-context` | 切 sandbox / 历史日期选择 / 切回 live | 完整切换流程,验证 AC1-AC4 |
| 15.2.9 | `/logs/dev-trace` | (Neo 反馈推荐 Drop,本走查可省) | 跳过 |
| 15.2.10 | `/logs/db-viewer` | SELECT 查询正常 / DDL 拒绝(P0-8 修复后) | 验证 P0-8 白名单 |
### 15.3 小程序走查清单(微信开发者工具 MCP)
前置:打开微信开发者工具 + 启用 9420 自动化端口 + 以教练身份登录。
| # | 页面 | 期望展示 | 走查重点 |
|---|---|---|---|
| 15.3.1 | `task-list` | 任务列表按 sandbox_date 当月生成 | AC1 已要求 |
| 15.3.2 | `performance` | 月度统计反映 sandbox_date | AC1 已要求 |
| 15.3.3 | `performance-records` | 4 处时间过滤反映 sandbox_date | (T7 任务) |
| 15.3.4 | `customer-records` | onLoad 拿 sandbox_date 拉历史 | (T7 任务) |
| 15.3.5 | `customer-service-records` | onLoad 拿 sandbox_date 拉历史 | (T7 任务) |
| **15.3.6** | **`board-finance`** | **area 5 区域切换 / AI 洞察 12 项指标 / 折线图横轴为虚拟近 7 日** | **P0-3 主体,Wave 1 必修** |
| **15.3.7** | **`board-customer`** | **客户分层基于 sandbox_date 截止状态** | **P0-3** |
| **15.3.8** | **`board-coach`** | **助教绩效反映 sandbox_date 当月累计** | **P0-3** |
| 15.3.9 | `customer-detail` | 操作时间戳保留真实时钟(设计共识) | §11.1 |
| 15.3.10 | `chat` | AI 对话 prompt 含 sandbox_date / 操作时间戳保留真实时钟 | AC5 |
### 15.4 跨页时间漂移走查(AC12 实地化)
走查脚本:连续打开 10 个页面,各拉一次 `business-clock`,验证返回值在 60s 缓存窗口内一致。
### 15.5 多角色身份走查(看板收口后)
**前置**:看板沙箱接入完成(15.3.6 / 15.3.7 / 15.3.8 全部通过)。
**触发提醒**:在 §15.3.6/7/8 全部 PASS 时,在审计中标"提醒 Neo:可以切换用户身份做下一轮走查"。
走查矩阵:
| 身份 | 必走页面 |
|---|---|
| 教练 (coach) | task-list / performance / performance-records / 看板 3 页 |
| 顾问 (consultant) | task-list (无看板权限) / customer-records / chat |
| 散客模式(memberId=0) | customer-service-records 中"散客无详情"提示 |
| site_admin (admin-web) | /settings/runtime-context |
| tenant_admin (tenant-admin) | tenant-admin 主面板 |
每身份完整走完 + 截图归档。
### 15.6 走查产物
每次走查产出一份 `docs/audit/changes/2026-XX-XX__sandbox_acceptance_<wave>.md`,内容:
- 截图清单(按 §15.2 / §15.3 编号)
- 失败项明细(现状 / 期望 / 复现步骤)
- 通过率 / 总耗时
---
(以上为 § 15 建议内容,不在本次直接落入 P20)
```
## 五、推荐落地路径
### 选项 A — 直接补到 P20 SPEC §15(推荐)
- 工作量:30 分钟,主线把上述 § 15 写入 P20
- 优:SPEC 完整,Wave 1 走查时直接照 § 15 跑
- 劣:P20 SPEC 行数从 ~480 涨到 ~580+
### 选项 B — 单独成一份《沙箱成果层验证手册》
- 路径:`docs/_overview/sandbox-acceptance-runbook.md`
- 优:与 P20 SPEC 解耦,走查手册可独立迭代
- 劣:跨文档维护,需要在 P20 SPEC 加链接
### 选项 C — 先列 todos,Wave 1 走查时即时补
- 把"成果层走查清单"作为 Wave 1 的隐式任务,边走边写
- 优:零前期工作
- 劣:无判据,Wave 1 走查时容易遗漏
## 六、给 Neo 的决策清单
1. **是否同意 P20 SPEC 缺失"成果层走查"章节的判断?**(我判断:**缺失**)
2. **选 A / B / C?** 我的推荐:**选 A**(直接补到 P20 §15),与 P20 实施同步
3. **15.5 多角色身份走查的提醒机制**(看板收口后由我主动提醒 Neo 切身份)是否合适?
4. **15.2 admin-web 走查 9 页(Neo 原列 6 页 + AIPrewarm + RuntimeContext + db-viewer)**是否完整?是否需要再加 `/tenant-admins` / `/etl-tasks`?
## 七、关于"工程层根基已落地"的确认(回答 Neo)
Neo 担心的 "代码层面的 lint/typecheck 是否过,架构是否合理" — **P20 SPEC 已落地**:
- §10 跨模块覆盖矩阵(13 后端服务 + 8 AI prompts + 11 小程序页 + 4 ETL 视图)
- §11 已知遗漏 + 设计共识
- §12 任务清单 T1-T10 已完成
- §13 已知冲突清单
- 工程层 lint/typecheck 由 hooks(`PostToolUse Edit/Write`)自动跑
**所以工程层根基 OK,只缺成果层走查这一层**,选 A 直接补完即可对齐 Neo 的"对最终成功负责"标准。
---
> 本文件不实际修改 P20 SPEC,只产出建议 patch + 决策清单。等 Neo 选 A/B/C 后落地。