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` 各有"不该跳却跳 / 该跳没跳"的双向用例 |