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

152 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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. 任务板维护要求
- 每完成一项,必须同步:状态、证据、对应文档
- 任何“已完成”若无命令输出或文件证据,视为无效
- 若验证失败,必须把失败现象写回对应任务,不允许口头跳过
- 小龙负责最终事实校准,不接受“看起来差不多”