Record the task/quota exception matrix (isolated fault injection) results, the admin quota concurrency fix, the isolated restore drill (business/CMS/audio, with the pre-existing missing-audio finding), upstream security launch blocker, and remaining minor items. Each item marked pass / fail / awaiting-external with test version and evidence. Do not mark reliability/launch-blocking items complete.
69 lines
5.2 KiB
Markdown
69 lines
5.2 KiB
Markdown
# 验收记录(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)。
|