Files
ai-contract-platform/project-docs/V2-P1-04.9.1-kms-vault-slo-escalation-replay-handoff-runbook-2026-08-24.md
yuqei 1d85329a6a
Build and Test Quality Gate / Contract Web typecheck and build (pull_request) Successful in 9m12s
Build and Test Quality Gate / Isolated Alibaba and Tencent KMS gateway (pull_request) Failing after 4m53s
Build and Test Quality Gate / Python tests and Contract API migration (pull_request) Failing after 24m55s
Security Quality Gate / npm audit, Bandit, pip-audit, detect-secrets (pull_request) Failing after 8m42s
feat: deliver governed contract platform and async AI tasks
2026-08-26 12:53:47 +08:00

92 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.
# P1-04.9.1 实施与验收报告:KMS/Vault、SLO 升级、回放死信接管与错误手册
日期:2026-08-24
状态:实现、迁移、全量自动化与超级管理员 Chrome UAT 均完成。
## 1. 本阶段目标
1. 将企业日历 OAuth token、国内企业应用 secret、短期 token 与增量游标从单一本地主密钥扩展为可插拔 Vault Transit / 企业 KMS 托管。
2. 建立持久化恢复探针和不可变演练证据,确认“能加密”之外也“能恢复历史密文”。
3. 把日历 SLO 从只读仪表盘升级为打开、提醒、升级、恢复的通知生命周期。
4. 为回放死信增加负责人、人工重入、人工解决和不可变事件账本。
5. 将确定性错误分类发布为管理端可查的版本化运营手册。
## 2. 已实现范围
### 2.1 密钥托管
- 后端:`local_fernet`、`vault_transit`、`kms_gateway`。
- 新密文使用带后端版本的 envelope,错误后端不会静默尝试解密。
- Vault Transit 使用实际 encrypt/decrypt HTTP 契约;KMS 网关使用实际 HTTPS/Bearer 最小契约,可在网关侧适配阿里云、腾讯云或 HSM。
- 外部托管凭据只从文件读取,HTTP 不跟随重定向,生产强制 HTTPS。
- production 使用 `local_fernet` 时运行时检查返回 error。
- 旧 Fernet 密文通过独立、临时、只读 legacy recovery key file 双读,不允许与新密文后端混淆。
### 2.2 恢复演练
- 管理端展示脱敏托管状态、生产门禁、key reference 和旧密文恢复状态。
- `round_trip` 用于即时加解密验证;`recovery_canary` 会优先解密此前持久化的同一探针。
- 数据库不保存探针明文,只保存密文、期望摘要、恢复摘要、匹配结果、耗时和脱敏错误。
- 成功和失败都形成租户隔离的不可变证据。
### 2.3 SLO 告警升级
- 租户策略新增:告警开关、冷却分钟、升级等待分钟、恢复通知开关。
- Worker 生成 `opened`、`reminded`、`escalated`、`resolved` 事件。
- L1/L2 与首次观察时间一并保存;外部通知失败不影响 SLO 事件证据。
- 现有通知通道迁移时自动订阅 SLO 打开、升级、恢复和回放死信事件。
### 2.4 回放死信人工接管
- 回放任务新增负责人、接管原因、接管时间、人工重入累计、人工结论。
- 新增动作:`take_over`、`requeue`、`resolve`、`cancel`。
- 仅死信可接管、重入或人工解决;运行中任务禁止人工取消。
- 人工重入重置本轮 attempt count,但保留 `manual_requeue_count`、原失败运行和完整事件账本。
- 回放进入死信时自动发出站内及已订阅外部通知。
### 2.5 提供方错误手册
- 九类错误均定义默认重试性、首响/升级分钟、负责人角色和操作步骤。
- API 返回版本与 SHA-256 摘要,管理页展示同一目录,便于确认前后端手册一致。
- 本地详细手册:`project-docs/playbook-calendar-provider-error-operations-runbook-2026-08-24.md`。
## 3. 数据与接口
迁移:`20260824_0062`。
新增表:
- `playbook_secret_recovery_drills`
- `playbook_calendar_slo_alert_events`
- `playbook_calendar_replay_events`
新增接口:
- `GET /governance/secret-custody/status`
- `GET|POST /governance/secret-custody/recovery-drills`
- `GET /governance/calendar-slo-alert-events`
- `GET /governance/calendar-provider-error-catalog`
- `GET /governance/calendar-replay-jobs/{job_id}/events`
- `POST /governance/calendar-replay-jobs/{job_id}/intervention`
OpenAPI 当前为 117 paths / 174 schemas;最终验收会再次验证 YAML 可解析。
## 4. 明确边界
- 本地/UAT 没有伪造真实 Vault、阿里云 KMS 或腾讯云 KMS 账号;外部适配器通过隔离 MockTransport 验证请求、响应、密文 envelope 和 legacy 双读。
- 真正发布前仍需客户提供 Vault/KMS endpoint、key、文件凭据、CA 链和网络白名单,在隔离预发布环境执行恢复演练。
- KMS 网关负责云厂商认证、密钥轮换与 AAD 元数据;合同 API 不持有云厂商 AccessKey。
## 5. 验收证据
最终结果:
- [x] 后端:355 collected,351 passed,4 skipped;无失败。新增用例覆盖 Vault Transit、KMS 网关、legacy 双读、production 门禁、持久化恢复探针、SLO 打开/升级/恢复、回放死信接管/重入。
- [x] PostgreSQL:升级到 `20260824_0062 (head)`;全新 SQLite 从零升级到 head 也通过。
- [x] 前端:typecheck 通过;45/45 测试通过;生产 build 通过,143 个页面/路由。
- [x] OpenAPI:YAML 可解析,117 paths / 174 schemas,所有 schema `$ref` 均可解析。
- [x] 服务:Contract API `8100` health=ok,Web `3000` HTTP 200,AI API `8101` 保持运行;治理 Worker 重启且 stderr 无错误。
- [x] 超级管理员 Chrome UAT:账号 `uat.legal.20260823@example.test`、工作区“Playbook 隔离 UAT”;P1-04.9.1、托管状态、恢复探针、SLO 升级、错误手册、回放人工接管均可见,治理数据加载错误为 false。
UAT 未点击“解密持久化恢复探针”,避免在用户租户写入额外演练证据;该写操作已由隔离 API 自动化覆盖。