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.
5.2 KiB
5.2 KiB
验收记录(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)。