www_site/docs/ACCEPTANCE.md

69 lines
5.2 KiB
Markdown
Raw Permalink Normal View History

# 验收记录ACCEPTANCE
日期2026-09-10 · 基线 `9568622` · 本轮修复/部署版本 `8657f44`
状态标记:**通过 / 失败 / 待外部条件**。每项附测试版本与证据。故障注入均在隔离环境(隔离库 `kaotings_p5`、隔离音频目录、伪造上游)进行。
## 1. 任务与额度异常矩阵Phase 3 遗留)
| 编号 | 验收项 | 版本 | 结果 | 证据 |
| --- | --- | --- | --- | --- |
| A-1 | 成功基线(写入/结算/回放/下载) | 8657f44 | 通过 | S1`succeeded`used 2冻结 0回放/下载 200音频文件存在 |
| A-2 | 最后额度并发争用 | 8657f44 | 通过 | S2并发 2 请求 → `codes=[202,409]`,仅 1 个冻结成功used 3 / 冻结 0 / 可用 2 |
| A-3 | 管理员并发调减额度不变式 | 9568622 → 8657f44 | **失败→修复→通过** | S3基线 7/8 轮破坏不变式;修复后 8 轮恒 `limit+adjustment-used-reserved>=0`(最坏可用 10 |
| A-4 | 冻结与调减并发压测 | 8657f44 | 通过 | S4终态不变式成立、冻结归零used 24 / 冻结 0 / 可用 16 |
| A-5 | queued 重启恢复 | 8657f44 | 通过 | S9`queued→succeeded`,重启后音频存在 |
| A-6 | running 租约过期恢复 | 8657f44 | 通过 | S10`failed / WORKER_LEASE_EXPIRED`,冻结释放 |
| A-7 | 音频写入与结算中断(存储失败) | 8657f44 | 通过 | S7目录不可写 → `failed`,冻结释放,无残留文件 |
| A-8 | 上游超时 | 8657f44 | 通过 | S8`failed / UPSTREAM_TIMEOUT`,冻结释放 |
| A-9 | 非音频 / 损坏 / 超大 / 5xx 响应 | 8657f44 | 通过 | S5`UPSTREAM_NOT_AUDIO` / `UPSTREAM_AUDIO_CORRUPT` / `UPSTREAM_RESPONSE_TOO_LARGE` / `UPSTREAM_HTTP_500`,均冻结释放、无文件 |
| A-10 | 跨周期结算 | 8657f44 | 通过 | S6结算落到任务创建时所属上一周期账户本周期 used 不变 |
复现:`services/api/tests/phase5_exception_matrix.py`(退出码 0 = 全通过)。
## 2. 自动化验收固化
| 编号 | 验收项 | 版本 | 结果 | 证据 |
| --- | --- | --- | --- | --- |
| B-1 | 测试工具/依赖版本/运行说明入仓库 | 8657f44 | 通过 | `services/api/requirements.txt`、`requirements-test.txt`、`tests/README.md`、`tests/provision_isolated_env.sh` |
| B-2 | 秘密经环境注入,不落仓库 | 8657f44 | 通过 | `provision_isolated_env.sh` 仅读 `SUDO_PASSWORD`/`P5_DB_PASSWORD` 等环境变量;仓库无秘密 |
| B-3 | 独立环境可重复执行 | 8657f44 | 通过 | 隔离库 + 隔离音频 + 伪造上游多次运行,退出码稳定 |
## 3. 音频运维与恢复
| 编号 | 验收项 | 版本 | 结果 | 证据 |
| --- | --- | --- | --- | --- |
| C-1 | 业务库隔离恢复 | 8657f44 | 通过 | 行数源=恢复users 35 / quota 34 / tasks 28 / audio 26 / usage 61 / grants 10 |
| C-2 | CMS 库隔离恢复 | 8657f44 | 通过 | 14 张表products=1 / users=1 / migrations=1 |
| C-3 | 音频恢复 + 历史↔音频关联 + 额度一致 | 8657f44 | 通过(带发现) | 磁盘 22 文件全部被 `available` 引用(无孤儿);额度↔流水 0 不符;**发现 4 条 `available` 行无文件**(既有,回放 404 优雅降级) |
| C-4 | 容量/保留/清理/备份方案 | — | 待外部条件 | 保留期/容量上限/清理策略需用户确认(见 OPERATIONS.md §3本轮不擅自删除既有音频 |
## 4. 上游安全
| 编号 | 验收项 | 版本 | 结果 | 证据 |
| --- | --- | --- | --- | --- |
| D-1 | 上游传输加密HTTPS/mTLS/专线) | — | **待外部条件(上线阻断)** | 现为公网 HTTP需上游提供加密端点与证书/接入方式 |
| D-2 | 来源限制(限本站出口) | — | **待外部条件(上线阻断)** | 需上游提供允许的来源网段;业务侧保留 Bearer Key |
| D-3 | 外部网络复测 | — | **待外部条件** | D-1/D-2 解除后重跑成功/失败/超时矩阵与不可达核查 |
## 5. 剩余小项
| 编号 | 验收项 | 版本 | 结果 | 证据 |
| --- | --- | --- | --- | --- |
| E-1 | 不新增按 slug REST 路由,统一 `where` 查询 | 8657f44 | 通过 | 公网展示走 `where[status][equals]=published` + `where[slug][equals]=`200 |
| E-2 | 非法 ID 500 不泄露堆栈/内部信息 | 8657f44 | 通过 | `GET /cms/api/products/:slug`(非 UUID) → 500 通用 `{"errors":[{"message":"Something went wrong."}]}`,扫描无堆栈/路径 |
| E-3 | SMTP 未接入维持 V1 限制,受控管理员恢复流程可用 | 8657f44 | 通过 | 验证渠道返回未启用;恢复流程见 `docs/cms-admin-recovery.md` |
## 6. 部署与版本
| 编号 | 验收项 | 结果 | 证据 |
| --- | --- | --- | --- |
| F-1 | 修复提交并部署 | 通过 | 发布 `8657f44`,软链已指向,仅重启 `kaotings-api` |
| F-2 | 版本核对 | 通过 | 线上 `main.py` SHA256 `571037f4…` = 本地 `8657f44``is-active active``/healthz ok` |
## 未通过 / 待外部条件(不得标为完成)
- **D-1 / D-2 / D-3上线阻断**:公网 HTTP 上游未加密、无来源限制、未外部复测。
- **C-4**:音频容量/保留/清理参数待用户确认。
- **C-3 发现**4 条 `available` 音频行无文件,待调查根因(不阻断恢复)。
- 旧 Big-TTS Web 退役前需旧系统负责人提供源端备份证明与替代验收确认(沿用 Phase 3/4