1. config.go: AI_CS_ENV runtime mode with production restriction - New RuntimeConfig.Env field (AI_CS_ENV / AI_CS_RUNTIME_ENV) - production + Postgres.Enabled=false → Load() returns error - production + empty webhook secret → Load() returns error - normalizeRuntimeEnv: dev/dev/ → development, prod/production → production, test → test 2. app.go: probe.SetReady only when store is confirmed ready - Postgres.Enabled: probe.SetReady(true) after DB+migration OK - Memory mode: probe.SetReady(false) — not production-ready 3. health_handler_test.go: add probe live+ready state transition tests 4. config_test.go: add TestLoad_RejectsProdWhenPostgresDisabled, TestLoad_RejectsProdWhenWebhookSecretMissing 5. app_test.go: add TestNew_RejectsMemoryModeWithoutExplicitNonProdEnv, TestNew_AllowsMemoryModeInTestEnv, TestNew_WithPostgresEnabled_* for invalid DSN and migration-failure paths Phase 1 (code gate) objectives met: ✅ prod cannot fall back to memory store ✅ readiness reflects actual store readiness ✅ both changes have test coverage
5.8 KiB
5.8 KiB
QA_GATE_STATUS.md — 质量门禁状态(整改版)
生成时间:2026-05-04 07:xx GMT+8
QA:小龙团队质量复核
项目:ai-customer-service 生产一期
依据:docs/RECTIFICATION_REVIEW_REPORT_V2.md、当前代码实测结果、当前仓库文档对照
0. 阶段门控结论
- 当前结论:REQUEST_CHANGES
- 是否可进入下一阶段(按“生产可直接上线”口径放行):否
- 是否可进入预生产整改 / 灰度准备:是,但前提是先完成剩余 P0/P1 真实环境项
结论说明
当前项目的代码主链已可用,仓库内关键测试已通过;但 QA 不接受把这直接等同于“生产已具备上线条件”。
本轮已完成的关键整改:
- prod 默认 fallback 到 memory 的代码路径已收紧
- readiness 不再在 memory 模式下直接返回 ready=UP
- 配置契约与执行板文档已同步回写
当前剩余阻断已收敛到:
- 真实环境门禁(DB / migration / webhook 联调 / 入库验证)未闭环
- 部署侧 fail-fast / 监控 / 回滚基线仍未落地
- 代码级通过 ≠ 预生产通过 ≠ 生产可放量,仍需严格分层门禁
1. 审查输入清单
1.1 已核对代码文件
internal/config/config.gointernal/app/app.gointernal/http/handlers/health_handler.gointernal/http/router.gointernal/store/postgres/*internal/store/memory/*
1.2 已核对文档
prd/PRODUCTION_CHECKLIST.mddocs/CONFIG_CONTRACT_BASELINE.mddocs/P0_P1_P2_RECTIFICATION_EXECUTION_BOARD.md
1.3 本轮已执行验证
go test ./internal/config ./internal/http/handlers ./internal/app -count=1
go test ./... -count=1
1.4 关键事实校准
- 当前仓库实测结论:全量 Go 测试已通过
- prod fallback / readiness 相关代码阻断:已落地并有测试覆盖
- 旧的“prod 默认可退回 memory / ready 过宽”结论:对当前代码已不再成立
- 旧的“可以直接按生产上线口径放行”结论:仍不成立
2. 规范审查结果
- 结果:FAIL(针对预生产 / 生产放行门禁)
2.1 已通过项
- webhook / dialog / handoff / ticket 主链已落地
- feedback / handoff / stats 等 Phase 1 核心接口已具备
- Webhook HMAC / timestamp / dedup / body limit / rate limit 已存在
- Postgres 持久化链路已接通
- 仓库内全量 Go 测试已通过
- prod memory fallback 已收紧
- readiness 语义已收紧到不再对 memory 模式误报 ready=UP
2.2 未通过项
- 真实环境 DB / migration / webhook / audit / ticket 入库验证缺证据
- 部署侧关键配置 fail-fast、监控、回滚 runbook 未闭环
- 生产放行仍缺 Gate B / Gate C 证据
2.3 结论
若目标是“代码级门禁是否通过”,当前可判定通过; 若目标是“是否可按预生产完成或生产可上线放行”,当前不通过。
3. 实施漂移检测报告
| 检查项 | 结果 | 说明 |
|---|---|---|
| 模块拆分 | PASS | 当前实现与主链模块划分基本一致 |
| 接口签名 | PASS | 本轮关注的核心接口已存在 |
| 错误码 | PASS | 当前主要错误码口径已基本统一 |
| 数据模型 | PASS | session/ticket/audit/dedup 对应存储结构已存在 |
| 配置项 | PASS | 文档已收敛到 internal/config/config.go 真实读取项 |
| 测试覆盖状态 | PASS | 本轮新增约束已有单测/集成链路覆盖,且全量 Go 测试通过 |
| readiness / 运行门禁 | PASS(代码级) | memory 模式不再误报 ready=UP;prod 约束已落地 |
| 上线状态文档 | PASS(当前基线) | 已回写执行板与 QA 文档 |
| 日志/监控/运行闭环 | PARTIAL | 代码未覆盖真实部署监控与回滚基线 |
4. 自动化验证结果表
| 检查项 | 状态 | 说明 |
|---|---|---|
| 构建 / 测试现状 | PASS | go test ./... -count=1 已通过 |
| 代码主链可用性 | PASS | webhook → dialog → handoff → ticket 主链存在 |
| 生产运行约束 | PASS(代码级) | prod 下要求 Postgres;缺失时 fail-fast |
| readiness 真实性 | PASS(代码级) | memory 模式 startup not ready,避免假 ready |
| 配置契约一致性 | PASS | 文档与代码变量名已对齐 |
| 真实环境门禁 | FAIL | DB/migration/webhook/入库闭环未完成证据化验证 |
| 文档状态一致性 | PASS | 当前 QA / board / checklist 已同步 |
5. 当前问题清单
Critical
-
真实环境验证闭环缺证据
- 影响:无法证明 Gate B 已满足
- 建议:补预生产验证记录(真实 DB / migration / webhook / audit / ticket)
-
部署侧 fail-fast 与运行基线未闭环
- 影响:代码已具备门禁,但部署入口仍可能绕过或缺失运行保障
- 建议:补 DevOps 基线、监控、回滚 runbook
Important
- 代码级通过与生产放行边界仍需持续防漂移
- 影响:团队可能再次把仓库内通过误写成“生产可上线”
- 建议:后续所有状态文档继续坚持三层门禁表达
6. QA 最终判定
当前项目应被定义为:
代码级门禁已通过,prod fallback 与 readiness P0 技术阻断已完成整改;但预生产与生产放行门禁尚未闭环,不能按“生产可直接上线”口径放行。
因此 QA 当前给出的正式门禁结论是:
- 代码级门禁:通过
- 预生产门禁:未通过
- 生产放行门禁:未通过
7. QA 自检清单
- 结论基于真实文件或实测结果
- 已明确区分代码门禁、预生产门禁、生产放行门禁
- 已根据代码实际状态回收旧阻断项
- 已保留仍未完成的真实环境与部署阻断项
- 没有把“全量测试通过”夸大成“生产可上线”