# P0 反馈响应总报告(第二轮)

> 日期:2026-05-04 / 触发:Neo 在 `00-P0-feedback-response-summary.md` 表格里写下斜体二轮反馈
> 主线 + 2 个子代理(F-1 沙箱+SPI / F-2 工程规范一致性)调研整合 / 状态:**调研完成,等 Neo 拍板进入实施**

本报告聚合第二轮 6 条 P0 反馈处理状态。第一轮总报告见 [`00-P0-feedback-response-summary.md`](00-P0-feedback-response-summary.md)。

## 一、第二轮 6 条 P0 反馈处理状态

| # | 二轮反馈摘要 | 调研产出 | 关键结论 | 等待 Neo 决策 |
|---|---|---|---|---|
| **P0-1** | 沙箱+SPI 每天快照?是否合理?更优雅方案? | [P0-1-sandbox-snapshot-design.md](P0-1-sandbox-snapshot-design.md) | **不需要每日快照**;SCD2 区间方案更优雅;只需让 ETL 改 3 处 SQL 走 `app.v_cfg_*` 视图(0.5 天) | 接受方案 1?P20 SPEC 加 §1.4/§3.5/§5.6/AC14-15/§11.2/T16-T17? |
| **P0-2** | 同意"主+副"方案 | (已确认) | Wave 5 落地 | 已确认 |
| **P0-3** | 同意,等 Wave 0 完成后,Wave 1 据 Wave 0 更新 | (已确认) | **Wave 0 即将收尾,Wave 1 计划基于本轮 P0/P1 反馈更新** | 已确认 |
| **P0-5** | 倾向工程一致性,要全览 + 实施方案 | [P0-5-engineering-consistency-overview.md](P0-5-engineering-consistency-overview.md) | **24 个偏离点 / 14 规范** + **2 个关键发现:4 处必坏残留 + JWT aud 缺失** | 接受统一治理方案?立即治理 6 项进 Wave 1-3? |
| **P0-6** | 同意,要记录 | [P0-6-record.md](P0-6-record.md) | 两阶段方案:阶段 1 临时止血 1h / 阶段 2 沙箱收口后正式重设计 3-5h | 已确认 |
| **P0-7** | P20 SPEC 是否覆盖成果层走查?(Playwright 6 页 + 微信开发者工具看板 + 切身份)| [P0-7-spec-acceptance-layer-check.md](P0-7-spec-acceptance-layer-check.md) | **成果层走查严重缺失**;给出 P20 §15 完整 patch | 选 A(直接补到 P20)/ B(单开手册)/ C(走查时即时补) |

## 二、5 件 Neo 必须知道的事(浓缩版)

### 1. P0-1 — 不需要每日快照,SCD2 视图入口更优雅(0.5 天工作)

F-1 调研结论:
- **每日参数快照不需要**(成本高,数据冗余)
- **SCD2 区间已存在**(`cfg_index_parameters / cfg_level_price / cfg_performance_tier / cfg_bonus_rules` 等 4 张表已有 effective_from/effective_to)
- **核心裂缝**:P20 视图层已加业务日上界,但 ETL 任务**直读 `dws.cfg_*` 裸表绕过视图**
- **修复方案**:让所有读取入口走 `app.v_cfg_*` 视图,3 处 SQL 改造 + 修复一个 NULL 兼容 bug,**0.5 天工作量**

**意外收获**:`base_dws_task.py:540-581` 工资任务 3 个 `_load_*` 函数不带 `effective_from`,把所有历史区间行全取出再 Python 挑 — **既是历史 Bug 又是沙箱缺口**,需要一并修。

**应增加到 P20 SPEC 的 6 处**:§1.4 沙箱影响项 / §3.5 NULL 兼容 / §5.6 ETL 读取约定 / AC14-AC15 / §11.2 hack / T16-T17 任务。

### 2. P0-5 — 24 个偏离点,2 条致命发现

F-2 全项目扫出 24 个工程规范偏离点。**最严重的 2 条要立即修(D Bug)**:

#### 致命 1:4 处"伪 FDW"必坏残留代码

文件:
- `apps/backend/app/routers/tenant_users.py:425, 450`
- `apps/backend/app/routers/tenant_excel.py:390, 407`
- `apps/backend/app/routers/tenant_clues.py:113-119`

**症状**:
- 用 `get_etl_readonly_connection(site_id)` 已经直连 ETL 库
- 但 SQL 仍写 `FROM fdw_etl.*`(因为 H2 改造时漏改)
- **生产必报 schema 不存在**,被 try/except 静默吞
- 接口永远返回空列表,用户看不到错误

**与 P0-5 主体同源同性质,但危害更高**(因为用户看到的是"空数据"而非"报错")。

**修复**:每处把 `fdw_etl.` 改为对应 ETL 库 schema(`dwd.` 或 `app.`),不补 FDW(P0-5 主体已结论 FDW 不能用 GUC)。**1-2h 工作量**。

#### 致命 2:JWT aud 缺失,跨端横向越权风险

文件:`apps/backend/app/auth/jwt.py`

**症状**:
- 签发 admin / miniapp token **完全不带 `aud` 字段**
- `decode_access_token` 也不校验 aud
- 只有 tenant-admin 走完整 aud 流程
- **意味着 admin / 小程序 token 在 payload 层无法区分,跨端横向越权风险**
- CLAUDE.md 规范 R5(JWT 三类 aud 严格隔离)与代码完全脱节

**修复**:`generate_access_token` 加 `audience=` 参数,`decode_access_token` 校验 aud。**2-3h 工作量** + 跨端 token 兼容性测试。

#### 24 偏离点全分布

| 优先级 | 数量 | 主要内容 |
|---|---|---|
| **立即治理 P0** | 6 | 4 处 fdw_etl.* 必坏 / JWT aud 缺失 / 测试目录嵌套违规 |
| Wave 协同 | 6 | matching/business_date 透传 / ETL 写连接 / consume_money 划线价 / note_service 调度 / 测试 DSN 加载 / camelCase 一致性 |
| 长期治理 | 5 | global_readonly 无 RLS / DWS 双 schema 30+ 缺失 / 飞球 API 硬编码 |
| 可接受归档 | 4 | consume_money 零值判定 / SSE 直调 DashScope / tenant_member_id 映射 / demo AGENTS.md |
| 其他 | 3 | (调研中归类) |

**给 Neo 的核心提问**:接受立即治理 6 项进 Wave 1-3 吗?(其中 2 条致命 D Bug 不修会影响生产稳定性 + 安全)

### 3. P0-7 — 成果层走查严重缺失(已写完整 §15 patch)

P20 SPEC §8 13 条 AC 主要是 SQL/curl 工程层验证,只有零散用户视角点检(AC1/5/7/10)。Neo 强调的:
- ❌ admin-web 6 页 Playwright 实地走 — **0 个 AC 覆盖**
- ❌ AIPrewarm 分组 — **0 个 AC**
- ❌ 小程序看板沙箱接入(P0-3 主体)— **AC 中只字未提**
- ❌ 多角色身份切换走查 — **0 个 AC**

**已产出 P20 § 15 完整 patch**(详见 `P0-7-spec-acceptance-layer-check.md`):
- §15.1 验证哲学(工程层 vs 成果层)
- §15.2 admin-web 10 条走查清单
- §15.3 小程序 10 条走查清单(含 P0-3 看板 3 页必修)
- §15.4 跨页时间漂移走查
- §15.5 多角色身份走查 + **看板收口后我主动提醒 Neo 切身份**(对齐你的反馈)
- §15.6 走查产物归档约定

**3 个落地选项**(等 Neo 选):
- A 直接补到 P20 §15(推荐,30 分钟)
- B 单开《沙箱成果层验证手册》
- C 先列 todos,Wave 1 走查时即时补

### 4. P0-6 — 已记录两阶段方案

- **阶段 1 临时止血**(1h,Wave 1-3 任意时点):admin-web 加二次确认弹窗 + 输入门店简称
- **阶段 2 正式重设计**(3-5h,P0-7 收口后):拆"全局清空" / "沙箱内清空"语义 + `?scope=` query param

详见 [P0-6-record.md](P0-6-record.md)。

### 5. P0-3 + P0-2 — 已确认,排入 Wave

- P0-2 BD 手册主源 + 3 处链接 → **Wave 5 落地**
- P0-3 看板沙箱接入 → **Wave 1 修**(等 Wave 0 收尾后,Wave 1 计划基于本轮 P0/P1 反馈更新)

## 三、按 Wave 重新分配的执行清单(整合两轮 P0)

| Wave | 主要任务 | 第二轮新增 |
|---|---|---|
| **Wave 1** | P0-3 看板接入(必修) + P0-7 SPEC 投入 + 20 todos(P0×5) + P0-7 §15 成果层走查 | **+ P0-1 SCD2 视图入口改造(0.5 天)+ P0-7 §15 P20 patch 落地** |
| **Wave 1-3** | P0-6 临时守卫 + P0-8 DBViewer 白名单 + 4 D Bug | **+ 致命 1:4 处 fdw_etl.* 残留(1-2h)+ 致命 2:JWT aud 缺失(2-3h)+ 测试目录嵌套违规** |
| **Wave 2** | (P1 主体见 P1 总报告) | **+ P0-5 Wave 协同 6 项(matching/ETL 写连接/consume_money 划线价/note_service/测试 DSN/camelCase)** |
| **Wave 4** | DWS / RLS / 数据正确性 + P0-7 todos(P1×8) | (无新增) |
| **Wave 5** | P0-1/P0-2/P0-4 文档 + P0-7 todos(P2×7) | **+ P0-5 长期治理 5 项 + 可接受归档 4 项文档化** |
| **跨 Wave** | P1-7 admin API PRD + dev-trace Drop | (P1 主体) |
| **P0-6 阶段 2** | P0-7 收口后做(等沙箱完成) | 沙箱内/全局清空语义重设计 |

## 四、给 Neo 的决策提问(本会话剩余可处理的项)

| # | 问题 | 类型 | 我的建议 |
|---|---|---|---|
| 1 | P0-1 接受 SCD2 视图入口方案 + P20 SPEC 加 6 处 patch | 路径 | Y |
| 2 | P0-1 base_dws_task.py 工资任务 3 处 `_load_*` Bug 是否一并修 | Bug 单 | Y(独立 P1 Bug,Wave 1-2 修) |
| 3 | P0-5 接受 24 偏离点的 4 类分级 | 校准 | Y |
| 4 | P0-5 致命 1(4 处 fdw_etl 残留)修复 1-2h 立即进 Wave 1-3 | 路径 | Y(D Bug,影响生产) |
| 5 | P0-5 致命 2(JWT aud 缺失)修复 2-3h 立即进 Wave 1-3 | 路径 | Y(D Bug,跨端越权) |
| 6 | P0-5 立即治理 6 项 / Wave 协同 6 项 / 长期治理 5 项 / 可接受 4 项 各自纳入哪个 Wave | 排程 | 见 §三 表 |
| 7 | P0-5 CI 自动化校验建议(静态规则+pre-commit hook+周报)是否落地 | 工具化 | Y(长期投资) |
| 8 | P0-7 P20 SPEC §15 成果层走查 落地选 A/B/C | 路径 | A(直接补到 P20) |
| 9 | P0-7 §15.5 多角色身份提醒机制(看板收口后我主动提醒切身份) | 协同方式 | Y |
| 10 | P0-7 §15.2 走查清单是否再加 `/tenant-admins` / `/etl-tasks` | 范围 | Y(补全) |

## 五、产出文件索引(累积)

```
docs/_overview/04a-feedback/
├── 00-P0-feedback-response-summary.md           (第一轮总报告,Neo 在表格里写斜体二轮反馈)
├── 00-P0-round2-feedback-response-summary.md    (本文)
├── P0-1-SPI-research.md                         (D-1 第一轮)
├── P0-1-sandbox-snapshot-design.md              (F-1 第二轮)
├── P0-2-feedback-resolution.md                  (主线第一轮)
├── P0-3-board-vs-sandbox-analysis.md            (主线第一轮)
├── P0-5-matching-evolution.md                   (D-2 第一轮)
├── P0-5-engineering-consistency-overview.md     (F-2 第二轮)
├── P0-6-record.md                               (主线第二轮)
├── P0-7-runtime-context-todos.md                (D-3 第一轮)
└── P0-7-spec-acceptance-layer-check.md          (主线第二轮)

docs/prd/specs/
└── P20-runtime-context-sandbox.md               (D-3 第一轮 SPEC 草稿)
```

---

> 等 Neo 答这 10 个 Y/N 问题 + 完成 04c 反馈处理,P0 完整收口进入 Wave 实施轨道。
