Procházet zdrojové kódy

test(tdd): 第119轮测试闭环——全量3500例3432过98.06%与R118严格零漂移(后端2864例98.67% 34红15类差集空/环境红0);251实派langgraph 44例(剔test_chat 43/32/11零漂移)/189复验admin 5/5(B-120-New U05登录偶发观察第1轮);B-69第19轮线上匿名200复证O-21未落码;G-11闭环第2轮稳定销号;前端426/管理端116/根级23(16红)/浏览器28全绿

E2E Test Bot před 2 dny
rodič
revize
d3e4498399

+ 276 - 0
docs/tdd/orchestration/report-test-2026-11-10-R119.md

@@ -0,0 +1,276 @@
+# 测试负责人闭环汇报 · 第 119 轮(2026-11-10 08:32–09:47)
+
+> 执行档:**review(离线)** — 白名单内离线套件 + 已授权内网只读 E2E(`cfc.iwintrue.com` 的 `/admin` + `/frontend`)+ 节点派发(251 跑 langgraph / 189 跑浏览器 admin)
+> 仓库:`D:/cfc`;分支 `cfclub`;**测试基线 HEAD `8f5585198`**(R118 提交;`git fetch` 后与 origin/cfclub 零差异,**零生产源码 / 零 SRS / 零用例变更**)
+> 执行窗口:08:32 → 09:47(后端 73 min 串行占主窗,其余套件错峰并行)
+> 拓扑(用户本轮指令):浏览器自动化 → `cfc.iwintrue.com/admin`、`/frontend`,`192.168.16.189` 与本机各一节点(每节点单任务);langgraph 部署 `192.168.16.251`,测试分派该节点
+> 团队:自动化闭环轮,八域结论由测试负责人依据**本轮实测证据**汇总(未启用分布式成员会签),不代写任何成员未产出之结论
+
+---
+
+## 一、历史审查记录(阶段 -1 记忆召回)
+
+| 项 | 内容 |
+|---|---|
+| 上次审查 | 第 118 轮(2026-11-10 08:26,已提交 `8f5585198`);本轮为直接接续轮 |
+| 历史遗留缺口 | B-69(`/api/mind/**` 鉴权,第 18 轮)、B-65/B-74/B-82(langgraph LLM 凭据/checkpointer)、B-36(根级黑盒 16 红,第 21 轮)、B-90(chat 挂起观察)、B-15(`tests/qna` 收集期错误)、B-118(env 能力探针)、B-119(langgraph 口径)、G-11(已闭环待销号) |
+| 本次是否改善 | **测试通过/失败计数与 R118 严格零漂移**(后端 34 红 15 类差集空、前端/管理端/根级/langgraph 逐项一致);**新增 B-120-New 观察**(189 首轮 U05 登录偶发,复验 5/5 全绿);B-69 第 19 轮复证未修;G-11 已闭环第 2 轮稳定(等待销号) |
+| 本次新发现 | **B-120-New(P2 观察)**:189 首轮 `TC-A-U05` 前置登录失败(停在 `/admin/login`)→ 复验轮 5/5 全绿、本机同批 U05 绿 → 判定滑块登录偶发,非产品回归,观察 2 轮后再定性 |
+| 声明 | 历史结论仅作对照;**本轮所有数字均为重新取证**(后端全量 clean test、四个前端套件、双节点派发、线上匿名鉴权探针) |
+
+---
+
+## 二、项目画像(阶段 0 · 本轮为稳定延续轮)
+
+| 模块 | 技术栈 | 端口 | 本轮可测范围与关键路径 |
+|---|---|---|---|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus(JDK8) | 9082(本机 DOWN) | **339 测试类 / 2854 `@Test`**;`DatabaseInitializer` 迁移入口;`JwtInterceptor` 8 公开路径白名单 + `LOGIN_REQUIRED_PATHS`;AI 走 `AiGateway` |
+| cfc-frontend | uni-app 小程序 (Vue2) | — | 26 套 Jest(utils/store/components/pages/specs) |
+| cfc-web | Vue2 + Element UI 管理端 | 8082 | 17 套 Jest / 116 例;语句覆盖 9.98% |
+| cfc-langgraph | Python FastAPI + LangGraph + ChromaDB | 9000(@251,`/health` → 200) | 44 例 pytest 于 251 实派执行(`.venv` py3.11,72.4s) |
+
+**环境能力实测**
+
+| 能力 | 实测 | 结论 |
+|---|---|---|
+| `D:\maven\apache-maven-3.6.1\bin\mvn` | 3.6.1 / Java 1.8.0_25 可执行 | 可用 |
+| `D:\jdk1.8.0_25` | 存在,Maven 默认运行时指向它 | 可用 |
+| `192.168.16.251:9000` | 200 `/health` | langgraph 服务在线 |
+| `192.168.16.251:4096` | 200(Basic 鉴权通过) | **shell 直连派发可用** |
+| `192.168.16.189:4090` | 200(Basic 鉴权通过) | 浏览器节点可派发 |
+| `http cfc.iwintrue.com` | HTTP 302→200 | 可用(G-11 闭环后稳定) |
+| `127.0.0.1:9082` | 000 | 本机后端未起(按规则不擅自启停) |
+
+---
+
+## 三、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
+
+| # | 类型 | 状态 | 证据(本轮实测 / 基线引用) |
+|---|---|---|---|
+| 1 | 单元测试(cfc-web) | 已发现 | 本轮回跑 17 套 / 116 例全绿(214.9s) |
+| 2 | 单元测试(cfc-frontend) | 已发现 | 本轮回跑 26 套 / 426(423 过 / 3 跳,105.5s) |
+| 3 | 组件测试 | 已发现 | `Families.*` / `ProductPicker` / `signature.canvas2d` / `recommendation.*` spec |
+| 4 | 测试覆盖率 | 已发现 | cfc-web 语句 9.98% / 分支 6.12% / 函数 7.51% / 行 9.98%;后端无 jacoco |
+| 5 | 变异测试 | 未发现 | 无 pitest / mutation 配置 |
+| 6 | 集成测试 | 已发现 | `com.etotem.cfc.integration.**` 本轮全量执行(含 15 红类中的 5 类) |
+| 7 | 契约测试 | 已发现 | `DimensionRegistryMapContractTest` 3 红 / `UserServiceWechatLoginContractTest` 1 红 / `TeamProfitCronContractTest` 1 红 等(与 R118 逐例一致) |
+| 8 | 接口 API 测试(活服务器) | 已发现 | `health-contract` 13/13 本轮实跑;匿名鉴权探针 2 端点 |
+| 9 | 系统/端到端 E2E | 已发现 | 本机 live 15/15 + health 13/13 + 189 复验 5/5 |
+| 10 | 验收 UAT / BDD | 未发现 | 无 UAT 记录、无 `.feature` |
+| 11 | 冒烟测试 | 已发现 | `ci-smoke.spec.js` + `_automation_reachability.cjs` |
+| 12 | 回归测试 | 已发现 | 全量 3500 例可复现,与 R118 严格零漂移 |
+| 13 | 探索性测试 | 未发现 | 无 charter / 会话记录 |
+| 14 | 性能测试 | 未授权未执行 | 需联网压测(execute 档);后端 73 min 仅作时延观察 |
+| 15 | 可靠性测试 | 待核实 | 无故障注入;B-90 chat 未复证(本轮未打 chat) |
+| 16 | 安全测试(SAST/DAST/SCA) | 未发现 | 仅鉴权契约 + 匿名探针;无 SAST/DAST/依赖扫描工具 |
+| 17 | 兼容性测试 | 未发现 | 仅 chromium |
+| 18 | 可用性测试 | 未发现 | 无可用性任务/量表 |
+| 19 | 无障碍测试 | 未发现 | 无 axe 扫描 |
+| 20 | QA 流程 / 度量 / 代码审查 | 部分已发现 | 全量 98.06%;CI 仅 test-compile + 前端 jest |
+
+> 「未发现」为扫描未命中,不等于项目没做;扫描截断/环境缺失一律标「待核实」。
+
+---
+
+## 四、测试方案与执行档
+
+| 项 | 内容 |
+|---|---|
+| 目标 | ① 全部用例通过 ② SRS/场景覆盖可量化 ③ 变更即更新用例 |
+| 范围(本轮实跑) | **后端全量 `mvn -o -B clean test`(339 类 / 2864 例)**、cfc-web Jest+覆盖率、cfc-frontend Jest、根级 `tests/jest.config.js` 黑盒、langgraph pytest@251 实派、浏览器 E2E 本机 live+health、浏览器 E2E@189 派发+复验 |
+| 排除项 | `dan/danshop`(独立商城);`tests/qna`(收集期错误,B-15);需联网命令(依赖漏洞/压测/DAST);本机 9082 未起 |
+| 执行档 | **review**:不联网装依赖、不启停服务、不改生产代码 |
+| 授权 | 内网 E2E(`/admin`+`/frontend`)、双节点派发、按 SRS 变更写用例已授权;execute 档(压测/DAST)未申请,未执行 |
+| 后端命令 | `JAVA_HOME=/d/jdk1.8.0_25` + `/d/maven/apache-maven-3.6.1/bin/mvn -o -B -f cfc-backend/pom.xml clean test`(73 min,BUILD FAILURE 仅由测试红导致) |
+
+---
+
+## 五、执行结果(本轮实测)
+
+### 5.1 总账
+
+| 套件 | 用例 | 通过 | 红 | Skip | 通过率 | 耗时 |
+|------|------|------|----|------|--------|------|
+| 后端 JUnit(339 类) | 2864 | **2826** | **34**(31F+3E) | 4 | **98.67%** | 73 min |
+| 前端 Jest(26 套) | 426 | 423 | 0 | 3 | 100%(剔 skip) | 105.5s |
+| 管理端 Jest(17 套) | 116 | **116** | 0 | 0 | 100% | 214.9s |
+| 根级黑盒 Jest(3 套) | 23 | 7 | **16** | 0 | 30.43% | 14.3s |
+| langgraph pytest@251 | 43(本口径)/ 44(含 `test_chat`) | 32 | **11 / 12** | 0 | 74.42% | 72.4s |
+| 浏览器 E2E 本机(live 15 + health 13) | 28 | **28** | 0 | 0 | 100% | 3.1m + 8.4s |
+| 浏览器 E2E@189(admin-desktop,复验) | 5 | **5** | 0 | 0 | 100% | 1.4m |
+| **全量(主口径,去 189 重复)** | **3500** | **3432** | **61** | **7** | **98.06%** | — |
+
+> 恒等式核验:`@Test 2854 − 类级 @Disabled 4 + 参数化/早退净增 14 = 2864`,误差 **0**;测试源类 **339** = surefire XML **339** → **沉默 0**、完整性 339/339。
+> langgraph 口径(B-119 固化):全量收集 44 例(含 `test_chat`)+1 红;**同口径(剔 `test_chat`)为 43/32/11,与 R118 严格一致。**
+> 189 说明:首轮 4/5(U05 登录偶发)→ **复验轮 5/5 全绿**,本机同批亦全绿 → 本轮按全绿记,单列观察项 B-120。
+
+### 5.2 与 R118 基线对账
+
+| 指标 | R118(08:26) | 本轮 R119 | Δ |
+|---|---|---|---|
+| 后端 类/例/通过 | 339 / 2864 / 2826 | **339 / 2864 / 2826** | 0 / 0 / 0 |
+| 后端红例(31F+3E) | 34(15 类) | **34(15 类)** | 0 |
+| 红类差集 | — | **空**(15 类逐一相同) | 0 |
+| 前端 Jest | 423/426(3 跳) | **423/426(3 跳)** | 0 |
+| 管理端 Jest | 116/116 | **116/116** | 0 |
+| 根级黑盒 | 7/23(16 红) | **7/23(16 红)** | 0 |
+| langgraph(同口径) | 32/43(11 红) | **32/43(11 红)** | 0 |
+| 浏览器 E2E | 28/28 + 189 5/5 | **28/28 + 189 复验 5/5** | 0 |
+| 全量(主口径) | 3500/3432(98.06%) | **3500/3432(98.06%)** | 0 |
+
+**Δ 归因**:源码/SRS/用例零变更 + 全部套件本轮重跑 → **逐项零漂移,红例集合差集为空**。
+
+### 5.3 34 红例三层归因(归因桶:assert 19 / mockito 12 / npe 2 / other 1;**环境红 0**)
+
+| 层 | 类数 | 例数 | 明细 |
+|---|---|---|---|
+| **A 测试装置** | 4 | **16** | `CfCommissionServiceSettleTest` 8(Mockito `WantedButNotInvoked`)、`ArticleAutoTagServiceTest` 4(verify 次数)、`GrowthRecordSyncFlowTest` 3(2 NPE 测试帧 + 1 assert)、`TaskPlanServiceTest` 1 |
+| **B 产品缺陷** | 6 | **14** | `EnergySystemFlowTest` 6、`OrchestrationEngineTest` 1、`OrchestrationIntegrationTest` 1、`MembershipPaySwitchTest` 1、`PaymentServiceORDRoutingTest` 1、`UserServiceWechatLogin*` 2、`TeamProfitCronContractTest` 1、`MindFortuneControllerTest` 1(B-69 同源) |
+| **C 数据/环境** | 1 | **1** | `GuideModuleIntegrationTest` → `DataIntegrityViolation`(`platform_fee` 列截断) |
+| **契约待裁决** | 1 | **3** | `DimensionRegistryMapContractTest`(未知/空码映射 + 缺码 400 期望) |
+
+> 反证:环境红 **0**,历史 B-13 类(`AdminFamilyOverviewControllerTest`)保持 3/3 绿,维持「潜在风险未复现」观察。
+
+### 5.4 节点派发实测(用户指令域)
+
+| 节点 | 任务 | 结果 |
+|---|---|---|
+| **192.168.16.251** | langgraph pytest(shell 直连) | ✅ **实派取回**:44 例 / 32 过 / 12 红,72.4s;基线 `8f5585198` |
+| **192.168.16.189** | admin-desktop E2E | ⚠️ 首轮 4/5(U05 登录偶发)→ ✅ **复验 5/5 passed**,1.4m |
+| 本机 | live + health | ✅ 15/15 + 13/13,单节点串行 |
+
+### 5.5 线上鉴权探针(B-69 第 19 轮复证,匿名 POST)
+
+| 端点 | HTTP | body | 判定 |
+|---|---|---|---|
+| `/api/mind/fortune` | **200** | `{"code":400,"message":"用户不存在","data":null}` | ❌ 未拦截,应为 401 |
+| `/api/energy/overview`(对照) | **401** | — | ✅ 拦截正确 |
+
+**结论**:`JwtInterceptor.LOGIN_REQUIRED_PATHS` 当前**不含** `/api/mind/`(O-21 裁决尚未落码),B-69 连续第 19 轮未修。
+
+---
+
+## 六、SRS / 场景变更闸门
+
+- 基线 HEAD `8f5585198` → 本轮 `git fetch` 后与 origin/cfclub **零差异**;
+- `--changes --days 3`:需求侧 / 测试用例 / 契约设计 **均无新增能力键(0 → 0)**;
+- specs 200 份、`tests/test-cases` 14 份、`tests/user-scenarios` 11 份,**零变更**。
+
+**结论:本次无 SRS/场景/接口变更 → 按规则跳过用例编写。**
+度量:场景 **215**、TC 映射 **155(72.1%)**、spec 字面引用 **32(14.9%)**;TC **812**、异常流 **483(59.5%)**、锚点 **86(10.6%)**——与 R118 逐位一致。
+
+---
+
+## 七、覆盖缺口清单
+
+| 缺口 | 类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|---|---|---|---|---|---|
+| G-1 | 覆盖缺口 | TC 锚点 **10.6%**(86/812) | 「场景→用例→资产」不可追 | 资产首行加 `TC-xxx` 锚点 | P1 | 锚点率 ≥40% 纳门禁 |
+| G-2 | 覆盖缺口 | HL-05 仍无契约/E2E 用例 | 新特性零回归网 | 补 `ProductSelectionFlow` 契约 + Playwright | P1 | 定向套件全绿入台账 |
+| G-3 | 测试装置 | A 类 16 例 | 噪音掩盖真实回归 | 见 P-1 | P1 | 定向复跑 0 红 → 红例 34→18 |
+| G-4 | 黑盒失效 | 根级 16 红(B-36 第 22 轮) | 接口层无有效黑盒网 | 注入 `CFC_API_TOKEN` + seed 账号 | P1 | 0 红或显式 skip |
+| G-5 | 工具缺口 | 无覆盖率(java)/变异/压测/SAST/SCA | 内部质量不可量化 | jacoco+pitest;k6/zap 需授权 | P2 | 产物入库纳门禁 |
+| G-6 | 流程缺口 | CI 仅 test-compile + 前端 jest | 2864 例不在门禁内 | CI 增 `mvn test -DskipTests=false` | P1 | pipeline 出现 `Tests run` |
+| G-7 | 节点偶发 | 189 `TC-A-U05` 首轮偶发(复验绿) | 不稳定假红 | 登录前置加重试 | P2 | 连续 2 轮 0 偶发销号(B-120) |
+| G-8 | 资产缺口 | `@Disabled` 4 例 + `tests/qna` 错误 | 静默失效 | 修或删 | P2 | 收集期 0 error |
+| G-9 | 离线约束 | `api.test.js` 对公网真实 POST | 违离线约束 | 改 axios-mock-adapter | P2 | 零外联且仍绿 |
+| G-10 | 派发缺口 | 189 / 251 实派取回 | — | — | ✅ | shell 直连 v2 固化 |
+
+---
+
+## 八、域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|---|---|---|---|
+| 单元·组件级(后端 339 类) | 苏雅 | **不通过(有条件)** | 2864 例 98.67%,34 红(A16/B14/C1/契约3),零漂移 |
+| 单元·组件级(前端 / 管理端) | 苏雅 | **通过** | 426(0 红 / 3 跳)、116/116 |
+| 集成·接口级 | 柯砚 | **不通过** | 集成包 5 红类;契约 3 例口径未决;`EnergySystemFlowTest` 5×500 |
+| 系统·E2E | 白樾 | **通过** | 本机 28/28 + 189 复验 5/5;UAT/BDD 未实测 |
+| 测试保障级 | 闻朔 | **通过(部分)** | 冒烟/回归可复现;探索性无;根级 16 红 |
+| 性能·可靠性 | 骆骋 | **未实测** | 无压测工具/未授权联网 |
+| 安全 | 关屿 | **不通过** | B-69 第 19 轮复证:匿名 fortune → 200;O-21 未落码 |
+| 兼容·体验·无障碍 | 阮清 | **未实测** | 仅 chromium;无 axe |
+| 流程·度量·代码审查 | 何序 | **不通过** | CI 无后端全量;锚点 10.6%;B-120 节点偶发需观察 |
+
+---
+
+## 九、五要素问题清单
+
+### P-1(P1 · A 类 · 16 例)测试装置缺陷致红(第 5 轮挂账)
+① **问题描述**:`CfCommissionServiceSettleTest` 8 例、`ArticleAutoTagServiceTest` 4 例、`GrowthRecordSyncFlowTest` 3 例、`TaskPlanServiceTest` 1 例,断言/桩口径与生产不一致,非生产缺陷。本轮与 R118 逐例一致。
+② **测试 bug 点**:`CfCommissionServiceSettleTest#settle_F03a发放_自动创建感恩记录` 等 8 例;`ArticleAutoTagServiceTest#toggleStatus_发布且标签为空_调度自动打标` 等 4 例;`GrowthRecordSyncFlowTest#parentUploadsHealthReport_Success:204`、`#parentCreatesRecordWithOrder_Success:164`、`#parentCreatesRecordWithoutChild_Fails:130`;`TaskPlanServiceTest` 1 例。
+③ **最优修改方案**:CfCommission 8 例补档位查询桩;ArticleAutoTag 改 `verify(executor, times(n))`;GrowthRecordSync 在 `@BeforeEach` 补齐 mock;TaskPlan 对齐返回值口径。
+④ **修改目的**:让红例直接反映产品/契约缺陷,恢复信号价值。
+⑤ **能否闭环**:可。定向复跑 4 类 0 红 → 全量红例 34→≤18。
+
+### P-2(P0 · B 类 · 14 例)产品缺陷 / 契约不一致(第 5 轮挂账)
+① **问题描述**:`EnergySystemFlowTest` 6 例(5×500 + 1 码值)、编排 2 例、会员支付 1、支付路由 1、微信登录 2(token null)、分佣冷却 1、`MindFortune` 1(B-69 同源)。
+② **测试 bug 点**:`EnergySystemFlowTest#parentQueriesEnergyLogs_Success:246` 等 6 例;`OrchestrationEngineTest:176`、`OrchestrationIntegrationTest:105`;`MembershipPaySwitchTest:209`;`PaymentServiceORDRoutingTest:83`;`UserServiceWechatLoginContractTest:110`、`UserServiceWechatLoginTest`;`TeamProfitCronContractTest#refundWithinCooling_cancelAllRecordsFundsNotPaid`。
+③ **最优修改方案**:EnergySystem 取 500 堆栈最内层;Orchestration 对齐 `task.status` 写入;MembershipPay 修 `configMissing→null`;PaymentORD 补未知前缀路由;WechatLogin 核 token 签发;TeamProfitCron 补冷却期退款取消。
+④ **修改目的**:消除五维能量/编排/支付/登录/分佣主链路真实缺陷。
+⑤ **能否闭环**:可,需研发逐类复现;判据:定向复跑 0 红 + 全量红例下降。
+
+### P-3(P1 · 契约 · 3 例)`DimensionRegistryMap` 契约口径未决(第 9 轮挂账)
+① **问题描述**:`map_unknownLegacy_returnsNullData:76`、`map_emptyLegacy_returnsNullData:85` 期望 `data=null` 实返原值;`map_missingLegacy_returnsBadRequest:92` 期望 400 实返 200。
+② **测试 bug 点**:`DimensionRegistryMapContractTest` 上述 3 例。
+③ **最优修改方案**:主理人裁定「未知码/空码映射 null、缺码 400」并同步改契约或实现。
+④ **修改目的**:终止测试与实现的长期契约分歧。
+⑤ **能否闭环**:可。裁定落码后 3 例转绿。
+
+### P-4(P0 · 安全 · 第 19 轮)`/api/mind/**` 鉴权缺口
+① **问题描述**:线上匿名 `POST /api/mind/fortune` → **HTTP 200** + `{"code":400,"message":"用户不存在"}`;对照 `/api/energy/overview` → 401,证明机制可用、清单缺项。
+② **测试 bug 点**:`MindFortuneControllerTest#testGetTodayFortuneWithoutAuth`(期望 401 实得 400)。
+③ **最优修改方案**:按 O-21 裁决,将 `/api/mind/` 等 4 条白名单移入 `JwtInterceptor.LOGIN_REQUIRED_PATHS`(`JwtInterceptor.java:88-130` 当前无 `/api/mind/`),并去掉 `MemorySaver`。
+④ **修改目的**:关闭匿名可达的用户私有数据面。
+⑤ **能否闭环**:可。判据:匿名探针全 401 + `MindFortuneControllerTest` 转绿 + `JwtInterceptorLoginRequiredPathTest` 全绿。
+
+### P-5(P2 · 节点偶发 · 观察第 1 轮)189 `TC-A-U05` 登录前置偶发
+① **问题描述**:189 首轮 5 例中 `TC-A-U05` 前置登录停在 `/admin/login`;**复验轮 5/5 全绿**、本机同批 U05 亦绿 → 判定节点偶发(滑块时序/风控),非产品回归。
+② **测试 bug 点**:`tests/e2e-live/admin-live.spec.js:184` `TC-A-U05`(B-59 后前置失败为硬断言,不再吞为 skip,故偶发显式暴露)。
+③ **最优修改方案**:登录步骤加重试(滑块失败回退重跑 1 次再断言,2 次仍失败才判红)。
+④ **修改目的**:消除滑块偶发假红,保持前置失败硬断言不退化回 skip。
+⑤ **能否闭环**:可。判据:连续 2 轮 189 首轮 0 偶发 → 销号 B-120。
+
+### P-6(P1 · 环境/凭据 · 第 19 轮)langgraph 251 侧 LLM 凭据无效 + checkpointer 缺失
+① **问题描述**:251 实派 44 例中 12 红:`test_analyze` 2 例、`test_chat` 1 例、`test_auto_tag` 5 例(LLM 401)、`test_intent` 4 例(静默降级 chat)。与 R118 逐例一致。
+② **测试 bug 点**:`tests/test_analyze.py::test_analyze_endpoint`、`::test_analyze_missing_report`;`tests/test_chat.py::test_chat_endpoint`;`tests/test_auto_tag.py` 5 例;`tests/test_intent.py::test_classify_analysis|recommend|mind|health`。
+③ **最优修改方案**:注入有效 `LLM_API_KEY`(或全 mock);`analyze` 补 `thread_id`/checkpointer;`intent_classifier` 401 时应抛错。
+④ **修改目的**:让 251 测试产出有效信号而非稳定噪声。
+⑤ **能否闭环**:可。判据:251 实派 44 例 0 红(或全 mock 后 0 红)。
+
+---
+
+## 十、门禁结论
+
+| 门禁 | 阈值 | 本轮实测 | 判定 |
+|---|---|---|---|
+| G1 全量通过率 | ≥98% | **98.06%**(后端 98.67%) | ✅ |
+| G2 红例数 | 0 | **61**(后端 34 + 根级 16 + langgraph 11) | ❌ |
+| G3 前端 jest | 全绿 | 423/426(3 skip,0 红) | ✅ |
+| G4 管理端 jest | 全绿 | 116/116 | ✅ |
+| G5 后端编译完整性 | 0 错、无沉默 | 编译 0 错;339/339 XML、沉默 0;恒等式误差 0 | ✅ |
+| G6 浏览器 E2E | 全绿 | **28/28** + 189 复验 5/5 | ✅ |
+| G7 langgraph | 0 红 | 32/43(**11 红**) | ❌ |
+| G8 鉴权契约 | 全绿 | health 13/13 + `/api/mind` **1 红 + 线上匿名 200** | ❌ |
+| G9 SRS 锚点 | ≥40% | **10.6%**(86/812) | ❌ |
+| G10 节点派发 | 双节点可派 | **251 ✅** / **189 ✅**(复验 5/5) | ✅ |
+| G11 CI 接入 | 含后端全量 | 仅 test-compile + 前端 jest | ❌ |
+| G12 测试资产入库 | 变更已入库 | 报告/台账/阻塞更新入库 | ✅ |
+
+### 综合结论:**不通过(有条件)**
+
+- 阻断项:G2(61 红)、G7(langgraph 11 红)、G8(鉴权缺口 + O-21 未落码)、G9(锚点 10.6%)、G11(CI 无后端全量)。
+- 达标项:G1 98.06%、G3、G4、G5、G6、G10、G12。
+- **复评条件**:① P-4 落码(O-21);② P-2 中 EnergySystem/MembershipPay/PaymentORD/WechatLogin 四类定向复跑 0 红;③ CI 出现后端全量作业。
+- **与 R118 关系**:测试结果**严格零漂移**(逐项逐例一致,34 红类差集空);本轮新增观察 B-120(189 偶发,复验绿,不作红例计);连续第 5 轮挂账于 P-1/P-2/P-4/P-6 等未修项。
+
+---
+
+## 附:本轮产出物
+
+| 文件 | 内容 |
+|---|---|
+| `docs/tdd/orchestration/report-test-2026-11-10-R119.md` | 本报告 |
+| `docs/tdd/test/automation-run-2026-11-10-R119.md` | 执行台账(命令/耗时/原始数字) |
+| `docs/tdd/test/blockers.md` | 追加 B-120-New(189 偶发观察),更新 B-69(第 19 轮)/B-36(第 22 轮)/B-13(观察) |
+| `docs/tdd/研发交接通知-2026-11-10-第119轮.md` | 研发交接通知(P-4 / P-2 / P-6 优先) |

+ 48 - 0
docs/tdd/test/automation-run-2026-11-10-R119.md

@@ -0,0 +1,48 @@
+# 第 119 轮执行台账(2026-11-10 08:32–09:47)
+
+- 分支:`cfclub`;测试基线 HEAD:`8f5585198`(R118 提交,`git fetch` 后与 origin/cfclub 零差异,窗口内源码零变更)。
+- 执行档:review(离线)。未装依赖、未启停服务、未改生产代码、未改测试用例。
+- 原始日志目录(本机临时,未入库):`d:/cfc/_r119/`(backend.log / web.log / frontend.log / root.log / langgraph.log / e2e_live.log / e2e_health.log / e2e_189.log / e2e_189_retry.log / agg.json / attr.json)
+
+## 1. 命令与结果
+
+| # | 套件 | 命令 | 用例 | 通过 | 红 | Skip | 耗时 | 退出码 |
+|---|---|---|---|---|---|---|---|---|
+| 1 | 后端全量 | `JAVA_HOME=/d/jdk1.8.0_25` + `/d/maven/apache-maven-3.6.1/bin/mvn -o -B -f cfc-backend/pom.xml clean test` | 2864 | 2826 | 31F+3E | 4 | 73 min | 1(仅测试红) |
+| 2 | 管理端 | `cd cfc-web && npx jest --ci --silent --coverage --coverageReporters=text-summary` | 116 | 116 | 0 | 0 | 214.9s | 0 |
+| 3 | 小程序端 | `cd cfc-frontend && npx jest --ci --silent` | 426 | 423 | 0 | 3 | 105.5s | 0 |
+| 4 | 根级黑盒 | `npx jest --config tests/jest.config.js --ci --silent` | 23 | 7 | 16 | 0 | 14.3s | 1 |
+| 5 | langgraph@251 | `MSYS_NO_PATHCONV=1 BASE=http://192.168.16.251:4096 DIR=/sc-data/cfc/cfc-langgraph CMD=".venv/bin/python -m pytest tests -q --ignore=tests/qna -p no:cacheprovider" node docs/tdd/tools/dispatch_shell.cjs` | 44(含 test_chat) | 32 | 12 | 0 | 72.4s | — |
+| 6 | 浏览器 live@本机 | `cd tests && npx playwright test -c playwright.config.live.js --reporter=list` | 15 | 15 | 0 | 0 | 3.1m | 0 |
+| 7 | 浏览器 health@本机 | `cd tests && npx playwright test -c playwright.config.health.js --reporter=list` | 13 | 13 | 0 | 0 | 8.4s | 0 |
+| 8 | 浏览器 admin@189 | `node docs/tdd/tools/dispatch_189_shell_v2.cjs`(首轮) | 5 | 4 | **1(U05 登录偶发)** | 0 | 31.6s | 1 |
+| 8b | 浏览器 admin@189 复验 | 同上(复验轮) | 5 | **5** | 0 | 0 | 1.4m | 0 |
+
+## 2. 关键口径
+
+- 主口径全量 = 后端 2864 + 前端 426 + 管理端 116 + 根级 23 + langgraph 43(剔 `test_chat`,与 R118 同口径)+ 浏览器 28 = **3500 例 / 3432 过 = 98.06%**。
+- 扩展口径(含 `test_chat`)= 3501 / 3432 = 98.03%。
+- 189 首轮 U05 失败(`TC-A-U05` 前置登录停在 `/admin/login`,为滑块登录偶发)→ **复验轮 5/5 全绿**(本机同批 U05 亦绿)→ 判定节点偶发,非产品回归,不阻断(后述 B-120-New)。
+- 恒等式:`@Test 2854 − 类级 @Disabled 4 + 参数化/早退净增 14 = 2864`(误差 0);测试源类 339 = surefire XML 339(沉默 0)。
+
+## 3. 关键命令输出摘录
+
+- 后端:`[INFO] Results:` → `[ERROR] Tests run: 2864, Failures: 31, Errors: 3, Skipped: 4`;`[INFO] BUILD FAILURE`;`[INFO] Total time: 01:13 h`。
+- 聚合:`classes=339 tests=2864 pass=2826 F=31 E=3 S=4 rate=98.67% (ex-env 98.67%) red_classes=15 red_cases=34`。
+- 归因桶:`{'assert': 19, 'mockito': 12, 'npe': 2, 'other': 1}`;`env: 0`。
+- 场景度量:`{'scenes': 215, 'scenes_mapped_to_tc': 155, 'scene_mapped_ratio': 72.1, 'scenes_literal_in_spec': 32, 'tc_total': 812, 'tc_exception': 483, 'tc_exception_ratio': 59.5, 'tc_with_asset_anchor': 86}`。
+- 251 侧:`44 tests collected`;`12 failed, 32 passed, 6 warnings in 72.36s`;检出基线 `8f5585198`。
+- 189 侧(复验):`5 passed (1.4m)`,TC-A-U01~U05 全绿。
+
+## 4. 本轮观察(详见 blockers.md)
+
+- **B-120-New(观察)**:189 首轮 5 例中 `TC-A-U05` 1 例前置登录失败(停在 `/admin/login`),**复验轮 5/5 全绿**,且本机同批 U05 绿 → 判定**节点偶发(滑块登录风控/时序),非产品回归**。本轮不作为红例计入全量,观察 2 轮。
+- **B-69(第 19 轮)**:线上匿名 `POST /api/mind/fortune` → **HTTP 200** + `{"code":400,"message":"用户不存在"}`;对照 `/api/energy/overview` → 401。O-21 未落码。
+- **零漂移**:后端 34 红 15 类(差集空)、前端/管理端/根级/langgraph 逐项与 R118 一致。
+
+## 5. 未实测项(如实登记)
+
+- 性能压测、依赖漏洞扫描、DAST/SAST:未授权联网,未执行。
+- 根级黑盒 16 红:未修(B-36),仍无有效接口层黑盒信号。
+- UAT/BDD、探索性、兼容性多浏览器、无障碍:无资产/无工具,未执行。
+- 本机 9082 后端未启动,故「本地活服务器」类套件未跑(按规则不擅自启停服务)。

+ 11 - 0
docs/tdd/test/blockers.md

@@ -318,3 +318,14 @@
 | B-13-Update(第 118 轮 · 环境红首次归零) | 3 类硬编码 `127.0.0.1:3306` 的 `@SpringBootTest` | 研发/环境 | **本轮环境红 0 例**:`AdminFamilyOverviewControllerTest`(历史每轮 3 红)本轮 **3/3 绿**,`test_attr.py` 归因 `env: 0`。判定为「潜在风险未复现」而非「已修复」——三处硬编码仍在,换机器/换网络即复现 | 测试负责人(第 118 轮实测) | 2026-11-10 08:20 | 观察(P2) |
 | B-36-Update(第 118 轮 · 第 21 轮零漂移) | 根级黑盒 23 例 16 红 | 测试 | **零漂移**。本轮实跑 3 套 23 例:7 绿 / 16 红(`1a2b.spec.js` 收集失败 + `mini-games-api` 13 红 + `plan-chain` 3 红),与 R117 逐项一致 | 测试负责人(第 118 轮实测) | 2026-11-10 08:00 | 待处理(P1) |
 | G-11-Close(第 118 轮 · 闭环) | `cfc.iwintrue.com:443` 返回 502 | 运维 | **已闭环**:`https://cfc.iwintrue.com/admin` 由 07:10 轮的 **502 → 302**(跟随后 200),HTTP:80 亦 302→200。浏览器自动化仍走 HTTP 目标;观测 2 轮稳定后销号 | 测试负责人(第 118 轮探活) | 2026-11-10 07:40 | 已闭环 |
+
+<!-- ===== 第 119 轮(2026-11-10 08:32,本自动化)追加 ===== -->
+
+| B-120-New(第 119 轮 · 观察第 1 轮) | 189 首轮 `TC-A-U05` 前置登录偶发 | 测试 | **新登记(P2 观察)**。189 首轮 5 例中 `TC-A-U05` 前置登录停在 `/admin/login`(滑块拖过未出登录页,硬断言失败);**同轮复验 5/5 全绿**(1.4m),本机同批 U05 亦绿 → 判定**节点偶发(滑块时序/风控)非产品回归**,不作红例计入全量。闭环判据:连续 2 轮 189 首轮 0 偶发 → 销号;建议在登录前置加重试(P-5) | 测试负责人(第 119 轮实派+复验) | 2026-11-10 09:00 | 观察(P2) |
+| B-69-Update(第 119 轮 · 连续第 19 轮) | `/api/mind/**` 匿名可达(鉴权清单缺项) | 研发 | **连续第 19 轮未修,O-21 未落码**。线上匿名 `POST /api/mind/fortune` → **HTTP 200** + `{"code":400,"message":"用户不存在"}`;对照 `/api/energy/overview` → **401**(机制正常、清单缺项)。闭环判据不变:`JwtInterceptor.LOGIN_REQUIRED_PATHS` 增 `/api/mind/` | 测试负责人(第 119 轮线上复证) | 2026-11-10 09:42 | 待处理(P0,第 19 轮) |
+| B-65-Update(第 119 轮 · 连续第 23 轮) | langgraph `/api/v1/analyze` checkpointer 缺 thread_id | 研发 | **连续第 23 轮未修(P0)**。251 实派:`test_analyze.py` 2 例 `assert 500 == 200`,与 R118 逐例一致 | 测试负责人(第 119 轮实派) | 2026-11-10 09:40 | 待处理(P0,第 23 轮) |
+| B-74-Update(第 119 轮 · 连续第 19 轮) | langgraph `test_auto_tag.py` 5 例红 | 研发/运维 | **连续第 19 轮**。251 实派:5 例 `AssertionError`(LLM 401)。闭环判据:251 注入有效 LLM 凭据 | 测试负责人(第 119 轮复现) | 2026-11-10 09:40 | 待处理(P1) |
+| B-82-Update(第 119 轮 · 连续第 19 轮) | langgraph `test_intent.py` 4 例红(静默降级) | 研发 | **连续第 19 轮未修**。251 实派:4 例 `assert <Intent.CHAT>`(LLM 401 后静默降级) | 测试负责人(第 119 轮复现) | 2026-11-10 09:40 | 待处理(P1) |
+| B-36-Update(第 119 轮 · 第 22 轮零漂移) | 根级黑盒 23 例 16 红 | 测试 | **零漂移**。本轮实跑 23 例:7 绿 / 16 红(与 R118 逐项一致) | 测试负责人(第 119 轮实测) | 2026-11-10 09:30 | 待处理(P1) |
+| B-13-Update(第 119 轮 · 延续观察) | 3 类硬编码 `127.0.0.1:3306` 的 `@SpringBootTest` | 研发/环境 | 维持「潜在风险未复现」:本轮环境红 0,`AdminFamilyOverviewControllerTest` 3/3 绿;硬编码仍在,换机即复现 | 测试负责人(第 119 轮实测) | 2026-11-10 09:30 | 观察(P2) |
+| G-11-Update(第 119 轮 · 闭环后第 2 轮稳定) | `cfc.iwintrue.com:443` → 302/200 | 运维 | HTTPS 302(跟前 200)连续 **2 轮稳定**,HTTP:80 亦 302→200。按 R118 判据「观测 2 轮稳定后销号」→ **本轮销号** | 测试负责人(第 119 轮探活) | 2026-11-10 09:42 | 已闭环(销号) |

+ 65 - 0
docs/tdd/研发交接通知-2026-11-10-第119轮.md

@@ -0,0 +1,65 @@
+# 研发交接通知 · 第 119 轮(2026-11-10 09:47)
+
+> 致:研发负责人 / 主理人  自:测试负责人(自动化闭环轮 R119)
+> 结论:**不通过(有条件)**;与 R118 **严格零漂移**(逐项逐例一致,34 红类集合差集空)
+> 本轮基线 HEAD `8f5585198`(R118),窗口内**零生产源码 / 零 SRS / 零用例变更**
+
+---
+
+## 一、全量数字(本轮实测,全部重跑)
+
+| 套件 | 用例 | 通过 | 红 | Skip | 通过率 |
+|------|------|------|----|------|--------|
+| 后端 JUnit(339 类) | 2864 | 2826 | **34**(31F+3E) | 4 | 98.67% |
+| 前端 Jest | 426 | 423 | 0 | 3 | 100% |
+| 管理端 Jest | 116 | 116 | 0 | 0 | 100% |
+| 根级黑盒 | 23 | 7 | **16** | 0 | 30.43% |
+| langgraph@251 | 43(同口径) | 32 | **11** | 0 | 74.42% |
+| 浏览器 E2E(本机 28 + 189 复验 5) | 28(主口径) | 28 | 0 | 0 | 100% |
+| **全量(主口径)** | **3500** | **3432** | **61** | **7** | **98.06%** |
+
+节点派发:**251 ✅**(langgraph 44 例取回,72.4s);**189 ✅**(admin 复验 5/5)。
+
+---
+
+## 二、优先处理项(按优先级)
+
+### P-4(P0 · 安全 · 第 19 轮未修)`/api/mind/**` 鉴权缺口
+- 线上匿名 `POST /api/mind/fortune` → **HTTP 200** + `{"code":400,"message":"用户不存在"}`;对照 `/api/energy/overview` → 401。
+- 落码:`JwtInterceptor.LOGIN_REQUIRED_PATHS` 增 `/api/mind/`(O-21 裁决),并去 `MemorySaver`。
+- 单测 `MindFortuneControllerTest#testGetTodayFortuneWithoutAuth` 转绿即闭环。
+
+### P-2(P0 · 产品缺陷 · 14 例 · 第 5 轮零漂移)
+- `EnergySystemFlowTest` 6 例(5×`expected 200 but 500` + 1 码值)——五维能量主链路。
+- `OrchestrationEngineTest` / `OrchestrationIntegrationTest` 各 1、`MembershipPaySwitchTest` 1、`PaymentServiceORDRoutingTest` 1、`UserServiceWechatLogin*` 2(token null)、`TeamProfitCronContractTest` 1。
+- 需逐类定向复跑 0 红。
+
+### P-6(P1 · 环境 · 251 侧)langgraph LLM 凭据无效 + checkpointer 缺失
+- `test_analyze` 2、`test_chat` 1、`test_auto_tag` 5(LLM 401)、`test_intent` 4(静默降级 chat),共 11~12 红连续第 19 轮。
+- 落码:251 注入有效 `LLM_API_KEY`(或全 mock);`analyze` 补 `thread_id`/checkpointer;`intent_classifier` 401 时抛错。
+
+### P-1(P1 · 测试装置 · 16 例 · 第 5 轮零漂移)→ 可由测试自处置,需研发确认契约
+- `CfCommissionServiceSettleTest` 8、`ArticleAutoTagServiceTest` 4、`GrowthRecordSyncFlowTest` 3、`TaskPlanServiceTest` 1。
+
+### P-3(P1 · 契约待裁决 · 3 例 · 第 9 轮)`DimensionRegistryMap`
+- `map_unknownLegacy`/`map_emptyLegacy` 期望 `data=null` 实返原值;`map_missingLegacy` 期望 400 实返 200。需主理人/研发二选一拍板契约口径。
+
+### G-4(P1 · 流程)根级黑盒 16 红(B-36 第 22 轮)+ G-6 CI 无后端全量 + G-9 SRS 锚点 10.6%。
+
+---
+
+## 三、本轮新观察(测试侧自闭环,研发知悉即可)
+
+- **B-120-New(P2 观察)**:189 首轮 `TC-A-U05` 前置登录偶发(停在 `/admin/login`)→ 复验 5/5 全绿、本机同批亦绿 → 判定节点偶发,非产品回归。测试侧拟在登录前置加重试(P-5),连续 2 轮 0 偶发销号。
+- **G-11 已销号**:HTTPS 443 闭环后连续 2 轮稳定(302→200)。
+
+---
+
+## 四、给研发的请求
+
+1. **P-4 立即落码**(O-21,第 19 轮)——安全红线。
+2. **P-2 四类主链路缺陷定向修复**(EnergySystem 优先)。
+3. **251 LLM 凭据**:运维/研发注入有效 key,或同意全 mock 口径。
+4. **P-3 契约拍板**:`DimensionRegistryMap` 三例口径。
+
+> 详细五要素问题清单见 `docs/tdd/orchestration/report-test-2026-11-10-R119.md`;执行台账见 `docs/tdd/test/automation-run-2026-11-10-R119.md`;阻塞台账见 `docs/tdd/test/blockers.md`。