From 6f8b0160d6aa9f9f48b71da21c80182374889215 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Wed, 7 Oct 2026 13:25:33 +0800 Subject: [PATCH] =?UTF-8?q?docs(pool):=20=E6=9B=B4=E6=AD=A3=E5=AE=9E?= =?UTF-8?q?=E6=96=BD=E8=AE=B0=E5=BD=95=E7=9A=84=E6=B5=8B=E8=AF=95=E6=95=B0?= =?UTF-8?q?=E5=AD=97=EF=BC=88=E5=9F=BA=E7=BA=BF=20671=20/=20=E5=87=80?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=2095=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 「基线 727 / 新增 39」**两个数都错**:727 是 P1 完成时跑的全量,那时已经含了我 自己加的 56 条用例,被我误当成基线。真实基线是分叉点 `main@281769b` 的 `671 passed, 6 skipped`,净新增 **95**(6 个新测试文件 93 条 + overview 补 2 条), `671 + 95 = 766` 可复算。更正过程也留在文档里,因为这个错法容易再犯。 - 顺带更正同节另一处:`**task_actor(task)` 调用点是 **14** 个(初稿写 13)。 - 补记唯一租约的反向验证**复验**结果:摘掉 `uq_lease_active_account` 后 恰好 2 个用例变红、重建后变绿;并记下结论 —— 该索引是**真承重**的, 仅靠「排除已租」的查询挡不住(第二个会话看不到第一个会话刚写入的租约)。 本次只改文档,无代码/迁移改动。 --- docs/设计-账号自动分配与回收.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/设计-账号自动分配与回收.md b/docs/设计-账号自动分配与回收.md index 0ba4b3f..2de1b9a 100644 --- a/docs/设计-账号自动分配与回收.md +++ b/docs/设计-账号自动分配与回收.md @@ -902,8 +902,16 @@ WHERE a.ck_check_status='valid' AND a.elite_opened=1 ## 8. 实施记录(2026-10-07) > 状态:**已按本设计落地,测试通过;只在本地验证,未上生产**(第 10 条)。 -> 全量:`766 passed, 6 skipped`(改动前基线 727);新增 39 个用例; +> 全量:`766 passed, 6 skipped`;新增 **95** 个用例 +> (6 个新测试文件 93 条 + `test_account_overview.py` 补 2 条 D1 用例)。 +> **基线是分叉点 `main@281769b`:`671 passed, 6 skipped`** —— +> `671 + 95 = 766` 可复算。 > `ruff check` 与前端 `tsc -b` 均干净。 +> +> 📌 更正(2026-10-07):本节初稿曾写「基线 727 / 新增 39」,**两个数都错** —— +> 727 是 P1 完成时跑的全量,那时**已经含了我自己加的 56 条用例**,被我误当成了基线。 +> 真实基线 671、净新增 95。留在这里是因为「把带自己改动的中间态当成基线」 +> 这个错法很容易再犯:**先确认基线是在哪个提交上量的**。 ### 8.1 落地清单 @@ -914,7 +922,7 @@ WHERE a.ck_check_status='valid' AND a.elite_opened=1 | P1 · 服务 | `services/account_pool.py`:候选筛选、两梯队排序、供给与成本预估、租约领取/释放/回收、充值拆单与校验、补给链编排 | | P1 · 接口 | `routers/douyu_pool.py`:`GET /supply`、`POST /exchange`、`GET /leases`、`POST /leases/{id}/release`、`POST /leases/release-batch/{batch_id}` | | P1 · 权限 | `account:pool_use`(含 support)、`account:pool_admin`(超管/运营) | -| P1 · 流水 | 业务事件补 `actor_id = task.created_by`(7 个构造函数 + 13 个调用点);`GET /accounts/{id}/events` 支持 `actor_id` 筛选并返回 `actor_name` | +| P1 · 流水 | 业务事件补 `actor_id = task.created_by`(7 个 `record_*` 函数 + 14 个 `**task_actor(task)` 调用点);`GET /accounts/{id}/events` 支持 `actor_id` 筛选并返回 `actor_name` | | P1 · 上限 | `create_gold_qr` 服务端校验单次 ≤ 800 元;池路径超限自动拆单 | | P1 · 回收 | `_mark_task` 终态钩子即时释放租约 | | P2 · 作业 | `automation/jobs/account_lease_reaper.py`(TTL 到期 / 漏释放 / 孤儿批次),`run_interval_seconds=60` | @@ -943,7 +951,7 @@ WHERE a.ck_check_status='valid' AND a.elite_opened=1 | `ruff check` / `pytest` / `tsc -b` | 全部通过 | | dev 库是否需要归属移交 | **不需要**:12 个账号 `assigned_to` 全为 NULL,本来就都是池成员 | | 反向验证 ① D1 | 撤掉 `subject_key` 的实现 → 2 个用例变红;恢复 → 变绿 | -| 反向验证 ② 唯一租约 | 去掉 `uq_lease_active_account` → 并发/重复领取 2 个用例变红;恢复 → 变绿 | +| 反向验证 ② 唯一租约 | 摘掉 `uq_lease_active_account` → `test_second_lease_on_same_account_is_rejected` 与 `test_concurrent_lease_from_two_sessions_only_one_wins` **2 个用例变红**;重建索引 → 变绿(复验于 2026-10-07,索引是**真承重**:仅靠「排除已租」的查询挡不住 —— 第二个会话看不到第一个会话刚写入的租约) | | 反向验证 ③ 回填脚本 | 让 `--dry-run` 真的写库 → 对应用例变红;恢复 → 变绿 | | 反向验证 ④ 运行期闸门 | `_skip_when` / `_depends_on` 各有"不该跳却跳 / 该跳没跳"的双向用例 |