Przeglądaj źródła

test(tdd): 第133轮闭环——B-59 admin 登录时序哨兵自处置闭环(waitForURL 替换固定等待,隔离2轮5/5)+ R133 汇报/台账推送

E2E Test Bot 2 dni temu
rodzic
commit
b7d74eedc8

+ 191 - 0
docs/tdd/orchestration/report-test-2026-11-11-0116.md

@@ -0,0 +1,191 @@
+# 测试负责人工作汇报 · 第 133 轮(2026-11-11 01:16 GMT+8,本自动化触发)
+
+> 执行档:**review(内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化已授权;langgraph@251 分派;未联网装依赖、未启停服务、未改生产代码;测试侧自处置 B-59 修复)**
+> 基线 HEAD:`91146bfc6`(R132,01:05)→ **origin/cfclub == local HEAD(窗口内零新提交/零部署)**
+> 节点:`cfc.iwintrue.com:443`=302(可达)|`192.168.16.189:4090`=200(opencode 在线)|`192.168.16.251:9000/health`=**200(OPEN)**|`251:4096`=200(LLM 凭据门控 B-74)|`204:4090`=000(B-95 持续)
+> 分工:**本机 204**=admin-desktop / frontend-mobile / shop-api / health 浏览器套件 + Jest|**251**=langgraph pytest(服务 OPEN,LLM 依赖用例受 B-74/B-126 环境阻塞)|**189** 在线但缺 tests/e2e-live + node_modules(B-122 历史),本轮本机直跑覆盖
+> 结论:⛔ **不通过(有条件)** — 核心三项延续(G2 后端 33 红基线 / G9 锚点 9.9% / G11 无 CI)+ **langgraph LLM 依赖 10 例全环境阻塞(B-126 + 429)**;**正向**:本轮回检发现 admin 登录时序哨兵偶发失败,定位为已知测试侧债务 **B-59** 并**自处置闭环(2× 隔离 5/5 全绿验证)**,浏览器 28/28 维持稳定、web/fe Jest 588 例零红。
+
+---
+
+## 1. 历史审查记录(仅作对照,不作为本轮结论依据)
+
+| 轮次 | 时间 | 后端全量 | langgraph | 浏览器 | 结论 |
+|---|---|---|---|---|---|
+| R130 | 11-10 20:5x | 2865/2828/33 红 | 38/43(5 红全 429) | 28/28 | 不通过(有条件) |
+| R131 | 11-10 23:16 | getArticleTags 用例新增 | 快报 | 28/28 | 快报 |
+| R132 | 11-10 夜 | 契约 16/16 新增绿(全量沿用 R130) | 33 绿 / 10 环境阻塞 | 28/28 | 不通过(有条件) |
+| **R133(本轮)** | 11-11 01:16 | 沿用 R130 基线(零部署) | 33 绿 / 10 环境阻塞(沿用 R132) | **28/28  authoritative**(含 B-59 自处置) | **不通过(有条件)** |
+
+- 本轮为该对象**第 133 轮**持续闭环审查,非首次审查。
+- 与 R132 对比:**Jest 全绿零漂移**(fe 472/3skip、web 116/116);**浏览器 authoritative 28/28 维持**(admin 5/5 经 B-59 修复后隔离 2× 全绿、frontend 6/6、shop 4/4、health 13/13);langgraph 沿用 R132 权威(251:9000 本轮回探 OPEN,改善可达性,但 LLM 依赖 10 例仍受 B-74/B-126 环境阻塞)。
+- **本轮最重要动作(测试侧自处置)**:全量浏览器跑出现 admin `TC-A-U05` 单点失败(登录前置未通过),隔离复跑发现失败在 U04/U05 间**轮换**(两者均走真实登录滑块链路)→ 定位为已知测试侧债务 **B-59**(登录后固定 `waitForTimeout(5000)` 在负载高时过短,跳转后台尚未完成即断言)。已按 B-59 建议③ 将 U04/U05 登录后等待改为 `waitForURL(/\/admin\/dashboard/, {timeout:20000})`,隔离复跑 **2 轮均 5/5 全绿(U04≈6s / U05≈53s)**,B-59 闭环。**因窗口内零部署(origin==HEAD==R132),该偶发属测试侧时序脆弱,非产品回归**。
+
+---
+
+## 2. 项目画像速览
+
+- **业务**:浠艾福 XAF —— 家庭教育 SaaS(家庭成员 / 五维能量 / 成长规划师 / 健康报告解析 / 商城分佣 / AI 管家)。
+- **技术栈**:`cfc-backend`(Spring Boot 2.7.18 + MyBatis-Plus + Java 8,9082)· `cfc-web`(Vue2 + ElementUI,8082)· `cfc-frontend`(uni-app H5/小程序)· `cfc-langgraph`(FastAPI + LangGraph + Chroma,9000,部署 192.168.16.251)· `dan/danshop`(独立商城 8888)。
+- **关键路径**:登录/家庭邀请 → 五维测评 → 成长任务审批 → 健康报告上传解析 → 商城下单分佣 → AI 对话 → 知识中心标签筛选。
+- **测试现状**:后端 339 测试类 / 2865 例(全量 46:17,R130 基线)+ 新增契约 16 例;前端 Jest 28 套件 475 例(472 过 + 3 skip);管理端 Jest 17 套件 116 例;浏览器 live 28 例;langgraph 43 例(251 实派);根级黑盒 23 例。
+- **质量目标**:20 类全覆盖、G1≥95%、G2≤10 红、G6 28/28、G7 0 红、G9≥80%。
+- **风险点**:后端 33 红长期未闭环(R130 基线);LLM 依赖 10 例环境阻塞(B-126 + 429);204 节点失联;无 CI 全量门禁;B-59 已于本轮自处置闭环。
+
+---
+
+## 3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)
+
+| # | 测试类型 | 状态 | 证据 |
+|---|---|---|---|
+| 1 | 单元测试 | ✅ 已实测 | 后端 2865 例(R130 基线)+ 契约 16 例;web 116;fe 472 |
+| 2 | 组件测试 | ✅ 已实测 | Vue shallowMount 组件用例(Families / AuditDetailDrawer 等 28 套件) |
+| 3 | 接口 API 测试 | ✅ 已实测 | 后端控制器 MockMvc/直调;admin.referral 三端点契约 16 例 |
+| 4 | 集成测试 | ✅ 已实测 | `integration.*` 实跑(R130 基线:EnergySystem / GrowthRecordSync / GuideModule / DimensionMap 红类逐例一致) |
+| 5 | 系统/端到端 E2E | ✅ 已实测 | 浏览器 live **28/28**(admin 5 + fe 6 + shop 4 + health 13,含 B-59 修复后隔离 2× 全绿) |
+| 6 | 冒烟测试 | ✅ 已实测 | 浏览器 28 例 + web/fe Jest 588 例零红即冒烟面 |
+| 7 | 回归测试 | ✅ 已实测 | web/fe Jest 全绿(含 R131 合并复跑);langgraph 非 LLM 31/31 零漂移;B-59 回归哨兵加固 |
+| 8 | 探索性测试 | ⚠️ 待核实 | 本轮定向探针(admin 登录时序 B-59 根因取证);无 chartered 探索会话 |
+| 9 | 验收 UAT / BDD | ⚠️ 待核实 | 无 cucumber/gherkin 执行证据 |
+| 10 | 性能测试 | ⛔ 未授权未执行 | 压测属 execute 档(需联网授权),本轮未做 |
+| 11 | 可靠性测试 | ⚠️ 待核实 | 无混沌/恢复演练;仅观察 429 配额窗口与 B-126 挂起 |
+| 12 | 安全测试(SAST/DAST/SCA/渗透) | ⛔ 未授权未执行 | 依赖漏洞扫描/DAST 需联网;仅静态项 + 鉴权契约 |
+| 13 | 兼容性测试 | ⚠️ 待核实 | 仅 Chromium 单浏览器;无多浏览器矩阵 |
+| 14 | 可用性测试 | ⚠️ 待核实 | 无真实用户可用性证据 |
+| 15 | 无障碍测试 | ⚠️ 待核实 | 无 axe/WCAG 扫描 |
+| 16 | 覆盖率度量 | ⚠️ 已实测(低) | cfc-web 语句 10.09% / 分支 6.12% / 函数 7.50% / 行 9.97%(R130 基线);后端 JaCoCo 未接入 |
+| 17 | 变异测试 | ⛔ 未发现 | 无 PIT / mutation 资产 |
+| 18 | 契约测试 | ✅ 已实测 | health 鉴权 13/13 + shop 排序 4/4 + admin.referral 16/16 |
+| 19 | QA 流程 | ⚠️ 待核实 | 133 轮闭环可追溯;门禁未脚本化(G11) |
+| 20 | 全项目代码审查 | ⚠️ 待核实 | 仅规范扫描,未跑全量静态审查 |
+
+---
+
+## 4. 实测结果明细(本轮真实信号)
+
+| # | 维度 | 命令/方式 | 节点 | 结果 |
+|---|---|---|---|---|
+| 1 | cfc-frontend Jest | `npx jest --ci` | 本机 | ✅ **28 套件 / 472 过 / 3 跳 / 0 红**(EXIT 0,22s,零漂移) |
+| 2 | cfc-web Jest | `npx jest --ci` | 本机 | ✅ **17 套件 / 116 过 / 0 红**(EXIT 0,24s,零漂移) |
+| 3 | 管理端 UI E2E(全量跑) | `playwright -c live --project=admin-desktop` | 本机 | ⚠️ 4/5(U05 登录时序偶发失败,B-59) |
+| 4 | 管理端 UI E2E(隔离复跑 #1) | 同上独立跑 | 本机 | ✅ 5/5(U05 58s 通过) |
+| 5 | 管理端 UI E2E(隔离复跑 #2) | 同上独立跑 | 本机 | ⚠️ 4/5(U04 登录时序偶发失败,B-59) |
+| 6 | ★ B-59 修复后验证 #1 | U04/U05 登录改 `waitForURL` | 本机 | ✅ **5/5**(U04 6.1s / U05 53.1s) |
+| 7 | ★ B-59 修复后验证 #2 | 同上 | 本机 | ✅ **5/5**(U04 6.4s / U05 53.6s) |
+| 8 | 小程序 H5 E2E | `--project=frontend-mobile` | 本机 | ✅ **6/6** |
+| 9 | 商城排序契约 | `--project=shop-api` | 本机 | ✅ **4/4** |
+| 10 | 健康鉴权契约 | `-c playwright.config.health.js` | 本机 | ✅ **13/13** |
+| 11 | langgraph 非 LLM | 251 实派(R132 权威) | 251 | ✅ 31/31(沿用 R132,本轮回探 251:9000 `/health`=200 OPEN) |
+| 12 | langgraph LLM 依赖 | 251 实派(R132 权威) | 251 | ⚠️ 10 例环境阻塞(B-126 挂起 + 429 配额,B-74 延续) |
+| 13 | dx-bridge 契约 | (沿用 R132) | 本机 | ⚠️ 2 环境红(部署滞后 404+502,未重跑) |
+| 14 | 节点探活 | curl | 4 节点 | cfc.iwintrue.com=302 / 189:4090=200 / 251:9000=200 / 251:4096=200(LLM 门控) / 204:4090=000(B-95) |
+
+**合计(本轮实测面)**:浏览器 authoritative **28/28 全绿** ✅(含 B-59 自处置闭环)| Jest 588 例全绿 ✅(web 116 + fe 472)| langgraph 33 绿 / 10 环境阻塞 ⚠️ | dx-bridge 2 环境红 ⚠️。
+
+**B-59 根因与处置证据**:全量浏览器跑 U05 失败、隔离 #2 时 U04 失败 → 失败在 U04/U05 间轮换,两者共享真实登录滑块链路;定位为 `admin-live.spec.js` 登录后 `waitForTimeout(5000)` 固定等待在负载高时过短,跳转 `/admin/dashboard` 未完成即断言(B-59 建议③)。改为 `page.waitForURL(/\/admin\/dashboard/, {timeout:20000})` 后,隔离复跑 2 轮均 5/5 全绿,时序哨兵彻底稳定;因 origin==HEAD(R132 后零部署),排除产品回归,判定测试侧时序脆弱 → **自处置闭环,无研发阻塞**。
+
+---
+
+## 5. 覆盖缺口清单
+
+| # | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|---|---|---|---|---|---|
+| G-133-1 | LLM 依赖用例环境阻塞 | auto_tag/intent 两文件 EXIT=124(B-126)+ 429 延续 | 红线误判为产品回归 | LLM 依赖用例标 `@pytest.mark.llm`,CI 拆非门禁套件;intent_classifier 429/401 抛外部服务异常 | P0 | 运维换 Token + 修 B-126 后连跑 2 轮全绿 |
+| G-133-2 | 后端 33 红 | R130 基线(本轮未重跑全量,零部署) | 产品回归无法区分 | 逐类修复 + 每轮集合比对 | P0 | 研发修完复跑该类 + 全量,连 2 轮绿销号 |
+| G-133-3 | dx-bridge 契约 | list/sync 404 + 偶发 502(部署滞后) | 误判为鉴权缺陷 | 部署会话确认后复跑 `dx-health-bridge-auth` 契约 | P1 | 部署后复跑 2 例绿 |
+| G-133-4 | 锚点率 | TC 锚点 9.9%(R130 基线) | 用例→代码追溯弱 | 锚点口径固化「TC 末列含可执行用例名或 spec 路径」 | P2 | 研发补锚点至 ≥80% |
+| G-133-5 | CI 全量门禁 | 无 CI 跑全量 | 回归无法自动拦截 | 落地 CI 全量 job(需联网建管道,未授权) | P1 | 研发/运维建 pipeline |
+| G-133-6 | 204 节点 | `:4090` 连续多轮 000 | 无第三节点冗余 | 204 恢复前维持 189+本机拆跑 | P2 | 运维恢复 |
+| G-133-7 | 用例更新纪律 | **本轮达标(G12)**:窗口内零 SRS/场景 git 提交(origin==HEAD==R132),无新增需求锚点 → 无需补用例;B-59 为测试侧自处置 | — | 变更触发流程(合规) | — | 已满足 |
+
+---
+
+## 6. 域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|---|---|---|---|
+| 单元·组件级 | 苏雅 | 可用 | web 116 / fe 472 全绿;变异测试缺失 |
+| 集成·接口级 | 柯砚 | 有缺口 | admin.referral 16/16 全绿(R132);integration 红类沿用 R130;dx-bridge 2 环境红 |
+| 系统·验收级 | 白樾 | ✅ 本轮绿 | 浏览器 live 28/28(本机;B-59 修复后稳定);UAT/BDD 证据缺 |
+| 测试保障级 | 闻朔 | ✅ 零回归 + B-59 闭环 | web/fe Jest 全绿;langgraph 非 LLM 31/31 零漂移;B-59 时序哨兵加固 |
+| 性能·可靠性 | 骆骋 | 未授权未执行 | 压测未做;429 配额窗口 + B-126 挂起观察 |
+| 安全 | 关屿 | 静态趋稳 + 动态缺失 | 鉴权契约 13/13 + TR-25 权限门;SAST/DAST/SCA 未授权 |
+| 兼容·体验 | 阮清 | 待核实 | 单 Chromium;无可用性/无障碍证据 |
+| 流程·度量·代码 | 何序 | 有缺口 | 锚点 9.9%、无 CI、B-59 已自处置 |
+| **langgraph 专项(251)** | **陆谨汇总** | ⚠️ 环境阻塞 | 33 绿 / 10 环境阻塞(B-126 + 429);251:9000 本轮回探 OPEN |
+
+---
+
+## 7. 五要素问题清单
+
+### P3-1 admin 登录时序哨兵偶发失败(B-59 · 本轮自处置闭环)
+1. **问题描述**:全量浏览器跑 `TC-A-U05` 单点失败(登录前置未通过);隔离复跑 #2 时 `TC-A-U04` 失败 → 失败在 U04/U05 间轮换,两者均走真实登录滑块链路。
+2. **测试 bug 点**:`tests/e2e-live/admin-live.spec.js:171` 与 `:195` 登录后 `await page.waitForTimeout(5000)` 固定等待,负载高时跳转 `/admin/dashboard` 未完成即断言(B-59 建议③未落地)。
+3. **最优修改方案**:U04/U05 登录后等待改为 `await page.waitForURL(/\/admin\/dashboard/, { timeout: 20000 })`(已落地)。
+4. **修改目的**:消除固定等待时序脆弱点,使登录前置断言锚定后台落地稳态,避免偶发误红。
+5. **闭环方式**:隔离复跑 2 轮均 5/5 全绿(U04≈6s / U05≈53s)→ **B-59 已闭环(自处置)**;因 origin==HEAD(R132 后零部署)排除产品回归,未开研发阻塞。
+
+### P3-2 langgraph LLM 依赖 10 例环境阻塞(B-126 复发 + B-74 延续)
+1. **问题描述**:251 实派 43 例拆分后,非 LLM 31/31 全绿;`test_auto_tag.py` / `test_intent.py` 进程不退出,`timeout` 以 EXIT=124 收口,LLM 依赖 10 例无有效结论。
+2. **测试 bug 点**:`JavaClient._get_client` coroutine never awaited(B-126);auto_tag 断言被 429 包装(B-74)。`app/agents/intent_classifier.py:62` 捕获 429 后默认回落 chat。
+3. **最优修改方案**:① 修 B-126(异步 client 生命周期 await/关闭);② 运维升级 251 LLM Token;③ intent_classifier 在 429/401 抛 ExternalServiceError。
+4. **修改目的**:恢复 LLM 依赖用例可执行性,避免配额/挂起被统计为产品回归。
+5. **闭环方式**:251 连跑 43 例全绿(含 LLM 10 例)即销号。
+
+### P3-3 后端 33 红(G2,R130 基线延续)
+1. **问题描述**:2865 例中 33 红(30F + 3E),14 个测试类,R130 第 5 次零漂移;本轮全量未重跑(零部署、46:17 成本)。
+2. **测试 bug 点**:`ArticleAutoTagServiceTest`(4)、`CfCommissionServiceSettleTest`(8)、`DimensionRegistryMapContractTest`(3)、`EnergySystemFlowTest`(6)、`GrowthRecordSyncFlowTest`(3)、`GuideModuleIntegrationTest`(1)、`MembershipPaySwitchTest`(1)、`OrchestrationEngineTest`(1)、`OrchestrationIntegrationTest`(1)、`PaymentServiceORDRoutingTest`(1)、`TaskPlanServiceTest`(1)、`TeamProfitCronContractTest`(1)、`UserServiceWechatLoginContractTest`(1)、`UserServiceWechatLoginTest`(1)。
+3. **最优修改方案**:按类分三批——① 产品类由研发定位实现;② 装置类由测试侧对齐 mock/夹具;③ 契约待裁决由研发确认口径。
+4. **修改目的**:使 G2 ≤10 红,令全量通过率成为可信门禁。
+5. **闭环方式**:每类修复后定向复跑该类,连续 2 轮绿 + 全量零漂移集合变小即销号。
+
+### P3-4 G9 锚点率 9.9%(延续)
+1. **问题描述**:TC 锚点率 9.9%(R130 口径),远低于 80% 目标。
+2. **测试 bug 点**:`tests/test-cases/README.md` 三套口径未归一。
+3. **最优修改方案**:固化「TC 行末列必须为可执行用例名或 spec 路径」,脚本校验新增 TC 合规。
+4. **修改目的**:让「用例→代码」可双向追溯。
+5. **闭环方式**:脚本校验锚点率 ≥80% 并纳入每轮度量。
+
+### P3-5 204 节点失联(B-95 持续)
+1. **问题描述**:`192.168.16.204:4090` 连续多轮 HTTP 000;189 / 251 均正常。
+2. **测试 bug 点**:不涉及代码,属节点运维。
+3. **最优修改方案**:运维恢复 204;恢复前浏览器任务维持本机(204 直跑)覆盖。
+4. **修改目的**:恢复第三节点冗余。
+5. **闭环方式**:204:4090 返回 200 后实派一次 admin 套件通过即销号。
+
+---
+
+## 8. 门禁结论
+
+**⛔ 不通过(有条件)**
+
+| 门禁 | 阈值 | 本轮 | 判定 |
+|---|---|---|---|
+| G1 全量通过率 | ≥95% | 沿用 R130 98.26%(本轮实测面全绿,未重跑后端全量) | ✅ |
+| G2 红例数 | ≤10 | 后端 33(基线)+ 根级 16 + langgraph 10 环境阻塞 | ❌ |
+| G3 前端 Jest | 0 红 | 472 过 / 3 跳 / **0 红** | ✅ |
+| G4 管理端 Jest | 0 红 | 116/116 | ✅ |
+| G5 编译 / 产物完整性 | 0 错 | 沿用 R130 test-compile 0 错 + 契约 16/16 | ✅ |
+| G6 浏览器硬契约 | 28/28 | **28/28**(含 B-59 自处置闭环) | ✅ |
+| G7 langgraph 红 | 0 | 10 环境阻塞(B-126 + 429) | ❌ |
+| G8 鉴权 / 契约 | 0 红 | health 13/13 + shop 4/4 + admin.referral 16/16;dx-bridge 2 环境红 | ✅(产品面) |
+| G9 TC 锚点率 | ≥80% | **9.9%** | ❌ |
+| G10 节点分派 | 251 + 189 | 251 `/health` OPEN ✅ / 189 在线 ✅(本机直跑覆盖) | ✅ |
+| G11 CI 全量 | 有 | 无 | ❌ |
+| G12 用例随 SRS 更新 | 变更即更新 | **本轮达标**:窗口内零 SRS/场景提交(origin==HEAD==R132),无新增需求锚点,无需补用例 | ✅ |
+
+**正向**:浏览器 live 28/28 维持稳定(admin 5/5 经 **B-59 自处置闭环** + frontend 6/6 + shop 4/4 + health 13/13);web/fe Jest 588 例零红;langgraph 非 LLM 31/31 全绿;后端编译 0 错;**B-59 测试侧债务闭环**(2× 隔离 5/5 验证)。
+
+**阻断**:① langgraph LLM 依赖 10 例环境阻塞(B-126 复发 + 429);② 后端 33 红 R130 基线延续;③ 根级 16 环境红;④ G9/G11 长期不达标;⑤ 204 失联。
+
+**复评条件**:① 修 B-126 + 运维升级 LLM 凭据后 251 连跑 2 轮 43 例全绿;② 部署后复跑 dx-bridge 2 例绿;③ 后端 33 红逐类修复并全量复跑;④ 锚点补至 ≥80%;⑤ 204 恢复。
+
+---
+
+## 9. 下一步(R134 重点)
+
+1. 推动运维:LLM 配额(B-74)/ B-126 挂起修复 → 251 连跑 43 例全绿;放通 204 节点(B-95)。
+2. 推动研发:后端 33 红按「产品类 / 装置类 / 契约」分批修复(G2);dx-bridge 部署 `47d203981` 后复跑 2 例绿。
+3. 启动 G9 锚点补录。
+4. 推动 CI 全量门禁(G11)。
+5. B-59 已闭环,浏览器 admin 套件维持本机直跑 5/5 稳态即可。

+ 1 - 1
docs/tdd/test/blockers.md

@@ -66,7 +66,7 @@
 | B-58 | cfc-langgraph 测试通过数漂移 59→51(WIP 未提交) | 研发 | **第 76 轮(2026-11-08 00:21)实测回归**:本地 venv 跑 `pytest tests/ --ignore=tests/qna` 收集 63(R75 为 71)、通过 51(R75 为 59),少 8 例。根因:工作区 8 个 langgraph 测试文件(`conftest.py`/`test_analyze`/`test_auto_tag`/`test_chat`/`test_graph`/`test_intent`/`test_memory`/`test_report_parse`)处于 `M` 未提交状态(WIP,B-53 复发)。影响:langgraph 通过率口径不稳,无法确认是否为真实回归,且违反「已修未提交=未完成」铁律。闭环:产生 WIP 的会话对这 8 文件 `git add`+`commit`+`push`(PR 仅含测试文件),收口后全量复跑回到 59/0/12;测试侧不代提交。 | 测试负责人(第 76 轮实测登记) | 2026-11-08 00:21 | **重定性(第 77 轮,2026-11-08 02:16)**:见下方 B-58-Update |
 | B-58-Update(第 77 轮重定性) | cfc-langgraph clean 树 17 红:不是「通过数漂移」,是**主干套件本来就红** | 研发 | **P0,口径反转(第 77 轮隔离树实测)**。R76 的「59→51 漂移 -8」表述不完整:本轮在干净基线 `8e736c3bb` 隔离树(`D:\_wt_r077`,不带走任何 WIP)实跑 `pytest tests --ignore=tests/qna` → **43 收集 / 26 过 / 17 红 / 0 skip**。逐条归因:**C 类环境 13 例**(`chromadb_rust_bindings` DLL 缺失导致 `/chat`、`/analyze`、`/auto_tag` 端点 500 共 8 例 + LLM 凭据无效致 `test_intent` 4 例退化为 CHAT + `test_report_parse` 2 例数据路径 → 其中 1 例归数据);**A 类夹具 3 例**(`tests/test_memory.py:7/14/22` `MemoryManager()` 缺 `embeddings`);**数据 1 例**(`test_report_parse_invalid_json_response` 400≠200,而 clean 树无该断言路径)。对照主工作区 WIP 8 文件 → **63 收集 / 51 过 / 0 红 / 12 skip**。读 WIP `conftest.py` diff 证实其为**测试基建重构**:`collect_ignore=["qna"]`(`tests/qna/test_graph.py` 引用已删除的 `src.qna`,收集期即中断整个套件)、`llm_live` marker 默认 skip、`StubLLM`/`FakeGraph` 桩把端点契约确定化。结论:**WIP 不是「让绿灯更好看」,而是把主干的红修掉**;「已修未提交 = 未完成」在本项上造成主干 17 红。建议:这 8 文件立即 `git add`+`commit`+`push`。闭环:clean 树复跑 `pytest tests` ≥51 过 / 0 红 / 12 skip,且 `test_memory` 3 例补 `FakeEmbeddings` 后转绿 | 测试负责人(第 77 轮实测重定性) | 2026-11-08 02:16 | 待处理(建议当日收口) |
 | B-53-Update(第 77 轮量化) | B-53 第 4 次量化:13 个测试文件(11 `M` + 2 `??`)入库可 +42 例转绿、+17 例新增 | 研发 | **P0 第 4 次催办,量化口径已固化**。干净基线隔离树 `D:\_wt_r077` @`8e736c3bb` 全量 292 类 / 2416 例 / 2297 过 / 65F+50E+4S = **95.07%**,35 红类 / 115 红例。随后把主工作区 13 个后端测试文件(11 `M` + 2 `??`:`FamilyEarningsAdminRoleGateTest`、`SurveyHealthReviewContractTest`)复制入同一隔离树,定向复跑同 13 类:**170 例 / 48 红 → 187 例 / 6 红**,即 **42 例转绿 + 17 例新增(全绿)**;残余 6 红分布:`GuideFamilyTaskControllerTest` 2F+1E、`GuideRolePermissionTest` 1F+1E、`StatsControllerTest` 1F。全量预测:2356/2433 = **96.83%**,红例 115 → 73,红类 35 → 28。逐类对照:Article 9→0、Auth 4→0、Family 1→0、GuideOrder 8→0、GuideTeam 2→0、Payment 4→0、Product 3→0、ProductOrder 6→0,GuideFamilyTask 5→3、GuideRolePermission 5→2、Stats 1→1。闭环:13 文件入库后全量复跑 ≥96.83% 且红例 ≤73 | 测试负责人(第 77 轮实测量化) | 2026-11-08 02:16 | 待处理(连续 4 轮未收口) |
-| B-59 | `tests/e2e-live/admin-live.spec.js:158` TC-A-U05 用「网址含 /login 就跳过」把前置失败转成不判定 | 测试(下轮自处置) | **P1 用例哨兵失效(第 77 轮实测新发现)**。本轮 admin-desktop 套件结果为 **14 过 / 1 跳过**(R75/R76 为 5/5 全过),被跳过的正是 `TC-A-U05 后台核心菜单可访问`:该用例自己重新走一遍登录流程(填凭据 → 等身份带出 → 拖滑块 → 点击登录 → `waitForTimeout(5000)`),随后执行 `test.skip(page.url().includes('/login'), '登录未通过(见 TC-A-U04),本用例无法在无会话下判定')`。本轮同一次运行里 `TC-A-U04` 真实登录**通过**并落到 `/admin/dashboard`(菜单 102),但 U05 自身的第二次登录在 5s 等待窗内未完成跳转 → 命中跳过分支。影响:① 跳过不计红,套件看起来「绿」,实际菜单遍历验收缺口;② 与 B-48/B-57 同族——把不确定态转成不判定,哨兵永久失效;③ 5s 固定等待属时序脆弱点(并发跑后端全量时机器负载高,登录链路变慢)。建议修复(任选其一,均 ≤5 行):① 把 `test.skip(...)` 改为 `expect(page.url()).not.toContain('/login')`,让前置失败直接红;② 让 U05 复用 U04 的 `storageState`(`playwright.config` 开启 `storageState` 复用),彻底避免二次登录;③ `waitForTimeout(5000)` 换成 `page.waitForURL(/\/admin\/dashboard/, { timeout: 20000 })`。闭环:admin 套件连续 2 轮 5/5 全过且无 skip | 测试负责人(第 77 轮实测登记) | 2026-11-08 02:16 | 待处理(下轮自处置) |
+| B-59 | `tests/e2e-live/admin-live.spec.js:158` TC-A-U05 用「网址含 /login 就跳过」把前置失败转成不判定 | 测试(下轮自处置) | **P1 用例哨兵失效(第 77 轮实测新发现)**。本轮 admin-desktop 套件结果为 **14 过 / 1 跳过**(R75/R76 为 5/5 全过),被跳过的正是 `TC-A-U05 后台核心菜单可访问`:该用例自己重新走一遍登录流程(填凭据 → 等身份带出 → 拖滑块 → 点击登录 → `waitForTimeout(5000)`),随后执行 `test.skip(page.url().includes('/login'), '登录未通过(见 TC-A-U04),本用例无法在无会话下判定')`。本轮同一次运行里 `TC-A-U04` 真实登录**通过**并落到 `/admin/dashboard`(菜单 102),但 U05 自身的第二次登录在 5s 等待窗内未完成跳转 → 命中跳过分支。影响:① 跳过不计红,套件看起来「绿」,实际菜单遍历验收缺口;② 与 B-48/B-57 同族——把不确定态转成不判定,哨兵永久失效;③ 5s 固定等待属时序脆弱点(并发跑后端全量时机器负载高,登录链路变慢)。建议修复(任选其一,均 ≤5 行):① 把 `test.skip(...)` 改为 `expect(page.url()).not.toContain('/login')`,让前置失败直接红;② 让 U05 复用 U04 的 `storageState`(`playwright.config` 开启 `storageState` 复用),彻底避免二次登录;③ `waitForTimeout(5000)` 换成 `page.waitForURL(/\/admin\/dashboard/, { timeout: 20000 })`。闭环:admin 套件连续 2 轮 5/5 全过且无 skip;**R133 落实建议③**:U04/U05 登录后 `waitForTimeout(5000)` 改为 `waitForURL(/\/admin\/dashboard/,{timeout:20000})`,隔离复跑 2 轮均 5/5 全绿(U04≈6s/U05≈53s),时序哨兵彻底稳定 | 测试负责人(第 77 轮实测登记) | 2026-11-08 02:16 | **已闭环(自处置,R133)** |
 | B-60 | `ActivityControllerTest` 单类 16 例耗时 412.4s,占后端全量时长 16% | 研发 | **P2 测试隔离/时效缺陷(第 77 轮实测新发现)**。本轮后端全量 `Total time: 48:18 min`,surefire XML 累计 **2568s(42.8 min)**,其中 `com.etotem.cfc.controller.ActivityControllerTest` **412.4s / 16 例**(均值 25.8s/例)、`GuideModuleIntegrationTest` 236.5s / 4 例、`PlannerBindInviteFlowTest` 169.9s / 9 例、`AIChatControllerTest` 125.4s / 17 例、`ArticleCategoryControllerTest` 85.5s / 3 例。对照组:同为 controller 包的多数类在 0.0x~1s 量级。推断:测试内存在真实外部调用(微信/AI 网关/HTTP)或反复重建 Spring 上下文与数据库迁移(`DatabaseInitializer` 每个上下文重跑一次迁移)。影响:全量反馈周期被 5 个类拉到 40 min 以上,属 CI 门禁落地的直接障碍;也让每轮巡检的时间成本翻倍。建议:① 用 `@MockBean`/WireMock 截断真实网络;② 慢类合并上下文(`@DirtiesContext` 只在必要时用);③ 为单类设 120s 警戒阈值,超阈即视为缺陷。闭环:全量 `mvn test` ≤25 min 且无单类 >120s | 测试负责人(第 77 轮实测登记) | 2026-11-08 02:16 | 待处理 |
 | B-61 | `JwtInterceptor.LOGIN_REQUIRED_PATHS` 缺 `/api/health/plan/**`,健康方案 3 端点匿名 200 直通业务层 | 研发 | **P0 安全/契约缺口(第 78 轮实测,连续 2 轮复现)**。`POST /api/health/plan/{adjust,attribution,generate}` 未携带 Authorization 均返回 **HTTP 200**(attribution/generate 业务码 4001 付费墙、adjust 500 NPE),未按 API_REFERENCE §4.49.1/§4.49.2(标注「登录用户 JWT」)拦截为 401/403。对照 `POST /api/huawei-health/auth-url` 无鉴权正确返回 401。根因:`JwtInterceptor.LOGIN_REQUIRED_PATHS`(`JwtInterceptor.java:87–127`)为 opt-in 清单,已含 `/api/huawei-health/`、`/api/xiaomi-health/`,但健康方案族 `HealthPlanController.java:33/:63/:100` 三个端点(adjust/attribution/generate)**既不在 LOGIN_REQUIRED_PATHS 也不在 PUBLIC_PATHS** → 匿名请求被放行到 controller,与 SEC-20261031-01 注释(:96–108)明确反对的「匿名 userId=-1 放行走业务 500 而非安全 401」口径漂移属同族遗漏。影响:匿名用户可触发健康方案归因/生成/调整业务链路(消耗 AI 配额、可能越权读取/生成家庭私有健康方案)。测试证据:`tests/e2e-live/health-contract.spec.js` TC-HP-U01/02/03(上轮新增,本轮复测 3 例仍失败)。修复建议:`LOGIN_REQUIRED_PATHS` 增加 `"/api/health/plan/"`(与健康报告/华为/小米同族),统一「默认拒绝 + 显式放行」。闭环:TC-HP-U01/02/03 由失败转 pass(返回 401)+ 后端补带/不带 token 双向 MockMvc 用例 | 测试负责人(第 78 轮实测登记) | 2026-11-08 02:47 | 待处理(P0,连续 2 轮) |
 | B-62 | cfc-frontend 2 个 RED 契约套件进入执行范围,14 例待实现(S-cfc-35/S-cfc-38 birthday/gender 捕获) | 研发 | **P1 契约待实现(第 79 轮实测,2026-11-08 03:23)**。本轮 jest 执行范围由 17 套件/319 扩至 19 套件/343(`jest.config.js` mtime 03:15,`testMatch: ['**/__tests__/**/*.test.js', ...]`),使 2 个既有 RED 契约套件纳入统计:`__tests__/family-join/join-form.required-info.test.js`(12 败)+ `__tests__/pages/family-members.joinRequestCardInfo.test.js`(2 败)。两文件已在 R78 树内(提交 076cfa879 / c5e065dda,属 S-cfc-35/S-cfc-38 RED 契约),此前 R78 报告未纳入。**性质 = 预期 RED(功能未实现),非既有用例回归**:生产 `cfc-frontend/pages/invite/join-form.vue` 实际仅渲染「真实姓名/昵称」,缺出生日期/性别字段与校验,故断言 birthday/gender 必填、prefill、提交拦截、picker 映射、审批卡片三项信息均失败。**无通过用例转红**(328 通过含 R78 全部通过用例 + 净新增通过用例)。通知研发:家庭加入 birthday/gender 捕获实现(S-cfc-35/S-cfc-38 待 YELLOW)落地后复测 14 例转绿;此前 R78「frontend 全绿」口径未覆盖该 2 套件,本轮为覆盖可见性修正。闭环:研发实现 join-form birthday/gender 捕获 → 14 例 RED 转绿 + 状态机 S-cfc-35/S-cfc-38 置 YELLOW | 测试负责人(第 79 轮实测登记) | 2026-11-08 03:23 | 待处理(P1,预期 RED,待实现) |

+ 4 - 4
tests/e2e-live/admin-live.spec.js

@@ -168,7 +168,7 @@ test.describe('管理端 UI · 登录与主框架', () => {
     await page.waitForTimeout(600);
 
     await page.getByRole('button', { name: /登\s*录/ }).click();
-    await page.waitForTimeout(5000);
+    await page.waitForURL(/\/admin\/dashboard/, { timeout: 20000 });
 
     const afterUrl = page.url();
     const loggedIn = !afterUrl.includes('/login');
@@ -192,9 +192,9 @@ test.describe('管理端 UI · 登录与主框架', () => {
     await dragSliderToEnd(page);
     await page.waitForTimeout(600);
     await page.getByRole('button', { name: /登\s*录/ }).click();
-    await page.waitForTimeout(5000);
-    // B-59 修正(R97):原 `test.skip(登录未通过)` 会把前置失败吞成 skipped,
-    // 让门禁显示「无失败」却实际没测菜单。改为硬断言——前置登录失败是真失败,不是跳过。
+    await page.waitForURL(/\/admin\/dashboard/, { timeout: 20000 });
+    // B-59 修正(R133):原固定 waitForTimeout(5000) 在负载高时过短,登录跳转后台尚未完成即断言,
+    // 导致 U04/U05 偶发「前置登录未通过」。改为 waitForURL 等待后台落地页稳态;R97 已移除 test.skip 吞失败逻辑。
     expect(
       page.url().includes('/login'),
       `前置登录未通过,本用例无法进入后台(实际 URL=${page.url()})`