Files
ai-customer-service/docs/REMEDIATION_TASK_BOARD_2026-05-06.md

152 lines
9.7 KiB
Markdown
Raw Permalink Normal View History

# ai-customer-service 整改任务板(基于 2026-05-06 最新 review
> 生成时间2026-05-06
> 代码基线:`ee3a31e`
> 目标:把本轮 review 结论转成可执行整改任务,而不是停留在结论层。
> 当前总状态:**代码级门禁通过sub2api 单平台主链通过但带风险newapi 平台能力未通过;真实预生产 / 生产放行门禁未通过。**
---
## 0. 使用规则
- 状态仅允许:`未开始 / 进行中 / 已完成 / 已阻塞`
- 每项必须包含:责任角色、交付物、完成判据、验证方式、阻塞依赖
- 任何“已完成”必须附文件证据或命令证据
- 任务按四段拆分:`设计 / 实现 / 验证 / 放行证据`
- 未完成设计段,不得直接跳实现
- 未完成验证段,不得更新为“可放行”
- 未完成放行证据段,不得对外给出“预生产通过 / 可灰度 / 可上线”口径
---
## 1. 当前阶段门控结论
### 1.1 代码级门禁
- 结论:**PARTIAL / 不稳定**
- 依据:`go build ./...``go vet ./...` 当前通过;但本轮再次实测 `go test ./... -count=1` 失败,失败用例为 `test/e2e/sub2api_callback_flow_test.go:186`,实际 `event[0].type = reply.generated`,预期 `message.received`,并伴随 `sql: database is closed`
### 1.2 sub2api 单平台主链
- 结论:**PASS WITH RISKS / E2E 当前不稳定**
- 已验证链路webhook → dialog → outbox → callback worker
- 仍有风险:严格事务外盒不成立、并发 claim 缺失、callback_target 语义未落地、E2E 已再次复现顺序异常与 `sql: database is closed`
### 1.3 newapi 平台能力
- 结论:**FAIL**
- 直接证据:
- `internal/platformadapter/newapi_adapter.go:20-21` 仍直接返回 `501 not implemented`
- `internal/app/app.go:129-130` 仍允许注册 `newapi` adapter
- `internal/app/app.go:186-187` 仍允许启动 `newapi` callback worker
### 1.4 真实预生产 / 生产放行
- 结论:**FAIL**
- 依据:`test/QA_GATE_STATUS.md``prd/PRODUCTION_CHECKLIST.md` 仍明确:代码级通过,但真实共享预生产 Gate B 与生产 Gate C 未闭环
---
## 2. 整改总览(按 gap taxonomy
| Gap Type | 当前问题 | 优先级 | 默认责任角色 |
|---|---|---|---|
| design_gap | 平台启用状态与真实可用能力未统一建模 | P1 | TechLead |
| implementation_gap | newapi 入口未实现但可装配callback_target 运行时未消费 | P1 | Engineer |
| test_gap | newapi 无对等正向链路测试sub2api callback 稳定性回归不足 | P1 | QA / Engineer |
| evidence_gap | 真实共享预生产 / 灰度环境证据未闭环 | P0 | QA / DevOps |
| call_chain_gap | newapi 对外看似支持,真实入口未接通 | P1 | TechLead / Engineer |
| contract_gap | event.CallbackTarget 字段语义与 worker 实际行为不一致 | P1 | TechLead |
---
## 3. 设计段任务(先收口设计与口径)
| ID | 优先级 | 任务 | 责任角色 | 交付物 | 完成判据 | 验证方式 | 依赖 | 状态 |
|---|---|---|---|---|---|---|---|---|
| D-01 | P1 | 收口平台能力矩阵,明确 `sub2api`/`newapi` 的真实支持级别 | TechLead | 平台能力设计说明 | 明确区分:已生产可用 / 占位未实现 / 禁止启用 | 设计文档包含平台能力表、入口/出口/测试覆盖状态 | 无 | 未开始 |
| D-02 | P1 | 定义“平台启用”与“平台真实可用”统一门控规则 | TechLead | 装配门控设计 | 明确哪些条件满足后才允许注册 adapter / 启动 worker | 文档中给出代码落点与判定规则 | D-01 | 未开始 |
| D-03 | P1 | 定义 `callback_target` 的正式契约:删除伪能力或落地多目标路由 | TechLead | 契约设计说明 | 不能再存在“模型字段存在但运行时完全不消费”的状态 | 文档中明确 event model、worker 路由、回调配置关系 | 无 | 未开始 |
| D-04 | P1 | 设计 outbox 并发 claim / 多实例投递策略 | TechLead | 并发与重试设计 | 至少明确单实例约束,或设计 `claim/skip locked` 方案 | 设计文档中有状态流转与失败恢复说明 | 无 | 未开始 |
| D-05 | P0 | 更新项目对外发布口径只允许宣称“sub2api 代码级可用”,禁止宣称“多平台已完成 / 生产可上线” | PM | 更新后的发布/状态文档口径 | 相关文档不再出现失真口径 | 复核文档章节与结论语句 | 无 | 未开始 |
---
## 4. 实现段任务(把设计缺口落到代码)
| ID | 优先级 | 任务 | 责任角色 | 交付物 | 完成判据 | 验证方式 | 依赖 | 状态 |
|---|---|---|---|---|---|---|---|---|
| I-01 | P1 | 处理 newapi 假接通:二选一——禁用装配,或补完整 ingress 实现 | Engineer | 代码修改 + 测试 | 不能再出现“入口未实现但仍可注册/启动 worker” | `go test ./... -count=1`;读取关键文件确认分支收口 | D-01, D-02 | 未开始 |
| I-02 | P1 | 让 worker 与平台能力门控一致,不允许未实现平台独立启动 callback worker | Engineer | 代码修改 + 测试 | worker 启动条件与平台真实能力一致 | 读取 `internal/app/app.go` 关键分支;相关测试通过 | D-02 | 未开始 |
| I-03 | P1 | 处理 `callback_target` 契约漂移:删除字段伪能力或在 worker 中真正消费 | Engineer | 代码修改 + 测试 | 数据模型与运行时行为一致 | 读取 builder / event / worker定向测试通过 | D-03 | 未开始 |
| I-04 | P1 | 补 outbox 并发 claim 机制或显式限制单实例语义并固化到代码/文档 | Engineer | 代码或明确限制说明 | 不再处于“默认可多实例、实际会重复投递”的灰区 | 代码/文档与测试或注释证据一致 | D-04 | 未开始 |
| I-05 | P2 | 评估并落地更严格 transactional outbox 方案,或明确记录当前非强一致边界 | TechLead / Engineer | 设计决策记录 + 代码/文档 | 团队对一致性边界有明确基线 | 决策文档 + 相关代码/文档证据 | D-04 | 未开始 |
---
## 5. 验证段任务(不是“改完就算完成”)
| ID | 优先级 | 任务 | 责任角色 | 交付物 | 完成判据 | 验证方式 | 依赖 | 状态 |
|---|---|---|---|---|---|---|---|---|
| V-01 | P1 | 为 newapi 增加对等验证:若实现则补 integration/e2e若禁用则补门控测试 | QA / Engineer | 测试代码 + 验证记录 | newapi 状态与测试口径一致,不再空缺 | `go test ./test/integration ./test/e2e -count=1` 或对应定向用例 | I-01, I-02 | 未开始 |
| V-02 | P1 | 对 sub2api callback 链路做多轮稳定性复跑,专查事件顺序和 DB 关闭时机脆弱性 | QA | 稳定性复跑记录 | 至少形成重复执行证据,并记录是否复现 `reply.generated`/`message.processing` 顺序异常与 `database is closed` 类问题 | 定向多轮 `go test` 记录 | 无 | 未开始 |
| V-03 | P1 | 对 outbox 并发 / 重试 / dead-letter 行为补定向验证 | QA / Engineer | 测试与验证报告 | claim/重试/死信路径与设计一致 | 定向测试命令 + 输出 | I-03, I-04 | 未开始 |
| V-04 | P1 | 回收旧 review 漂移:更新/替代 `CODE_REVIEW_REPORT.md` 等过期结论 | QA / PM | 新旧报告差异说明 | 不再让过期 P0/P1 结论继续作为现状依据 | 文档 diff + QA 复核 | D-05 | 未开始 |
---
## 6. 放行证据段任务(真实环境,不是仓库内自嗨)
| ID | 优先级 | 任务 | 责任角色 | 交付物 | 完成判据 | 验证方式 | 依赖 | 状态 |
|---|---|---|---|---|---|---|---|---|
| E-01 | P0 | 在共享预生产环境复跑 Gate B 并留痕 | QA / DevOps | 预生产验证记录 | 启动、DB、migration、webhook、ticket、audit、ready 全链路留痕 | 复跑脚本与记录文件 | 无 | 未开始 |
| E-02 | P0 | 在共享预生产 / 灰度环境完成监控接线与回滚演练留痕 | DevOps / QA | 监控与回滚证据 | 不再只有本地/容器化演练记录 | 真实环境演练记录、告警/仪表盘证据 | E-01 | 未开始 |
| E-03 | P1 | 形成“平台能力 + 环境门禁”统一放行页 | XL / PM / QA | 放行基线文档 | 明确平台支持边界、代码级门禁、预生产门禁、生产门禁 | 文档校验无失真口径 | D-05, E-01, E-02 | 未开始 |
---
## 7. 最短闭环执行顺序
### 7.1 当前最短关键路径
1. V-02 先定位并修复 `sub2api` callback E2E 不稳定失败,恢复 `go test ./...` 稳定通过能力
2. D-01 收口平台能力矩阵
3. D-02 收口平台启用 / worker 启动门控
4. I-01 处理 newapi 假接通
5. I-02 同步 worker 启动逻辑
6. V-01 补 newapi 对等验证
7. E-01 共享预生产 Gate B 留痕
8. E-02 共享预生产 / 灰度环境运行证据留痕
9. E-03 更新统一放行页
### 7.2 原则
- 若目标是先消除“能力口径失真”,优先做 D-01/D-02/I-01/I-02/V-01
- 若目标是先冲放行证据,仍不能跳过平台能力收口;否则会带着失真口径进入预生产
---
## 8. 明确禁止的错误结论
在以下任务完成前,禁止出现这些说法:
- “多平台接入已经完成”
- “newapi 已支持,只差联调”
- “当前整体生产可上线”
- “预生产 / 灰度已通过”
- “callback_target 已支持多目标回调”
- “平台回调 outbox 已具备多实例生产级可靠性”
---
## 9. 当前最小可接受对外口径
1. 代码级门禁:通过
2. sub2api 单平台主链:通过,但带重要风险
3. newapi未通过不应按已接入汇报
4. 真实预生产 Gate B未通过
5. 生产灰度 Gate C未通过
---
## 10. 任务板维护要求
- 每完成一项,必须同步:状态、证据、对应文档
- 任何“已完成”若无命令输出或文件证据,视为无效
- 若验证失败,必须把失败现象写回对应任务,不允许口头跳过
- 小龙负责最终事实校准,不接受“看起来差不多”