# Wave 1 实施 Kickoff — Runtime Context 沙箱 + 必修 D Bug

> 日期:2026-05-04 / 状态:**Neo 全部反馈已答 + 主线全部调研已完成,可启动 Wave 1**
>
> 上线门槛:看板沙箱接入(本 Wave) + 5 项 ETL 数据准确(Wave 4) + 致命 1+2 修(Wave 1-3) 全部满足才推 P11

## 一、Wave 1 目标

**主题**:Runtime Context 沙箱**真正端到端可用** + 启动 P11 上线门槛中的"看板沙箱接入"。

**判据**(对照 P20 SPEC §14 成果层走查):
- admin-web 12 路由 Playwright 走查全部 PASS(尤其 §14.2.10 RuntimeContext 完整切换流程)
- 小程序 10 页微信开发者工具走查 PASS(尤其 §14.3.6/7/8 看板 3 页必修)
- 跨页时间漂移 60s 缓存语义验证(AC12 实地化)
- 各端日志 0 error

## 二、Wave 1 任务清单(共 8 项)

### 任务 W1-T1: P0-3 看板沙箱接入(必修)

**优先级**:P0 / 主交付
**工作量**:5-7h

**范围**:
- 后端 `apps/backend/app/routers/xcx_board.py` 加 runtime_context 上下文
- 查询 `now()` 改为 `business_clock(site_id)`(用 P20 SPEC §5.1 的 helper)
- 小程序 `pages/board-finance/board-finance.ts` `pages/board-customer/board-customer.ts` `pages/board-coach/board-coach.ts` 三页:
  - `onLoad / pullDownRefresh` 调 `getBusinessClock` 拿虚拟日期
  - 传给后端 board API
- 8 条沙箱测试场景(P0-3 报告 §四)逐条验证

**验收**:P20 SPEC §14.3.6 / 14.3.7 / 14.3.8 走查 PASS

---

### 任务 W1-T2: P0-1 SCD2 视图入口改造

**优先级**:P0 / 沙箱根基
**工作量**:0.5 天 (4h)

**范围**(F-1 调研结论):
- ETL 任务改 3 处 SQL 直读 `dws.cfg_*` → `app.v_cfg_*` 视图
- 修复 NULL 兼容 bug(`v_cfg_index_parameters` 的 `effective_to IS NULL` 兼容)
- 顺手修 `base_dws_task.py:540-581` 工资任务 3 处 `_load_*` 函数不带 `effective_from` 的历史 Bug

**验收**:沙箱回放 2026-03-01 时 SPI 参数用当时生效版

**配套文档**:P20 SPEC §1.4 / §3.5 / §5.6 / AC14-15 / §11.2 / T16-T17 patch 落地

---

### 任务 W1-T3: P0-5 致命 1 — 4 处 fdw_etl 残留修复

**优先级**:P0 / **D Bug 影响生产**
**工作量**:1-2h

**范围**(F-2 调研发现):
- `apps/backend/app/routers/tenant_users.py:425, 450` — `FROM fdw_etl.*` → 直查 ETL 库 schema
- `apps/backend/app/routers/tenant_excel.py:390, 407` — 同上
- `apps/backend/app/routers/tenant_clues.py:113-119` — 同上

每处把 `fdw_etl.` 改为对应 schema(`dwd.` 或 `app.`),**不补 FDW**(P0-5 主体已结论 FDW 不能用 GUC)。

**验收**:tenant-admin 用户审核 / Excel 上传 / 维客线索 3 个功能从"接口永远返回空列表"恢复正常

---

### 任务 W1-T4: P0-5 致命 2 — JWT aud 缺失修复

**优先级**:P0 / **D Bug 跨端越权**
**工作量**:2-3h

**范围**:
- `apps/backend/app/auth/jwt.py` `generate_access_token` 加 `audience=` 参数
- `decode_access_token` 校验 aud
- 跨端 token 兼容性测试:admin / miniapp / tenant-admin 三套 token 互相不能用
- 旧 token 过期前的灰度兼容(可选:校验失败 fallback "no aud" 接受 1 周)

**验收**:用 admin token 调 /api/xcx/* 应 403,反之亦然

---

### 任务 W1-T5: P0-8 DBViewer 白名单 + 只读账号

**优先级**:P0 / D Bug
**工作量**:1h

**范围**:
- `apps/backend/app/routers/db_viewer.py` 改黑名单为白名单
- 必须以 `SELECT / WITH ... SELECT / EXPLAIN / SHOW` 开头
- 校验 `get_etl_readonly_connection` 用的账号确实只读(`pg_user.usesuper=false`)

**验收**:执行 `ALTER TABLE` / `CREATE TABLE` / `GRANT` 应被前端校验拒绝(若漏后端兜底)

---

### 任务 W1-T6: P1-11 chat 多入口后端契约

**优先级**:P1
**工作量**:1-2h

**范围**(E-2 发现):前端已 6 分支处理,只缺后端契约
- 后端补 `GET /api/xcx/chat/by-context?customerId|coachId|historyId` 派生 chatId
- 或前端调 `loadMessages` 时传完整入口语义,后端按入口分支查

**验收**:chat 页从 task-detail / chat-history / coach-detail 三入口都能正确加载历史

---

### 任务 W1-T7: P1-7 admin API PRD 批 1

**优先级**:P1 / 跨 Wave 第一批
**工作量**:1.5 工作日(B+D 混合)

**范围**(P1-7 评估):
- 用 OpenAPI 自动生成 80 个 API 总表 → `docs/_overview/admin-web-api-overview.md`(0.5 天)
- 细化 Wave 1 涉及的 5-8 个 API(Runtime Context + AI 管理):每个 API 加业务语义 / 权限 / 调用方 / 问题点
- 发现的设计 / 性能 / 安全问题立即立工单(预估 5-15 个)

**验收**:`admin-web-api-overview.md` 落地 + Runtime Context + AI 管理批 PRD 完成

---

### 任务 W1-T8: P0-7 §14 成果层走查执行

**优先级**:P0 / 验收
**工作量**:1 天

**范围**(已落入 P20 SPEC §14):
- admin-web Playwright 走查 12 路由(§14.2)
- 小程序微信开发者工具走查 10 页(§14.3)
- 跨页时间漂移走查(§14.4)
- 走查产物归档到 `docs/audit/changes/2026-XX-XX__sandbox_acceptance_wave1.md`

**多角色身份提醒**:14.3.6/7/8 看板 3 页 PASS 后,**主线主动提醒 Neo 切身份**走 §14.5 矩阵。

**验收**:全部走查 PASS + 截图归档

---

## 三、Wave 1 不做的事(挪到后续)

| 项 | 时点 |
|---|---|
| P0-6 阶段 2 沙箱内/全局清空语义重设计 | P0-7 收口后(Wave 1-3 后) |
| P1-13 P4 前置修复 | **关闭**(以现状为准,Neo 决定) |
| P1-1 schema 迁移 | Wave 2 |
| P1-5 跨包枚举 / P1-6 触发器合并 | Wave 2 |
| P1-12 散客 isScattered | Wave 4 |
| P2-4 课程体系 ROOM 启用 / 174 条回填 | **Wave 5**(选项 A 最小改动) |
| P2-7 board-finance 隐式 null 修(原行为可接受) | **改为 Wave 5**(Neo 反馈) |
| P0-1 / P0-2 / P0-4 / P0-5 / P0-7 文档批改 | Wave 5 |
| dev-trace Drop | Wave 5 |
| tasks.md 真实性审计 | **关闭**(Neo 决定) |
| CI hook 防再撒谎 | **关闭** |

## 四、Wave 1 启动前置检查

- [x] Wave 0 主交付(产品全景 / 21 页 / 19 路由 / 测试规范 / 39 冲突清单 / 6 孤儿)完成
- [x] P0 两轮反馈调研完成(8 + 8 项 决策)
- [x] P1 两轮反馈调研完成(13 + 1 + 5 项 决策)
- [x] P2 反馈调研完成(13 项 + 5 子项 + H-3 课程体系修正)
- [x] Neo 全部决策入档 NEO-DECISIONS-LOG.md
- [x] P20 SPEC §14 成果层走查 patch 落地
- [x] 当前工作区无高风险未审计变更(SessionStart hook 检查)

## 五、Wave 1 启动后路径

1. **Day 1**(立即):W1-T3 + W1-T4 + W1-T5(3 个 D Bug 修代码,合计 4-6h,1 个 PR)
2. **Day 2**:W1-T1 P0-3 看板沙箱接入(后端 + 小程序三页 + 8 场景验证,5-7h)
3. **Day 3**:W1-T2 SCD2 视图入口改造(0.5 天)+ W1-T6 chat 后端契约(1-2h)
4. **Day 4**:W1-T7 admin API PRD 批 1(1.5 天起步)
5. **Day 5**:W1-T8 §14 走查 + 多角色提醒 + 归档

总耗时:**约 5-7 工作日**,跨多个 PR 提交。

## 六、Wave 1 收尾标志

- 8 个 W1-T* 任务全部完成 + 审计记录归档
- P20 SPEC §14 走查产物 `2026-XX-XX__sandbox_acceptance_wave1.md` 落地
- 沙箱模式下三大看板显示虚拟日期数据(P0-3 主体修复)
- 4 处 fdw_etl 残留 + JWT aud + DBViewer 白名单 全部修复
- Wave 1 收尾 commit + push 到 dev 分支
- Neo Review 通过 → 启动 Wave 2

---

## 七、Wave 2 预告(P1-1 schema 迁移协同)

Wave 1 收尾后立即启动:
- P1-1 维客线索 public → biz 迁移(9 人时,与 Wave 2 后端 PR 合并)
- P1-6 触发器 API 合并
- P1-5 packages/shared 跨包枚举
- P0-5 Wave 协同 6 项

详见 [GLOBAL-DECISION-DASHBOARD.md](GLOBAL-DECISION-DASHBOARD.md) §1.2。

---

> 等 Neo 一句"开 Wave 1",主线立即按 §五 路径执行。
