# 客服 SLA 与升级响应规范

> 版本：v1.1  
> 状态：已更新为灰度门禁口径  
> 关联：`docs/MONITORING_ALERTING.md`、`docs/GRAY_DASHBOARD_MINIMUM.md`、`prd/GRAY_RELEASE_ROLLBACK_RUNBOOK.md`

---

## 1. Phase 1 灰度期 SLA

灰度期的 SLA 不是最终商业承诺，而是**是否继续放量**的门槛。

### 1.1 核心灰度门槛

| 指标 | 目标值 | 用途 |
|------|--------|------|
| Webhook 成功率 | `>= 99%`（5 分钟窗口） | 是否允许继续放量 |
| Webhook 5xx | `< 1%`（5 分钟窗口） | 超阈值即停止放量 |
| Readiness 可用率 | `>= 99.5%` | 实例是否稳定接流量 |
| PostgreSQL 依赖异常 | `= 0`（5 分钟窗口） | 关键依赖门禁 |
| Audit 写入失败数 | `= 0`（5 分钟窗口） | 合规/追溯门禁 |
| Handoff 比率 | `<= 25%` 或不高于基线 `2x` | 判断机器人能力是否异常退化 |
| 工单接单时间 P95 | `<= 30 分钟` | 人工链路可承载性 |
| 工单解决时间 P95 | `<= 4 小时` | 最小服务能力 |

### 1.2 灰度期分级

| 级别 | 定义 | 响应时间 | 恢复目标 |
|------|------|----------|----------|
| P0 | 数据库不可用、全量 5xx、审计主链断裂 | 5 分钟 | 30 分钟内恢复或回滚 |
| P1 | 5xx > 1%、连续 readiness down、ticket 主链异常 | 15 分钟 | 1 小时内恢复或回滚 |
| P2 | reject 异常升高、handoff 比率异常、重启抖动 | 30 分钟 | 4 小时内恢复 |

---

## 2. 升级与通知规则

| 触发条件 | 等级 | 通知 |
|----------|------|------|
| Webhook 5xx `> 5%` 持续 5 分钟 | P0 | 电话 + 飞书，立即回滚 |
| PostgreSQL 连接异常导致 `ready` 失败 | P0 | 电话 + 飞书，立即冻结放量 |
| Audit 写入失败数 `> 0` 持续 5 分钟 | P1 | 飞书，立即停止继续放量 |
| Handoff 比率 `> 25%` 或高于基线 `2x` | P2 | 飞书，需人工研判 |
| 单实例 10 分钟内重启 `> 2` 次 | P2 | 飞书，冻结当前档位 |

---

## 3. 当前实现与 SLA 的关系

### 3.1 已有支撑

- `live` / `ready` 探针已具备
- PostgreSQL readiness 检查已接入
- webhook HMAC / timestamp / dedup 已具备
- ticket / audit / dedup 本地/容器化 Gate B 已证据化通过

### 3.2 仍待落地

- 真实共享预生产环境上的统一指标采集
- 告警平台接入
- 灰度阶段的自动统计和 dashboard

因此当前 SLA 结论应当理解为：

> **门槛已定义，但真实共享预生产和灰度环境的观测接线仍需补齐。**

---

## 4. 与放量门禁的绑定

进入下一灰度档位前，必须满足：

1. 最近一个观察窗口 `webhook 5xx <= 0.5%`
2. `audit 写入失败数 = 0`
3. `postgres 连接异常 = 0`
4. 无连续 `readiness down`
5. handoff / ticket 指标没有异常飙升

任一条件不满足：

- 不允许继续放量
- 必要时触发回滚

---

## 5. 当前版本状态

- 文档版本：`v1.1`
- 本次更新日期：`2026-05-04`
- 下次审查：灰度第一轮结束后

