Files
ai-customer-service/prd/PRODUCTION_PHASE1_SCOPE.md
Your Name cf46b27610 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

117 lines
5.1 KiB
Markdown
Raw Permalink 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.
# 生产一期范围与门禁定义
> 版本v1.0 | 状态:已生效
> 关联PRODUCTION_EXECUTION_PLAN.md、PRODUCTION_PHASE1_STATUS.md、tech/INTERFACE.md
---
## 1. 生产一期目标定位
生产一期是 ai-customer-service 从原型验证到生产可用的第一步。目标不是功能完备,而是**入口安全、闭环真实、运维可控**,在有限范围内做到生产级别质量。
---
## 2. 已落地能力(生产一期基线)
以下能力已在代码中实现并通过验证:
| 能力 | 代码位置 | 说明 |
|------|----------|------|
| webhook HMAC 签名校验 | `internal/http/handlers/webhook_security.go` | HMAC-SHA256skew 校验 |
| 时间戳防重放 | `internal/http/handlers/webhook_security.go` | skew window 内有效 |
| 消息幂等去重 | `internal/store/postgres/dedup_store.go` | `(channel, message_id)` 去重 |
| 工单创建 | `internal/service/dialog/service.go` | 退款/敏感意图触发转人工 |
| 工单持久化 | `internal/store/postgres/ticket_store.go` | PostgreSQL |
| 工单列表/分配/解决 | `internal/http/handlers/ticket_handler.go` | `GET /tickets``POST /assign``POST /resolve` |
| 审计日志持久化 | `internal/store/postgres/audit_store.go` | 写入 `cs_audit_logs`fail-closed |
| 健康检查 | `internal/http/handlers/health_handler.go` | `/live``/ready`(含 PostgreSQL 依赖检查) |
| 请求体大小限制 | `internal/platform/httpx/limits.go` | 全局 BodyLimit 配置 |
| JSON Schema 校验 | `internal/http/handlers/webhook_handler.go` | 最小字段必填与 unknown field 拒绝 |
| graceful shutdown | `internal/app/app.go` | 优雅停机 |
---
## 3. 生产一期明确排除范围
以下能力**不在生产一期范围内**,不作为阶段完成的阻塞项:
- 人工回复用户链路(人工客服 → 用户消息推送)
- 排队位置查询
- webhook 速率限制
- metrics / tracing / SLO 监控面板
- 知识库 CRUD / 发布 / 审核
- WebSocket 实时会话
- 多租户隔离
- 外部系统NewAPI/Sub2API深度集成
---
## 4. 剩余 P0 缺口(门禁必须项)
在以下 P0 缺口**全部收口**前,不得将项目状态汇报为"生产一期完成"
### P0-1工单状态流转审计
- **当前状态**:✅ 已落地,`TicketWorkflowStore` 在 Assign/Resolve/Close 时均调用 `writeAudit`
- **代码位置**`internal/store/postgres/ticket_workflow.go`
- **记录内容**before_state隐式/ after_state显式、actor_id、source_ip、actionassign/resolve/close
### P0-2安全拒绝事件审计
- **当前状态**:✅ 已落地,`WebhookSecurity.auditReject` 在签名缺失/无效/过期/body 读取失败时均写入审计
- **代码位置**`internal/http/handlers/webhook_security.go`
- **记录内容**Type=`webhook_security_rejected`Action=`security_reject`error_code、path、timestamp 等信息
### P0-3工单关闭语义明确
- **当前状态**:只有 resolve没有 close 语义
- **要求**:工单关闭语义明确为 resolve=已解决关闭,或补充 close 接口
- **代码位置**`internal/http/handlers/ticket_handler.go`
### P0-4Webhook 路由对齐
- **当前状态**:已落地统一入口 `/api/v1/customer-service/webhook`
- **INTERFACE.md 定义**`/api/v1/customer-service/webhook/{channel}`(按渠道独立入口)
- **当前方案**:统一入口通过 Query/Body 中的 `channel` 字段识别渠道,与 INTERFACE 定义兼容,无需路由拆分
- **说明**:生产一期采用统一入口简化运维;如后续渠道量增加,可扩展为 `/webhook/{channel}` 路径
---
## 5. 门禁检查表
### Gate A允许进入生产底座实现
- [x] 生产一期范围文档已建立(本文档)
- [x] PM / TechLead / QA 对范围达成一致
- [ ] TechLead 生产架构方案已冻结
### Gate B允许联调前
- [x] webhook 签名、防重放、幂等、鉴权、审计 fail-closed 已具备
- [x] P0-1工单状态流转审计已落地
- [x] P0-2安全拒绝事件审计已落地
- [x] P0-3工单关闭语义已明确resolve=已解决关闭,另有独立 close 接口支持
- [x] P0-4Webhook 路由)已对齐:统一入口兼容 INTERFACE 定义
- [ ] OpenAPI 与实现一致(无漂移)
- [x] readiness 健康检查可真实阻断坏实例
- [ ] 关键失败路径自动化测试存在
### Gate C允许灰度前
- [ ] P1 缺口速率限制、人工回复链路、排队位置查询、metrics/tracing明确完成或推迟计划
- [ ] 灰度/回滚 Runbook 已完成并演练
- [ ] 工单闭环真实可用
- [ ] 监控告警上线
---
## 6. 范围变更策略
任何范围变更(如新增功能、调低优先级)必须:
1. PM 提出书面变更申请
2. TechLead 评估技术影响
3. 三方PM/TechLead/QA签字确认
4. 更新本文档版本号
---
## 7. 当前版本状态
- **本文档版本**v1.1
- **生效日期**2026-04-30
- **更新内容**P0-1工单状态流转审计、P0-2安全拒绝事件审计、P0-4Webhook 路由对齐)已确认落地,更新门禁检查表状态
- **下次审查**:灰度前最终检查