Files
lijiaoqiao/projects/ai-customer-service/PRODUCTION_PHASE1_STATUS.md
Your Name 687c4535f8 fix: P0-1 RateLimiter并发写安全 + P0-2工单操作错误码区分 + P1 rows.Close修复
P0-1 (limits.go): Allow()方法改为全程使用写锁保护counters map读写,避免RLock写入时的data race
P0-2 (ticket_workflow.go+ticket_handler.go): Assign/Resolve/Close操作先查询ticket存在性和状态,返回明确的CS_TICKET_4001/CS_TKT_4002/CS_TICKET_4092/CS_TICKET_4093错误码,handler根据错误前缀路由HTTP状态码
P1-1 (ticket_store.go): 移除GetStats中3处手动rows.Close(),只保留defer Close()
2026-05-01 20:56:25 +08:00

113 lines
5.0 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 生产一期执行状态
> 更新时间:基于当前代码现状人工核对。
> 目的:把生产一期要求映射到当前实现边界,避免继续把原型能力误报为“已完成”。
## 1. 当前结论
当前项目仍处于**生产一期未完成**状态,但已具备以下已落地能力:
- 基础配置加载与 HTTP 超时/Body Limit 配置
- webhook body schema 校验
- webhook HMAC 签名与时间戳防重放校验
- 消息幂等去重
- 基于依赖检查的 `/actuator/health``/live``/ready`
- 转人工工单创建
- 工单列表 / 分配 / 解决最小闭环 API
- 审计日志持久化写入
- PostgreSQL migration 基础表结构
但距离“生产一期完成”仍有明显缺口,不能作为可灰度上线结论。
---
## 2. 生产一期需求到当前代码映射
### 2.1 入口安全
| 要求 | 当前状态 | 代码位置 | 备注 |
|---|---|---|---|
| 请求体大小限制 | 已完成 | `internal/platform/httpx/limits.go`, `internal/http/router.go` | 已挂到 webhook 路由 |
| JSON schema/字段约束 | 部分完成 | `internal/http/handlers/webhook_handler.go` | 仅完成最小字段必填与 unknown field 拒绝 |
| webhook 签名校验 | 已完成 | `internal/http/handlers/webhook_security.go` | HMAC-SHA256 |
| 时间戳防重放 | 已完成 | `internal/http/handlers/webhook_security.go` | 仅做 skew 校验,未持久化 nonce |
| 幂等去重 | 已完成 | `internal/store/postgres/dedup_store.go`, `internal/store/memory/dedup_store.go` | 基于 `(channel,message_id)` |
| 速率限制 | 未完成 | 无 | P1 缺口 |
| 渠道级独立 webhook | 未完成 | 当前仅统一 webhook | 与 INTERFACE 文档仍有漂移 |
### 2.2 工单闭环
| 要求 | 当前状态 | 代码位置 | 备注 |
|---|---|---|---|
| 转人工自动创建工单 | 已完成 | `internal/service/dialog/service.go` | 退款/敏感意图触发 |
| 工单持久化 | 已完成 | `internal/store/postgres/ticket_store.go` | PostgreSQL / memory 均可 |
| 工单列表 | 已完成 | `internal/http/handlers/ticket_handler.go` | `GET /tickets` |
| 工单分配 | 已完成 | `internal/http/handlers/ticket_handler.go`, `internal/store/postgres/ticket_workflow.go` | 当前 query 参数驱动 |
| 工单解决 | 已完成 | 同上 | 当前 query 参数驱动 |
| 工单关闭 | 未完成 | 无 | 只有 resolve没有 close |
| 工单回复用户 | 未完成 | 无 | 尚无人工回消息链路 |
| 排队位置查询 | 未完成 | 无 | 文档要求未落地 |
### 2.3 审计与可追溯
| 要求 | 当前状态 | 代码位置 | 备注 |
|---|---|---|---|
| message processed 审计 | 已完成 | `internal/service/dialog/service.go` | 成功路径会写审计 |
| 审计持久化 | 已完成 | `internal/store/postgres/audit_store.go` | 写 `cs_audit_logs` |
| fail-closed 审计 | 已完成 | `dialog.Process()` | 审计失败时整体返回错误 |
| 安全拒绝事件审计 | 未完成 | 无 | 签名失败/非法请求未记审计 |
| 工单状态流转审计 | 未完成 | 无 | assign/resolve 未写审计 |
| source_ip / actor / action 分类完备 | 部分完成 | `internal/store/postgres/audit_store.go` | 当前 action 固定为 `update`source_ip 未写 |
### 2.4 运维与健康检查
| 要求 | 当前状态 | 代码位置 | 备注 |
|---|---|---|---|
| liveness / readiness 区分 | 已完成 | `internal/http/handlers/health_handler.go` | |
| readiness 检查依赖 | 已完成 | `internal/platform/health/dependency.go`, `internal/store/postgres/healthcheck.go` | 当前仅 postgres |
| graceful shutdown | 已完成 | `internal/app/app.go` | |
| 结构化日志 | 部分完成 | `internal/platform/logging/logger.go`, `webhook_handler.go` | 仅少量入口日志 |
| metrics/tracing | 未完成 | 无 | P1 缺口 |
| 灰度/回滚 runbook | 未完成 | 无 | 文档缺失 |
---
## 3. 当前与文档的主要漂移
1. `tech/INTERFACE.md` 约定了按渠道 webhook`/webhook/{channel}`),当前实现仍只有统一入口 `/api/v1/customer-service/webhook`
2. 文档要求人工接单/回复/关闭完整后台闭环,当前只做到 list/assign/resolve 最小 API。
3. 文档要求安全事件审计,当前签名失败、时间戳失败、非法 body 不入审计。
4. 文档要求更完整的运维可观测metrics/tracing/SLO当前尚未实现。
---
## 4. 剩余 P0 / P1 缺口排序
### P0继续执行必须优先收口
1. 工单状态流转审计补齐
2. 安全拒绝事件审计补齐
3. 工单 API 与接口文档对齐(至少明确当前最小契约)
4. 工单关闭语义补齐或文档明确 resolve=关闭
### P1生产一期仍必须完成
1. webhook 速率限制
2. 人工回复用户链路
3. 排队位置查询
4. metrics / tracing / SLO 基础设施
5. 灰度/回滚 runbook
---
## 5. 本轮执行边界
本轮后续代码推进应聚焦:
1. 补齐安全拒绝审计
2. 补齐工单状态流转审计
3. 补齐工单关闭/文档对齐的最小闭环
4. 扩展自动化测试覆盖主路径/失败路径/安全路径
在这些项完成前,不应把项目汇报为“生产一期已完成”。