交付出件箱
← 返回出件箱
Phase83 施工文档「文档欠账」核验报告(只读核验,未改文档/代码)
- 日期:2026-09-29 · 基线:origin/main(detached worktree,云机环境·非验收证据) · 文档:origin/feature/phase83-batch4-impl 版 phase83-subseat-brandcode-batch1.md(1074 行)
- 结论符号:✅可勾 / ⚠️证据不全 / ❌与代码不符
- 本次真跑(连本地真 PG,无 mock):
- A. tests/integration/test_phase74_admin_parent_seats.py + tests/unit/test_phase83_seat_seq_counter.py + tests/integration/test_admin_brand_code.py = 54 passed(27+11+16)
- B. batch4 三文件 + test_phase83_temp_password.py = 46 passed
- C. batch5 六文件 + test_phase83_bound_seats_refresh_e2e.py = 73 passed
- D. vitest 批次一二:parent-seats-xlsx / badge-extend / brand-code-seat-actions / detail-filter-multi = 4 文件 33 passed
- E. vitest 批次四五(15 文件)= 141 passed / 2 failed(h5/tablet/components/tests/seat-login.spec.tsx「重新验证微信身份」两条:找不到 placeholder「用户名」,83.19 起平板登录框已改「席位账号」,旧断言过期)
- F. vitest 另跑 6 文件 = 36 passed / 4 failed(admin-orgs-access-link test3/4、admin-orgs-field-search 两条「全部」模式;均为过期旧测试,83.22 提交说明已登记前两条为预存)
- 未跑:npm run build(本机 2vCPU/1.2G 可用,风险)、verify.sh chat-e2e(本机无常驻后端,批次五提交说明自称跑不通)。相关行如实标 ⚠️。
- 提交索引:批次一 e1aae44d(83.1-83.5) · 批次二 38aae4bc(83.6-83.9) · 批次三 fb5abbb7(83.10-83.11) · 文档债清理 0973c19f · 83.13 eb23a88d · 83.14 3e7c1656 · 83.19 50a4755c · 83.20 dd3202f4 · 83.21 867563a4 · 83.22 031058a3/8fe7e83b · 83.23 a729f6c1 · 批次四 e491c362/e39dcf51/a73c2873/b8e3591b/3b4c3001/368fd562/df70fc94/b8fb1bdd/7510ed62/dfb41fb6
- 共性说明:各提交把测试与实现放同一提交,git 看不出「先测后码」。RED 类步骤只能靠提交说明自述;说明里有具体 RED 数值/回退实测的记 ✅,仅自述的记 ⚠️「过程证据缺失」。「Commit」类步骤:提交存在即 ✅。
进度表非 ✅ 的行
83.4 🔄 / 83.5 🔄 / 83.10 🔄 / 83.11 🔄 / 83.12 🔄 / 83.20 🔄 / 83.22 🔄。(83.6-83.9 进度表已是 ✅,但步骤复选框仍全空,一并核验。)
83.1 后端排除 brand_code(e1aae44d)
- Step1 写失败测试 | ✅ | test_phase74_admin_parent_seats.py:277 test_brand_code_source_excluded_from_all_endpoints,本次通过
- Step2 RED | ⚠️ 过程证据缺失 | 提交说明称走完 RED→GREEN,RED 原文不在仓库/reports;仅有基线对照(基线 3 failed/13 passed vs 本分支 3/16)
- Step3 实现 | ✅ | parent_seat_service.py:92-100 _apply_filters else 分支
- Step4 PASS | ✅ | A 组 54 passed
- Step5 影响面复核 | ✅ | test_admin_brand_code.py 本次 16/16 绿
- Step6 Commit | ✅ | e1aae44d
83.2 统计排除已停用
- Step1 | ✅ | test_phase74…:458 test_in_use_stats_exclude_disabled_seat
- Step2 RED | ⚠️ 过程证据缺失
- Step3 | ✅ | parent_seat_service.py:47 _in_use_cond 含 is_active
- Step4 | ✅ | A 组绿
- Step5 口径一致 | ✅ | 自检截图 ~/reports/phase83-parent-seats-badge-selfcheck.png:「共3个·使用中1·已到期1」与三行列表一致
- Step6 | ✅ | e1aae44d
83.3 延期透传路由
- Step1 含越权用例 | ✅ | test_phase74…:522 起(门店席位 id 打 extend 全 404 且状态未变)+ :553 test_extend_parent_seat
- Step2 RED | ⚠️ 过程证据缺失
- Step3 | ✅ | admin_parent_seats.py:557 @router.patch("/{seat_id}/extend")
- Step4 | ✅ | A 组绿
- Step5 | ✅ | e1aae44d
83.4 前端明细页(🔄)
- Step1 | ✅ | web/tests/admin-parent-seats-badge-extend.test.tsx(6 条)+ parent-seats-xlsx.test.ts:99
- Step2 RED | ⚠️ 过程证据缺失
- Step3 | ✅ | parent-seats/page.tsx DISABLED_BADGE/sourceLabel
- Step4 | ✅ | D 组 33 passed
- Step5 真渲染自查 | ✅ | phase83-parent-seats-badge-selfcheck.png(亲看:「已停用」红底、「已到期」灰底、「使用中」绿,可区分;本地自检数据);另 phase83-test-badge.png(test)
- Step6 | ✅ | e1aae44d
- 建议:83.4 可标 ✅
83.5 品牌码页操作列(🔄)
- Step1 | ✅ | admin-org-brand-code-seat-actions.test.tsx:144 NULL 置灰 / :156 停用 / :189 延期
- Step2 RED | ⚠️ 过程证据缺失
- Step3 | ✅ | admin_brand_code.py:143 family_seat_user_id;orgs/[id]/brand-code/page.tsx 第9列
- Step4 | ✅ | D 组绿
- Step5 真渲染(含 NULL 置灰) | ✅ | phase83-brandcode-column9-selfcheck.png(亲看:第1行停用/延期置灰,第2行蓝色可点)
- Step6 | ✅ | e1aae44d
批次一 验收标准仍 [ ] 的 2 条
- 〔待 test 真点〕已停用徽章 | ⚠️ | vitest + 本地渲染截图有证据;test 上无已停用席位,「test 真点」缺证据(接受本地渲染+vitest 则可勾)
- 〔待 test 真点〕品牌码页两按钮/NULL 置灰 | ⚠️ | 两按钮 test 真点 9-24 已记;NULL 置灰仅 vitest+本地截图
83.6 导出全量(38aae4bc)
- Step1 | ✅ | test_phase74…:635 test_export_full_count_not_capped_at_200、:670 truncation_flag
- Step2 RED | ⚠️ 过程证据缺失
- Step3 | ✅ | parent_seat_service.py:255 org_seat_rows_for_export;EXPORT_MAX_ROWS 现 60000(83.36 改,文档 83.6 正文仍写 20000)
- Step4 | ✅ | A 组绿
- Step5 | ✅ | 38aae4bc
83.7 时间通道/筛选基准/绑定时间
- Step1 | ✅ | test_phase74…:397、:433
- Step2 RED | ⚠️ 过程证据缺失
- Step3 | ✅ | admin_parent_seats.py:468 time_field;parent_seat_service.py:126/215
- Step4 | ✅ | A 组绿
- Step5 向后兼容 | ✅ | 默认 opened;phase74 文件 27 条全绿
- Step6 | ✅ | 38aae4bc
83.8 状态多选
- Step1 | ✅ | test_phase74…:233
- Step2 RED | ⚠️ 过程证据缺失
- Step3 | ✅ | admin_parent_seats.py:80 _parse_states
- Step4 无回归 | ✅ | phase74 文件 27/27 绿
- Step5 | ✅ | 38aae4bc
83.9 前端筛选联动(进度已 ✅)
- Step1 | ✅ | admin-parent-seats-detail-filter-multi.test.tsx(7 条)
- Step2 RED | ✅ | 提交说明:revert 原始代码实测 7 全挂
- Step3 | ✅ | page.tsx dParams()/多选/绑定时间列
- Step4 | ✅ | D 组绿
- Step5 build | ⚠️ | 提交说明称 Compiled successfully 22.1s、82/82 静态页;原始 Route 表不在仓库;本次未复跑;test/生产部署成功间接佐证
- Step6 | ✅ | 38aae4bc
(批次二验收标准已全 [x],无残留。)
83.10 计数表(🔄)
- Step1 | ⚠️ | 原 8 条测试(fb5abbb7)已在 83.14(3e7c1656)整体重写为 11 条前缀取号测试,现文件不再测旧表结构/月度自增
- Step2 RED | ⚠️ 过程证据缺失
- Step3 | ✅ | app/models/seat_seq_counter.py、migrations/versions/phase83_001_seat_seq_counter.py 在 main
- Step4 | ⚠️ | 旧测试已删;现存 11 条通过但测批次五逻辑
- Step5 SQL 真打 | ✅ | 提交说明称 information_schema 真打;9-24 test 库实查含 phase83_001
- Step6 | ✅ | fb5abbb7
- 说明:该表 83.14 起不再写入(seat_service.py:176 注释),表/模型保留
83.11 新号码生成(🔄)
- Step1 | ❌ | 「6位+YYMM」「新号撞旧号」用例(test_new_seq_skips_colliding_old_username 等)随 83.14 删除,main 上 0 命中;家长号现为「机构前缀+6位」
- Step2 RED | ✅ | 提交说明贴 RED 数值 before=1922202609→after=2423202609
- Step3 | ❌ | _alloc_seq_batch/_parent_period 已删;seat_service.py:214 _alloc_parent_usernames 为新逻辑
- Step4 | ❌ | 同 Step1
- Step5 并发用例 | ⚠️ | 旧并发用例已删;现有并发用例为 batch4 test_bulk_open_concurrent_run_batch_no_double_open
- Step6 | ✅ | fb5abbb7
- 建议:83.11 标「被 83.14 取代」,不勾
83.12 性能实测(🔄)
- Step1 5 调用方回归 | ⚠️ | 提交说明列 admin_seats 52/internal_settlement 7/store_subseat 25/brand_code_service 24/admin_parent_seats 4 passed;原文未存档,本次未复跑
- Step2 三档实测 | ⚠️ 缺证据 | reports/ 与仓库无 100/500/1000 原始耗时表
- Step3 前后对比 | ⚠️ 缺证据
- Step4 决策数据 | ⚠️ | 批次四 tech 与 83.33 实测(5 万 21.3 秒)已实际取代,但非本步产物
- Step5 Commit | ⚠️ | 无 83.12 提交(git log --grep 无)
- 建议:83.12 标「被批次四实测取代」,不勾
批次三 验收标准仍 [ ] 的 3 条
- 并发开号不撞号不 500 | ⚠️ | IntegrityError→409 仍在 seat_service.py:206;并发用例 batch4 bulk_open / brand_code test_01 通过;但 IntegrityError 兜底分支从未真触发
- 老号不迁移不受影响 | ⚠️ | 否定性全称命题;间接:batch4 test_old_users_rows_seat_batch_id_all_null、batch5 老号回归通过
- 三档性能数据齐全 | ⚠️ 缺证据
83.20(🔄)
- Step5 chat-e2e 真跑 | ⚠️ 缺证据 | dd3202f4 说明「chat-e2e 未跑通(token 铸造失败)」;test-inspect 无读取权限;无 .verify/chat-e2e.json 存档
- (Step1-4 已 [x];seat-change-password-sheet.spec / auth.spec / parent-account-card.spec 本次通过)
- 建议:保持 🔄,待 root 提供部署后 chat-e2e 结果
83.22 总验收(🔄)
- Step3 build Route 表 | ⚠️ | 031058a3 自述「本机内存不足未跑」;83.33 Step2 记 build 通过未贴 Route 表;生产已部署佐证;本次未跑
- Step4 chat-e2e | ⚠️ 缺证据
- Step5 test 真点 16 块 | ⚠️ | ~/reports/phase83-b5-test-acceptance-20260925.md 覆盖 7/16 块(4/9/10/12/13/14/15),其余 9 块「未覆盖」;截图 phase83-b5-test-shots/ 10 张
- Step6 数据完整性 SQL | ⚠️ | 同报告 C 节:prefix/计数表直查通过;users.phone_login_enabled 受 RLS 假 0,仅 n_live_tup 差值 7 交叉验证
- 建议:保持 🔄
批次五 验收标准(28 条,均 [ ])
测试引用均在 tests/integration/test_phase83_batch5_*.py(C 组 73 passed)
1. 新号格式/连号/机构互不影响 | ✅ | test_phase83_seat_seq_counter.py:126 + test 报告 A5a(QEYXL100001/100002)
2. 无前缀四处拦下 | ✅ | seat_seq_counter.py:164/181/199/218;test 报告仅实测 2 处,另 2 处真 PG 集成测试覆盖
3. 前缀规则与三种报错 | ✅ | batch5_prefix_api.py:204/223/245/260;test 报告 4a-4d/5b
4. 老号行为一字不差 | ⚠️ | 否定性全称命题;seat_login test_02 绿,test 报告标未验
5. 新号仅手机号登录、框显示「手机号」、微信自动填 | ⚠️ | seat_login test_01/wx_forgot_pwd test_02 ✅;seat-login-hints.spec ✅;微信自动填需真微信未验
6. 首登/重置新号弹设置框(手机号必填) | ✅ | seat_login test_03、wx_forgot_pwd test_08;test 报告 7b-1 + b9 截图
7. 一老一新「手机号或账号」 | ✅ | wx_forgot_pwd test_03;seat-login-hints.spec;真机未验
8. 同手机号候选逻辑 | ✅ | seat_login test_05/06
9. 门店页/平板只找门店号 | ✅ | seat_login test_07;平板 UI 未真点
10. 查无此人免告警冷却、审计打码 | ✅ | seat_login test_04/10/14;test 报告 7c-3 trace
11. 小写老门店号 test 真登 | ⚠️ | extra_coverage test_d1 ✅;test 真登因不得改老号密码未做
12. 检查单页只找家长号 | ✅ | seat_login test_08(scene=parent);页面未真点
13. 新号没设密码先找回仍能账号登 | ✅ | extra_coverage test_a1
14. 品牌码家长改密手机号栏不卡 422 | ✅ | extra_coverage test_b1 + parent-account-card.spec
15. 初始化弹窗统一「手机号」 | ✅ | seat-change-password-sheet.spec 绿;test 报告 b9
16. 平板登录框写法与手机端一致 | ⚠️ | phase68-seat-login.spec 绿,但 tablet/seat-login.spec 2 条旧断言失败(E 组),平板 UI 未真点
17. 找回成功后手机端与平板回填手机号 | ⚠️ | wx_forgot_pwd test_06 ✅ + seat-bound-seats-cache-refresh.spec ✅;真机回填未验
18. phase74 预存失败已修、全绿 | ✅ | 该文件本次 27 条全绿(文档写 25,后续新增)
19. 结算清理孤儿不删品牌码家长 | ✅ | batch5_brand_code.py:375 test_07
20. 设完密码下次登录预填手机号 | ✅ | bound_seats_refresh_e2e test_01-03 + seat-bound-seats-cache-refresh.spec(a729f6c1)
21. 品牌码家长没设密码点四功能先弹框 | ⚠️ | dd3202f4 实现;vitest 绿,但依赖 chat/page.tsx 无 chat-e2e/真机证据
22. 换微信用手机号登录被拦 | ✅ | seat_login test_09、extra_coverage test_c2
23. 自助找回后自动填回手机号 | ⚠️ | 同 17
24. 品牌码新扫码家长先弹设置框;老用户免密 | ⚠️ | batch5_brand_code test_01/02 ✅;前端弹窗依赖真微信扫码未真点
25. 品牌码页手机号列+重置密码、无换绑 | ✅ | brand-code-seat-actions.test.tsx:216/236 + test 报告 b6
26. pytest/vitest/build/chat-e2e 全通过 | ❌ | pytest 全绿;vitest 现有 2+4 条过期失败(E/F);build、chat-e2e 缺原文
27. test 真点 16 块截图 | ⚠️ | 仅 7/16
28. 数据完整性 SQL | ⚠️ | 同 83.22 Step6
83.33 尾部
- Step7 清理 | ⚠️ | 进度表写「root 清理,users 50480→315」;无 root 原始输出可查
- Step8 发生产 | ✅ | 进度表 MR#803 main=0264947e;调用方已核 release_main status 781/792/796/799/801 全已发;长官亲点通过
批次四 验收标准(12 条,均 [ ])
- 开号期间全站正常(登录抽测延迟有实测数) | ⚠️ 缺证据 | 83.33 记录只有 5 万耗时 21.3 秒;reports/ 无登录延迟数据
- 批量开号记录入口/仅本机构/倒序/进度 | ✅ | bulk-open.test.tsx:247/255/266;bulk_open.py:806;长官目视
- Excel 4 列/临时密码/已激活/已重置 | ✅ | bulk_open.py:864;83.33 记录表头加粗+冻结
- 临时密码登录绑微信/首登强制改密/旧密失效 | ✅ | batch4_seat_login test_1(must_change True+绑 openid)、test_5;长官真机首登
- 失败批继续开/置灰/下载已开部分 | ✅ | bulk_open.py:237/986;bulk-open.test.tsx:266
- 同时一批;余量不够红字不建批 | ✅ | bulk_open.py:315/369/773;bulk-open.test.tsx:204
- 重启自动续开 | ✅ | bulk_open.py:431(单测级,无 test 真重启)
- 老号/门店号/管理员登录不受影响 | ⚠️ | batch4_seat_login test_3/4、batch5 test_11 ✅;否定性命题,test 未专测
- 品牌码连点只建 1 号;不做 argon2 | ✅ | batch4_brand_code test_01/03/05(含无锁对照)
- 三表列对齐符合效果图 | ⚠️ | bulk-open.test.tsx:281/292 断言列对齐 class;无与效果图截图对比
- pytest/vitest 真绿;build 通过 | ⚠️ | pytest 46 passed、vitest 绿;build 无 Route 表;test_app_import_smoke.py(83.33 Step1 提及)在 origin/test 与批次四分支存在,origin/main 上没有
- test 压测数据 root 删净 | ⚠️ | 同 Step7
汇总(120 个 - [ ]:批次一 29+2、批次二 22、批次三 17+3、83.20 1、83.22 4、批次五 28、83.33 2、批次四 12)
- ✅ 可勾:约 79
- ⚠️ 证据不全:约 37(含 RED 过程证据缺失 10)
- ❌ 与代码不符:4(83.11 Step1/3/4 被 83.14 取代;批次五验收 #26)
建议进度表状态
- 83.4 → ✅;83.5 → ✅(仅遗留 test 真点)
- 83.10 → ✅ 或标「部分被 83.14 取代」;83.11 → 「已被 83.14 取代」不勾;83.12 → 「被批次四实测取代」
- 83.20 → 🔄;83.22 → 🔄
- 83.33 Step8 可勾;Step7 待 root 输出佐证
其他真问题
- main 上 6 条过期 vitest 失败:tablet/components/tests/seat-login.spec.tsx 2 条(placeholder「用户名」→「席位账号」)、admin-orgs-access-link test3/4、admin-orgs-field-search 2 条
- tests/contract/test_app_import_smoke.py 不在 origin/main(在 test 与批次四分支)
- 83.6 正文 EXPORT_MAX_ROWS=20000 已被 83.36 改 60000,文档应注明