Procházet zdrojové kódy

docs(tdd): 测试负责人第123轮闭环汇报(后端全量98.71%新高·251实派42/1·B-55/B-121双向纠正)

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

+ 343 - 0
docs/tdd/orchestration/report-test-2026-11-10-R123.md

@@ -0,0 +1,343 @@
+# 测试闭环报告 · 第 123 轮(2026-11-10 12:35 GMT+8)
+
+> 主理人:陆谨(软件测试专家团 · 测试架构师)
+> 执行档:**review 档**(内网 `cfc.iwintrue.com` 已授权;无联网外部请求;未装依赖;未改生产代码)
+> 对象:`d:/cfc`(浠艾福 XAF)
+> 触发:定时自动化「测试负责人闭环(全部用例通过 + 覆盖 SRS/场景含异常流)+ 浏览器走 `/admin` 与 `/frontend`(189/本机每节点单任务)+ langgraph 派 251 + 结果有变提交远程并通知研发」
+
+---
+
+## 0. 本轮结论速览
+
+| 项 | 值 |
+|----|----|
+| 基线 | `cfclub @ 568cecac6`(跑前 = 跑后;收尾 fetch 远端前进 3 提交,全为 docs + auto bump,零源码变更) |
+| 全量用例 | **3501 例 / 3444 过 = 98.37%**(红 50 / 跳过 7) |
+| 对比上轮权威基线(R118/R120 `98.06% / 3432 过`) | **+1 例、+12 过、+0.31pp** |
+| 后端全量 | **2865 例 / 2828 过 = 98.71%**(新高),30F+3E+4S,14 红类 / 33 红例,48:05,XML 339/339 无沉默 |
+| 浏览器自动化 | **28/28 全绿**(live 15 + health 13) |
+| langgraph @ 251 | **43 例 / 42 过 / 1 红**(首次由 251 节点实派取回,B-55 本轮闭合) |
+| 门禁 | **不通过(有条件)** — 见 §9 |
+
+**三件必须让研发看到的事**
+
+1. **R122 的「本机无 Maven」是第 4 次误判**:`D:\maven\apache-maven-3.6.1` + `D:\jdk1.8.0_25` 一直可用。本轮据此拿到后端全量 98.71%,而 R122 直接跳过整个后端模块(降级为「复用 R120 基线」)。这是**流程缺陷而非环境缺陷**,登记 **B-123**。
+2. **B-121(admin `TC-A-U05` 确定性失败 2/2)本轮未复现**:同机同套件 **5/5 全绿**,U05 用时 58.4s 通过。R122 判「确定性失败」过重,改判「节点偶发(滑块/风控时序)」,转观察态,连续 2 轮绿即销号。
+3. **B-74 由 5 例降到 1 例**:251 实派仅 `test_auto_tag_content_relevance` 一例 `AssertionError`(LLM 语义相关性),其余 4 例随 `eeb147273` 一并转绿;同时 251 实派**独立复核了 B-65/B-82 的销号**(`test_analyze` 2 例、`test_intent` 4 例均不在失败清单)。
+
+---
+
+## 1. 历史审查记录
+
+| 项 | 内容 |
+|----|------|
+| 上次本对象审查 | R122 @ 2026-11-10 12:10~12:33(`568cecac6`,即本轮的同一 HEAD) |
+| 上次结论 | 未单独出完整门禁;以「R120 全量基线 98.06% + 本小时 589/599」形式呈现,未评门禁 |
+| 上次遗留缺口 | ① 后端全量未实测(误判无 Maven)② `B-121` admin U05 新增红 ③ `B-55` 251 派发未达成 ④ 覆盖率/变异/压测/安全 长期未实测 |
+| 本次是否改善 | ①②③ **全部改善**(① 拿到 98.71% ② U05 转绿 ③ 251 实派成功);④ 未变(execute 档未授权) |
+| 是否首次审查 | 否。同对象已连续审查 ≥123 轮 |
+
+> 本节仅作对照。本轮全部结论均以本轮实测取证,未沿用任何历史数字作为通过依据;仅「SRS 台账计数」因窗口零变更而标注沿用。
+
+---
+
+## 2. 项目画像
+
+| 维度 | 结论 |
+|------|------|
+| 业务定位 | 家庭教育 SaaS:家长/孩子(能登录/不能登录用户)双角色、成长规划师、五维能量、健康报告解析、测评订单、商城、AI 管家 |
+| 技术栈 | 后端 Spring Boot 2.7.18 + MyBatis-Plus + Java 8(端口 9082);小程序 uni-app Vue2;管理端 Vue2 + Element UI;AI 侧 Python FastAPI + LangGraph + ChromaDB(9000,生产 `ai.etotem.com.cn`);独立商城 Spring Boot(8888) |
+| 规模(本轮实测) | 后端测试类 **339**、`@Test` **2854**、`@Disabled` **4**、控制器 **363**、`@GetMapping` **8 处**(仍违 AGENTS.md「统一 @PostMapping」);SRS 规格 **200 份**;用例台账 **14 份** |
+| 关键路径 | 登录鉴权(JWT 拦截 + 8 公开路径)→ 家庭成员/关系 → 成长任务与能量 → 健康报告上传-解析-入库 → 测评订单 → 商城下单/分润 → AI 对话/画像 |
+| 质量目标 | 全量用例通过率、SRS/场景锚点覆盖、线上鉴权契约、浏览器双端可用性、跨节点可派发 |
+| 本轮风险点 | 真实 DB 集成测试依赖 `192.168.16.251:3306`;A 类夹具仍 16 红;`platform_fee` 列溢出;189 节点仓库陈旧 |
+
+---
+
+## 3. 20 类测试覆盖矩阵
+
+图例:● 已发现(有资产且有本轮/近期实测证据)/○ 未发现(扫描未命中)/◐ 待核实(有资产但本轮未实测或被降级)
+
+| # | 类别 | 状态 | 证据 |
+|---|------|------|------|
+| 1 | 单元测试 | ● | 后端 339 类 2865 例实跑;cfc-web 116、cfc-frontend 426 Jest 实跑 |
+| 2 | 组件测试 | ● | 后端 `*ControllerTest`(MockMvc)批量实跑;前端 Vue 组件 `__tests__` 实跑 |
+| 3 | 接口 API 测试 | ● | 浏览器侧 health 契约 13 例(10 端点未鉴权全 401)+ shop-sort 4 例实跑 |
+| 4 | 系统 / 端到端 | ● | `/admin` 5 例 + `/frontend` 6 例真浏览器实跑(Playwright 1 worker) |
+| 5 | 验收 UAT | ◐ | 有 `tests/user-scenarios` 198 场景映射,但无独立 UAT 执行记录(业务凭据不全) |
+| 6 | 冒烟测试 | ● | 每轮固定 28 例 live/health 冒烟;本轮全绿 |
+| 7 | 回归测试 | ● | 后端全量 2865 例 + 三套 Jest 全量 = 本轮回归基线 |
+| 8 | 探索性测试 | ○ | 无 chartered 探索会话记录 |
+| 9 | 契约测试 | ● | health 13 + shop-sort 4 + 后端 `*ContractTest`(DimensionRegistryMap / TeamProfitCron / WechatLoginContract 等) |
+| 10 | 性能测试 | ○ | 无压测脚本与基线(execute 档,需联网授权) |
+| 11 | 可靠性测试 | ○ | 无故障注入/恢复演练;仅线上 502 抖动被观测(B-72 历史) |
+| 12 | 安全测试 | ◐ | 鉴权契约 23 端点实测(全 401);SAST/DAST/依赖扫描未执行(execute 档) |
+| 13 | 兼容性测试 | ◐ | 仅 Chromium;多浏览器/多机型矩阵未执行 |
+| 14 | 可用性测试 | ○ | 无真实用户可用性证据 |
+| 15 | 无障碍测试 | ○ | 无 WCAG 检查 |
+| 16 | 覆盖率度量 | ◐ | cfc-web 引用历史 10.11/6.12/7.51/9.98%;后端 JaCoCo 离线不可用 |
+| 17 | 变异测试 | ○ | 无 PIT/mutation 配置 |
+| 18 | 质量指标 | ● | 通过率/红例分布/桶分布本轮重算(§8) |
+| 19 | QA 流程 | ● | 自动化闭环 123 轮可追溯;门禁脚本化不足(G11) |
+| 20 | 代码审查 | ● | 本轮抽检红例对应生产代码 6 处(EnergySystem / DimensionRegistry / platform_fee / ArticleAutoTag / CfCommission / WechatLogin) |
+
+**缺口初判**:5 类 ○ 全为「非功能 + 探索性 + 变异」,均属 execute 档或需专项排期;5 类 ◐ 为本轮降级项,已在 §7 转成缺口条目。
+
+---
+
+## 4. 测试方案(本轮实际执行)
+
+| 项 | 内容 |
+|----|------|
+| 目标 | 全量用例重新取证;验证 SRS/场景零变更;验证跨节点派发;验证上轮遗留 3 项(U05 / 251 / 后端全量) |
+| 范围 | 后端全量 339 类、cfc-web 17 套、cfc-frontend 26 套、根级 tests 3 套、langgraph@251 43 例、浏览器 live 15 + health 13 |
+| 覆盖维度 | 功能层次 5 类 + 功能保障 4 类 + 非功能鉴权/兼容(部分) |
+| 执行档 | review(离线白名单);内网 HTTP 探针与内网站点浏览器访问均为已授权范围 |
+| 优先级 | P0:后端全量 + 鉴权契约 + 浏览器双端;P1:251 派发;P2:度量口径 |
+| 排除项 | 压测、DAST/SCA、变异、多浏览器矩阵、UAT 全流量(未授权/无凭据)——报告中标「未实测」,不计通过 |
+
+---
+
+## 5. 执行结果明细
+
+### 5.1 后端全量(`mvn -o -B clean test`,JDK1.8.0_25 + Maven 3.6.1)
+
+| 项 | 值 |
+|----|----|
+| 总耗时 | **48:05** |
+| 结果 | **2865 例 / 2828 过 / 30F + 3E + 4S = 98.71%**(剔 skip 98.85%) |
+| 红类 / 红例 | **14 类 / 33 例** |
+| 完整性 | surefire XML **339/339**,与 339 个测试类一一对应,**沉默丢失 0** |
+| testCompile | 345 源 0 错 |
+| 恒等式 | `@Test 2854 − @Disabled 4 + 参数化/早退净增 15 = 2865`,误差 0 |
+| dump | 1 份 `2026-11-10T12-41-35_125-jvmRun1.dump`,内容为 `PpidChecker` 收尾 `IllegalStateException: error [STOPPED] to read process`(构建结束瞬间的 fork 回收竞态),**非测试崩溃** |
+| 对比 R118/R120 | 2864/2826/98.67%/34 红 → **+1 例 +2 过 +0.04pp,红例 −1** |
+
+**33 红三层归因**
+
+| 桶 | 例数 | 明细 |
+|----|------|------|
+| A 装置(测试自身缺陷) | 16 | `CfCommissionServiceSettleTest` 8(`Wanted but not invoked`)· `ArticleAutoTagServiceTest` 4(`threadPoolTaskExecutor.execute` 未命中)· `GrowthRecordSyncFlowTest` 3(1F+2E)· `TaskPlanServiceTest` 1(`expected 100 but was null`) |
+| B 产品 | 13 | `EnergySystemFlowTest` 6(5×`expected 200 but was 500` + 1 断言 false)· `OrchestrationEngineTest` 1 + `OrchestrationIntegrationTest` 1 · `MembershipPaySwitchTest` 1 · `PaymentServiceORDRoutingTest` 1 · `UserServiceWechatLoginTest` 1 + `UserServiceWechatLoginContractTest` 1 · `TeamProfitCronContractTest` 1(`cancelled=0`) |
+| C 数据 | 1 | `GuideModuleIntegrationTest` — `Data truncation: Out of range value for column 'platform_fee'`(第 12 轮) |
+| 契约待裁决 | 3 | `DimensionRegistryMapContractTest`(`expected 400 but was 200`、`$.data` 应为 null 实为 `""`/`unknown_legacy_xyz`) |
+
+**历史红类消失证据(B-69 落码生效)**:`MindFortuneControllerTest` 本轮**不在红类清单**(R118 为 1 红)。线上 `POST /api/mind/fortune` 本轮复证 **401**,与 `/api/energy/overview` 401 对照一致 → 鉴权清单修复在生产与单测两侧同时成立。
+
+### 5.2 前端 / 管理端 / 根级
+
+| 套件 | 套件数 | 例数 | 过 | 红 | 跳过 | 与基线 |
+|------|-------|------|----|----|------|--------|
+| cfc-web Jest | 17 | 116 | 116 | 0 | 0 | 零漂移 |
+| cfc-frontend Jest | 26 | 426 | 423 | 0 | 3 | 零漂移 |
+| tests 根级 Jest | 3 | 23 | 7 | 16 | 0 | 零漂移(B-36,9082 未启动 → ECONNREFUSED) |
+
+### 5.3 浏览器自动化(`workers=1`,单节点单任务)
+
+| 套件 | 例数 | 结果 | 耗时 | 备注 |
+|------|------|------|------|------|
+| `admin-desktop`(`/admin`) | 5 | **5/5** | 5.6/5.3/3.7/10.2/**58.4**s | U04 真实登录通过;**U05 通过(R122 为 2/2 失败)** |
+| `frontend-mobile`(`/frontend`) | 6 | **6/6** | 3.6~9.6s | 游客流 TC-F-U01~U06 |
+| `shop-api` | 4 | **4/4** | 77~115ms | 价格排序契约 TC-S-U01~U04 |
+| `health-api`(契约) | 13 | **13/13** | 7.2s | 华为 5 + 小米 5 + 健康方案 3,**全部 401** |
+
+合计 **28/28 全绿**,与 R118/R120 基线一致;U05 由红转绿是相对 R122 的最大正向变化。
+
+### 5.4 langgraph @ 192.168.16.251(**首次由 251 节点实派取回**)
+
+| 项 | 值 |
+|----|----|
+| 通道 | `POST /api/shell?location[directory]=/sc-data/cfc/cfc-langgraph`(Basic `opencode:***`,port 4096)→ `GET /api/shell/{id}/output` |
+| 节点 HEAD | `568cecac6`(`git reset --hard origin/cfclub` 后) |
+| 命令 | `.venv/bin/python -m pytest tests --ignore=tests/qna --ignore=tests/test_chat.py -q --tb=line` |
+| 结果 | **1 failed, 42 passed in 344.83s**(43 例,主口径「不含 test_chat」) |
+| 唯一红例 | `tests/test_auto_tag.py::test_auto_tag_content_relevance` — `AssertionError`(内容相关性判定,依赖 LLM 语义输出) |
+| 对比 | R121/R122 pre-fix 43/32/11 → **42/1**,红例 −10 |
+
+**本次实派同时完成三项历史销号的独立复核**:`test_analyze` 2 例(B-65)不在失败清单;`test_intent` 4 例(B-82)不在失败清单;`test_auto_tag` 由 5 例降为 1 例(B-74 收窄)。
+
+### 5.5 节点可达性
+
+| 节点 | 端口 | 结论 |
+|------|------|------|
+| 本机 | — | 浏览器 28/28 全量承担(单任务) |
+| `192.168.16.189` | 4090 **OPEN**(Basic 认证通过,shell 通道可建可读) | **通道已通但不可承载**:仓库为 `C:\worktrees\cfc-user-is-child @ e3e52ca38`(分支 `feature/user-is-child`),`tests/e2e-live` 不存在、`node_modules` 不存在 → 无法执行浏览器套件;不允许装依赖 → 本轮未派发(B-122) |
+| `192.168.16.251` | 9000 OPEN / 4096 OPEN / 22 OPEN | **langgraph 实派成功**;`/health` 200 |
+| `192.168.16.204` | 4090 CLOSED | 延续失联(B-95) |
+
+### 5.6 线上鉴权与可达性(curL 探针)
+
+| 目标 | 结果 |
+|------|------|
+| `GET http://cfc.iwintrue.com/admin` | 302(登录墙,24ms) |
+| `GET http://cfc.iwintrue.com/frontend` | 302(21ms) |
+| `POST /api/mind/fortune`(匿名) | **401** `{"code":401,"message":"请先登录"}` |
+| `POST /api/energy/overview`(匿名,对照) | **401** |
+
+---
+
+## 6. 覆盖缺口清单
+
+| 编号 | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|------|---------|------|------|-------------|--------|---------|
+| G-123-1 | 性能测试 | 无脚本无基线 | 健康报告解析、AI 对话为长耗时链路,无容量依据 | 用 k6 对 `POST /api/health/report/upload`、`/api/v1/chat` 做 20/50 并发阶梯,记录 P95 | P2 | 需 execute 档联网授权后执行,产出基线表 |
+| G-123-2 | 可靠性 | 无故障注入 | `EnergySystem` 500 类问题在生产会直接暴露 | 对 MySQL 断连 + LLM 超时各注入 1 次,断言降级而非 5xx | P2 | 与研发约定注入窗口 |
+| G-123-3 | 安全扫描 | 仅鉴权契约 | 仅覆盖 23 个端点的未鉴权路径 | SAST(Semgrep)+ 依赖漏洞(`mvn dependency-check`) | P2 | execute 档授权 |
+| G-123-4 | 兼容性/无障碍 | 仅 Chromium | 小程序多机型、管理端 IE 类浏览器、WCAG 均空 | Playwright projects 加 firefox/webkit;axe-core 扫 `/admin` 5 页 | P3 | 增配置后纳入冒烟 |
+| G-123-5 | 覆盖率 | 后端 JaCoCo 离线不可得 | 98.71% 通过率不等于行覆盖率 | 离线环境预置 jacoco agent jar 后 `mvn test jacoco:report` | P1 | 预置依赖后补测 |
+| G-123-6 | 变异测试 | 无 | 高通过率可能掩盖弱断言 | 对 `EnergySystemService`、`CfCommissionService` 引入 PIT,目标 kill ≥60% | P3 | 专项排期 |
+| G-123-7 | UAT / BDD | 198 场景仅文档映射 | 场景与断言未一一绑定,锚点率低 | 将 §7 的锚点规范落到 `tests/test-cases`,每场景至少 1 可执行断言 | P1 | 见 B-124 |
+| G-123-8 | 探索性测试 | 无 chartered 记录 | 无脚本外缺陷发现能力 | 每轮 30min 时间盒探索,产出 charter + 发现清单 | P3 | 常态化 |
+
+---
+
+## 7. 域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|---------|---------|------|---------|
+| 单元·组件级 | 苏雅 | **有条件通过** | 后端 2865 例 98.71%,14 红类;cfc-web 116/116、frontend 423/426 |
+| 集成·接口级 | 柯砚 | **不通过(局部)** | 契约 23 端点全 401 ✅;但 `DimensionRegistryMap` 3 例契约口径未裁决、`platform_fee` 溢出 1 例 |
+| 系统·验收级 | 白樾 | **有条件通过** | 浏览器 28/28 ✅;UAT 全流量未执行(无凭据),场景锚点偏低 |
+| 测试保障级 | 闻朔 | **通过** | 冒烟 28/28;回归全量 3501 例可复跑;探索性缺失(登记缺口) |
+| 性能·可靠性 | 骆骋 | **未实测(降级)** | execute 档未授权 → 转 G-123-1/2 测试设计 |
+| 安全 | 关屿 | **有条件通过** | 匿名 23 端点全 401(含 `/api/mind/**` 已修);SAST/SCA 未执行 |
+| 兼容·体验 | 阮清 | **未实测(降级)** | 仅 Chromium;无 axe/WCAG → G-123-4 |
+| 流程·度量·代码 | 何序 | **不通过(局部)** | `@GetMapping` 8 处仍违规范;R122 环境探针缺失致整模块漏测(B-123);锚点口径三种不一致(B-124) |
+
+---
+
+## 8. 五要素问题清单
+
+### #1 `admin` U05 登录前置确定性失败(B-121,本轮转绿)
+
+- **① 问题描述**:R122 同一套件 `TC-A-U05` 连续 2 次停在 `/admin/login` 硬断言失败,而步骤一致的 `TC-A-U04` 通过;本轮同机同套件 **U05 通过(58.4s)**,U04 亦通过。
+- **② 测试 bug 点**:`tests/e2e-live/admin-live.spec.js:184`(TC-A-U05 登录前置未做「等 XHR 返回 + 断言状态码」,只依赖元素/URL 终态)。
+- **③ 最优修改方案**:把 U05 前置改为复用 `waitLoginFormReady()` + `fillPhoneAndAwaitRoles()`(等 `/api/admin-auth/login` 返回 200 后再断言菜单),失败时输出「控件属性 + 提示文案 + 几何量」三件套。
+- **④ 修改目的**:把「滑块/风控时序」与「产品登录回归」解耦,避免同类误判反复计入红例。
+- **⑤ 闭环**:隔离复跑 U05 连续 2 轮通过即销号;若重试仍红且 U04 同流程绿,则判产品侧并转研发。
+
+### #2 langgraph `test_auto_tag_content_relevance` 红(B-74 收窄至 1 例)
+
+- **① 问题描述**:251 实派 43 例中唯一失败为 `test_auto_tag_content_relevance`,`AssertionError`;其余 4 例 auto_tag 已随 `eeb147273` 转绿。
+- **② 测试 bug 点**:`cfc-langgraph/tests/test_auto_tag.py::test_auto_tag_content_relevance`(断言依赖 LLM 对「内容相关性」的语义输出,无固定桩)。
+- **③ 最优修改方案**:为该用例注入确定性桩(mock LLM 返回固定标签集)作为主断言,另设 1 例 `@pytest.mark.llm` 真实链路冒烟并允许 skip;同时给 251 `.venv` 装 `pytest-timeout`。
+- **④ 修改目的**:把「LLM 凭据/网络」与「打标逻辑回归」分离,使该维度可稳定门禁。
+- **⑤ 闭环**:251 复跑该文件 5/5 全绿,且 `pytest-timeout` 生效(单例 ≤60s)即销号。
+
+### #3 根级黑盒 16 红(B-36,第 26 轮零漂移)
+
+- **① 问题描述**:`tests/` 根级 3 套 23 例,稳定 7 绿 / 16 红,全部 `ECONNREFUSED`(后端 9082 未启动)。
+- **② 测试 bug 点**:`tests/integration/*.spec.js`(如 `mini-games-api.spec.js:259`)硬编码 `http://127.0.0.1:9082`,无「服务未起则 skip」保护。
+- **③ 最优修改方案**:加 `beforeAll` 探活,未起则 `test.skip` 并打印启动指引;CI 中由 `globalSetup` 拉起后端。
+- **④ 修改目的**:消除「环境未起」被统计为「产品失败」的长期噪声(每轮固定 16 红)。
+- **⑤ 闭环**:连续 1 轮根级 0 红(或 16 例显式 skip 而非 fail)。
+
+### #4 A 类夹具 16 红(装置缺陷,非产品)
+
+- **① 问题描述**:`CfCommissionServiceSettleTest` 8、`ArticleAutoTagServiceTest` 4、`GrowthRecordSyncFlowTest` 3、`TaskPlanServiceTest` 1 红,形态集中于 `Wanted but not invoked` / `execute` 未命中。
+- **② 测试 bug 点**:上述 4 类(`CfCommission...:settle_F03a...`、`ArticleAutoTag...:toggleStatus_...`、`TaskPlan...:applyAndActivate_...`)。
+- **③ 最优修改方案**:`CfCommission` 逐例核对 mock 方法签名与生产 7 参 overload;`ArticleAutoTag` 改为注入同步 `Executor` 替身(避免线程池异步断言);`TaskPlan` 补齐 `@Mock` 返回值;`GrowthRecordSync` 2 例 E 需读 `Caused by` 最内层。
+- **④ 修改目的**:让 16 红退出统计,暴露真实产品缺口。
+- **⑤ 闭环**:定向复跑 4 类全绿(`mvn -Dtest=A,B,C,D` 用逗号,且必须看 `Tests run:` 行)。
+
+### #5 B 产品 13 红
+
+- **① 问题描述**:`EnergySystemFlowTest` 6(5×500)、`Orchestration*` 2、`MembershipPaySwitch` 1、`PaymentORD` 1、`WechatLogin` 2、`TeamProfitCron` 1。
+- **② 测试 bug 点**:`EnergySystemFlowTest:parentGetsEnergyOverview_Success` 等 6 例;`TeamProfitCronContractTest:refundWithinCooling_cancelAllRecordsFundsNotPaid`。
+- **③ 最优修改方案**:EnergySystem 5 例 500 需抓服务端堆栈定位(疑 DB/事务);TeamProfitCron 冷静期退款未置 `cancelled` 需核对 §8.2 实现;WechatLogin 2 例疑 mock 凭据缺失。
+- **④ 修改目的**:把「疑似产品缺陷」转为可派研发的具体缺陷单。
+- **⑤ 闭环**:对应类 0 红 + 线上同路径 200。
+
+### #6 `platform_fee` 列溢出(C 数据,第 12 轮)
+
+- **① 问题描述**:`GuideModuleIntegrationTest` 写库报 `Data truncation: Out of range value for column 'platform_fee'`。
+- **② 测试 bug 点**:`GuideModuleIntegrationTest::testGuidePackageCreationFlow`(造数金额超出列宽)。
+- **③ 最优修改方案**:核对 `guide_order.platform_fee` 列类型与业务上限;若业务值合法则扩列(DDL 走 `DatabaseInitializer` 迁移 + 同步 `schema.sql`),否则修造数。
+- **④ 修改目的**:避免真实大额订单写库失败。
+- **⑤ 闭环**:迁移后该类转绿 + 用边界值(上限 ±1)复测。
+
+### #7 `DimensionRegistryMap` 契约 3 例待裁决
+
+- **① 问题描述**:`unknown_legacy`/`empty` 期望 `data=null` 实为原值/空串;`missing` 期望 400 实为 200。
+- **② 测试 bug 点**:`DimensionRegistryMapContractTest:map_unknownLegacy_returnsNullData`、`map_emptyLegacy_returnsNullData`、`map_missingLegacy_returnsBadRequest`。
+- **③ 最优修改方案**:由产品/研发对「未知 legacy 键」的语义拍板(null vs 原样回传),据此单向修正契约或用例,写入 SRS。
+- **④ 修改目的**:消除长期悬空契约,避免前后端对同一键不同解释。
+- **⑤ 闭环**:契约条款落 SRS 后,3 例按新条款全绿。
+
+### #8 R122 环境能力探针缺失致整模块漏测(B-123,流程)
+
+- **① 问题描述**:R122 以「本机无 Maven」为由跳过后端全量,采信历史基线;实测 `D:\maven\apache-maven-3.6.1` + `D:\jdk1.8.0_25` 完全可用,本分钟即跑通 2865 例。
+- **② 测试 bug 点**:`docs/tdd/test/automation-run-2026-11-10-R122.md`「降级(未实测)」段(未做 `mvn -v` / `java -version` 探针即下结论)。
+- **③ 最优修改方案**:在自动化 prompt/SOP 中固定「环境探针前置」:每轮先执行 `java -version && mvn -v && df -h`,三项任一失败才允许降级,且降级必须贴探针输出。
+- **④ 修改目的**:杜绝「凭记忆判环境」导致整模块漏测(本轮已是第 4 次复发)。
+- **⑤ 闭环**:连续 3 轮报告均含探针输出且无「无 Maven」类降级 → 销号。
+
+### #9 TC 锚点口径不一致(B-124,度量)
+
+- **① 问题描述**:同一台账三种正则得三组数:严格 `57/333=17.1%`、宽松 `165/866=19.1%`、R118 口径 `86/812=10.6%`;无法跨轮比较。
+- **② 测试 bug 点**:`docs/tdd/tools/test_report_metrics.py`(无输出、口径未固化)与各轮报告手写正则。
+- **③ 最优修改方案**:把锚点定义为「测试代码中被引用的唯一 TC 编号 / 台账中定义的唯一 TC 编号」,正则写进脚本并输出 JSON,报告只引用脚本结果。
+- **④ 修改目的**:让 G9 可复算、可跨轮对比。
+- **⑤ 闭环**:连续 2 轮报告 G9 数值由脚本产出且一致。
+
+---
+
+## 9. 门禁结论
+
+| 门禁 | 判据 | 实测 | 结论 |
+|------|------|------|------|
+| G1 全量通过率 | ≥95% | **98.37%**(3444/3501) | ✅ |
+| G2 红例数 | ≤10 | **50**(后端 33 + 根级 16 + langgraph 1) | ❌ |
+| G3 前端 Jest | 0 红 | 423 过 / 0 红 / 3 skip | ✅ |
+| G4 管理端 Jest | 0 红 | 116/116 | ✅ |
+| G5 编译与完整性 | testCompile 0 错 + XML 无沉默 | 345 源 0 错;339/339 | ✅ |
+| G6 浏览器 | 28/28 | **28/28** | ✅ |
+| G7 langgraph | 0 红 | **1 红** | ❌ |
+| G8 鉴权契约 | 全 401 | 23/23(含 `/api/mind/**`) | ✅ |
+| G9 SRS 锚点 | ≥80% | 17.1%(严格)/ 19.1%(宽松) | ❌ |
+| G10 双节点派发 | 251 + 189 均实派 | 251 ✅ / 189 ⚠️(通道通、仓库陈旧不可承载) | ⚠️ 部分 |
+| G11 CI 含后端全量 | 存在 blocking 全量 | 无 | ❌ |
+| G12 用例入库 | 本轮有新增/更新 | 无 SRS 变更 → 不新增(合规) | ✅ |
+
+**总裁决:不通过(有条件)**
+
+- 阻塞放行的三项:**G2 50 红**、**G9 锚点 17.1%**、**G11 无 CI 全量**。
+- 相比 R118/R120:**G1 +0.31pp、G6 维持 28/28、G7 由 11 红降至 1 红、G8 由「mind 缺项」转为全绿、G10 由 0/2 转为 1/2**。
+- 放行建议:后端 98.71% 且鉴权契约全绿,可支撑**内网灰度**;不支撑对外正式发布,除非 G2 中 13 例 B 类产品红有明确结论。
+
+---
+
+## 10. 窗口内变更登记(SRS 闸门)
+
+| 检查项 | 结果 |
+|--------|------|
+| `docs/superpowers/specs` 200 份 | 窗口内 **零新增 / 零修改**(`find -newermt "2026-11-10 11:28"` 零命中;`git diff 730b7058a..HEAD` 该目录无输出) |
+| `docs/tdd/user-scenarios` 11 份 | 零变更 |
+| `docs/superpowers/api/API_REFERENCE.md` | 零变更 |
+| 代码侧变更 | 窗口内仅 `eeb147273`(langgraph 修复)与 `84239ce22`(`/api/mind/**` 鉴权)——**均为既有规格的实现落地,不产生新用例需求**,已由既有 pytest / 契约用例覆盖 |
+| 结论 | **不新写用例**;SRS→用例映射关系保持,缺口转 §6 G-123-7 |
+
+---
+
+## 11. 度量
+
+| 指标 | 值 |
+|------|----|
+| 测试类 / `@Test` / `@Disabled` | 339 / 2854 / 4 |
+| 控制器 / `@GetMapping` | 363 / **8(违 AGENTS.md)** |
+| SRS 规格 / 用例台账 | 200 / 14 |
+| 场景(`^## 场景`) | 198 |
+| TC(严格 `/TC-[A-Z]{1,3}-[A-Z]{1,2}-?\d{1,3}/`) | 333 |
+| TC(宽松,含引用) | 866 |
+| 可执行 TC 锚点(唯一,排 `generated`) | 165 |
+| 锚点率 | 17.1%(严格)/ 19.1%(宽松) |
+
+---
+
+## 12. 本轮方法论沉淀
+
+1. **远程 shell 派发失败要分三态查**:`401/000`(凭据/端口)→ `create 404 LocationNotFound`(工作目录不存在,如 189 的 `C:\cfc`)→ `create 200 但 output 空`(对象被回收)。本轮 189 的失败是**第二种**,而非历轮记的「鉴权门控」。
+2. **同节点重复建 shell 会杀掉在跑的进程**:首轮 251 pytest 跑到第 36 例即被后续 `tail` shell 打断(日志无 summary 且有 `DONE_0`)。正确做法是 `setsid nohup` 分离 + **本地 sleep 后一次性读文件**,读文件期间不得再建 shell。
+3. **`-q` 的进度点就是用例数**:`...F................................` 的字符数可用于判断「是否被截断」,比等 summary 更早发现异常终止。
+4. **判「节点能否承载浏览器任务」不能只看端口**:189 `4090` OPEN 且 shell 可建可读,但仓库停在 `feature/user-is-child @ e3e52ca38`、无 `node_modules`、无 `tests/e2e-live` → 能力缺失。必须先 `Test-Path tests\e2e-live; Test-Path node_modules` 再派发。
+5. **环境能力禁止凭记忆判定(第 4 次复发)**:每轮固定 `java -version && mvn -v && df -h` 探针,未跑探针不得写「降级」。

+ 174 - 0
docs/tdd/orchestration/report-test-2026-11-10T1128.md

@@ -0,0 +1,174 @@
+# 测试闭环报告 · 每小时(2026-11-10 11:28 GMT+8)
+
+> 主理人:陆谨(软件测试专家团 · 测试架构师)
+> 执行档:**review 档(内网 cfc.iwintrue.com 已授权 + 测试用例编写)**
+> 对象:d:/cfc(浠艾福 XAF 项目)
+
+## 元信息
+
+| 项 | 值 |
+|----|----|
+| 当前 HEAD | `8da3f0aa0`("测试负责人第120轮闭环汇报 3500/3432=98.06% 零漂移·B-120 销号") |
+| 上次本对象轮 | R117 @ 2026-11-10 06:27(`d52faa966`),间隔约 5 小时 |
+| 两轮间 commits | 34(均为 `docs(tdd)` 闭环汇报 + `chore auto bump` 版本号,无测试源码/需求变更) |
+| 网络约束 | 不访问外部公网;已授权内网 `cfc.iwintrue.com→192.168.16.251`(仅 `/admin`、`/frontend`) |
+| 敏感信息 | 无登录凭据(MACHINE_JSON_PATH 未注入);报告不写明文口令/令牌 |
+
+---
+
+## 1. 执行范围
+
+**离线实测(本地可用命令,已执行)**
+- cfc-web Jest 单元/组件测试(axios-mock-adapter mock API)
+- cfc-frontend Jest 单元/组件测试
+- cfc-backend 离线编译:`mvn -o test-compile`(main+test 源码,无需 DB)
+- 内网无登录 E2E 探针:`curl` 探活 `cfc.iwintrue.com/admin`、`/frontend`
+
+**降级(未实测,如实登记)**
+- cfc-backend 全量 `mvn test`(MySQL 3306 不可达 → 复用 R120 全量基线)
+- JaCoCo 覆盖率门禁(离线缺失)
+- 登录态 E2E 业务流(无凭据,MACHINE_JSON_PATH 未注入)
+- 安全测试 / 性能压测 / 依赖漏洞扫描(execute 档,公网未授权)
+- LangGraph `localhost:9000` 复验(需 AI 服务 + 凭据,未授权)
+
+**测试用例编写**:SRS 闸门闭合 → 跳过编写(零抖动,详见 §5)。
+
+---
+
+## 2. 用例总数 · 通过 · 失败(本小时实测)
+
+| 套件 | 套件数 | 总数 | 通过 | 失败 | 跳过 | 说明 |
+|------|-------|------|------|------|------|------|
+| cfc-web Jest | 17 | 116 | **116** | 0 | 0 | mock API,断言前端逻辑 |
+| cfc-frontend Jest | 26 | 426 | **423** | 0 | 3 | 含 TDD-RED 预期红已随实现转绿;3 跳为既有设计跳过 |
+| cfc-backend `test-compile` | — | — | GREEN | — | — | exit 0,离线编译 main+test 源码 |
+| 内网 E2E 探针(无登录) | 2 | 2 | 2 | 0 | 0 | /admin、/frontend 均 302 可达(登录墙) |
+| **合计(本小时可执行)** | 45 | 544 | **541** | **0** | 3 | 零失败 |
+
+**全量基线引用(R120 @ HEAD `8da3f0aa0`,零漂移)**:后端全量 3500 例 / 3432 通过 = **98.06%**(34 红、15 类差集空);其中后端 2864 例 / 2826 = 98.67%(34 红);登录态 E2E 28/28;根级 jest 7/23(16 红,B-36 装置红);浏览器 E2E 28 全绿;langgraph@251 44 例(43/32/11 零漂移)。
+
+---
+
+## 3. 覆盖率
+
+| 模块 | 语句 | 分支 | 函数 | 行 | 备注 |
+|------|------|------|------|----|------|
+| cfc-web Jest | 10.11% | 6.12% | 7.51% | 9.98% | 引用 R117/R118 基线(本小时未重跑 `--coverage`,可复现、持平) |
+| cfc-frontend Jest | — | — | — | — | 仅 Jest 通过率(426→423/0/3),无 JaCoCo 等价物 |
+| cfc-backend 全量 | — | — | — | — | JaCoCo 离线缺失(N/A),引用全量基线 98.06% |
+
+> 覆盖率度量缺口持续存在:前端/管理端 Jest 仅验证逻辑分支,未覆盖组件渲染与真实服务行为;后端 JaCoCo 因离线缺依赖无法产出,门禁阈值(≥80%)目前为 N/A。
+
+---
+
+## 4. 回归与闭环判定
+
+- **与 R117(06:27)逐项比对**:cfc-web 116/116 持平;cfc-frontend 423/0/3 持平;后端 `test-compile` GREEN 持平;内网探针 2/2 可达持平。**红例差集为空 → 零漂移,无新增失败、无新闭环。**
+- **34 commits 自 R117**:全部为 `docs(tdd)` 闭环汇报与 `chore auto bump` 版本号,无生产源码或需求文档变更 → 不影响测试结论。
+- **结论趋势**:自 R117→R118→R119→R120 连续 4 轮「有条件通过 / 零漂移」,本小时(R121)延续该稳态。
+
+---
+
+## 5. 测试用例编写产出
+
+- **触发判定(SRS 闸门)**:`find docs/tdd/SRS.md docs/需求分析 docs/superpowers/specs docs/superpowers/api/API_REFERENCE.md -newermt "2026-11-10 06:27"` → **零命中**;且 HEAD=`8da3f0aa0` 相对 R117 无需求/spec/接口文档新增或修改。
+- **执行结果**:**本次无需求变更,跳过测试用例编写**(避免在测试目录制造无谓提交、引发仓库抖动)。
+- 既有 E2E 资产(`tests/e2e/*.spec.js`、`tests/e2e-live/*.spec.js`)存在但依赖登录凭据,本小时未改动、未新增。
+- 若后续 SRS/需求变更,按规则仅写入 `**/__tests__/**` 或新建 E2E 目录,绝不触碰生产源码、不提交、不推送。
+
+---
+
+## 6. 五要素问题清单
+
+### 问题 P-9(持续·P2|离线约束缺口 · 复现本小时)
+① **问题描述**:cfc-frontend Jest 运行期间向公网 `https://cfc.etotem.com.cn/api/ai/chat/send` 发出真实 HTTP POST,并收到线上服务器返回 `code=46004 会员已过期`(本小时日志实证)。该套件声称 mock,但 AI 对话发送路径未被完全 mock。
+② **测试 bug 点**:`cfc-frontend/__tests__/api/api.test.js`(运行期经 `utils/api.js:323` success 处理真实响应);`uni.request` mock 未覆盖 chat send 分支。
+③ **最优修改方案**:在 jest `setupFiles` 全局 spy `uni.request` 永不触网;或对 AI 对话发送函数补 `axios-mock-adapter`/mock 实现;增加测试期网络守卫(任何对 `cfc.etotem.com.cn` 的真实请求直接 fail)。
+④ **修改目的**:满足「离线审查不访问外部公网」约束,避免测试副作用污染线上数据、保证结果可复现。
+⑤ **问题闭环方式与通过标准**:补 mock 后重跑 Jest,断言日志中不再出现 `POST https://cfc.etotem.com.cn`;CI 加网络护栏使越网请求直接失败。
+
+### 问题 P-1(持续·P1|装置红 B-36)
+① 根级 jest 7/23(16 红),属测试装置(setup)未就绪导致的预期红,非生产缺陷。
+② `根级 jest` 套件(16 例红)。
+③ 修复根级 jest 的全局 setup/teardown 与 mock 注入,使其达到与 cfc-web/cfc-frontend 一致的绿区。
+④ 消除装置红,使「真红 / 装置红」可区分,避免掩盖真实回归。
+⑤ 复测:根级 jest 16 红归零或明确标注为预期 RED;G2 装置红数 ≤18。
+
+### 问题 B-69(持续·P1|鉴权 O-21 未落码)
+① 线上匿名访问某接口返回 200(应为 401 拦截),多轮复证 `O-21` 尚未落码。
+② `/api/...`(O-21 相关路径)匿名 200。
+③ 将相关路径加入 `JwtInterceptor.LOGIN_REQUIRED_PATHS`(参照已闭环的 B-61 做法)。
+④ 关闭未授权匿名访问面,满足安全门禁。
+⑤ 复测:内网匿名 POST 该路径返回 401;E2E 鉴权契约 13/13 稳定。
+
+### 问题 C-1(持续·P1|覆盖率度量缺失)
+① 后端 JaCoCo、前端渲染覆盖率均缺失,门禁阈值(≥80%)为 N/A,无法量化真实覆盖。
+② 构建配置无 JaCoCo 离线包;前端无覆盖率采集。
+③ 引入 JaCoCo(离线缓存或用户授权联网下载),前端接入 `@vue/test-utils` + coverage;设定分级门禁。
+④ 使覆盖率可度量、可门禁,发现未覆盖路径。
+⑤ 复测:后端 JaCoCo ≥80% 且报告可产出;前端覆盖率门禁建立。
+
+### 问题 C-2(持续·P2|历史债)
+① `growth_records` 重复列、37 红类、`blank-key` 真缺陷(S-cfc-31)等历史债未在本次重测。
+② 相关 entity/Mapper 与 DDL。
+③ 按 AGENTS.md 迁移流程修复重复列;清除 37 红类;修复 blank-key 处理。
+④ 消除数据模型与代码历史债,提升健壮性。
+⑤ 复测:迁移幂等通过;37 红类归零;S-cfc-31 用例通过。
+
+### 问题 E-1(持续·P2|登录态 E2E 无凭据)
+① 现有 E2E 脚本需登录,但 `MACHINE_JSON_PATH` 未注入,业务流无法实跑。
+② `tests/e2e/*.spec.js` 鉴权业务流。
+③ 由用户通过环境变量/本地配置文件注入凭据(绝不写入提示词/报告/日志明文),经凭据注入后实跑。
+④ 验证真实登录态下的端到端业务路径。
+⑤ 复测:登录态 E2E 28/28 稳定通过。
+
+---
+
+## 7. 待核实项
+
+- 登录态 E2E 凭据(MACHINE_JSON_PATH 未注入)→ 业务流降级为测试设计。
+- 后端全量真实红类明细(MySQL 3306 本地不可达,未重跑;引用 R120 基线 98.06%)。
+- JaCoCo 覆盖率门禁(离线缺依赖,N/A)。
+- LangGraph `localhost:9000` 红类(需 AI 服务 + 凭据复验)。
+- `growth_records` 重复列 / 37 红类 / `blank-key` S-cfc-31 是否已在近期提交中修复(历史债,待源码级复核)。
+
+---
+
+## 8. 需用户单独授权才能继续的项(未授权未执行 · 附测试设计)
+
+| 维度 | 未执行原因 | 测试设计(降级产出) |
+|------|-----------|----------------------|
+| 安全测试(SAST/DAST/依赖漏洞) | execute 档,公网未授权 | 接入 Snyk/OWASP Dependency-Check + ZAP;范围:cfc-backend、cf-web、cfc-frontend;门禁:0 高危。待用户授权联网后执行。 |
+| 性能压测 | execute 档,公网/远端未授权 | 对 `/api/**` 关键路径做 JMeter/k6 基准(RPS、P95 延迟、错误率);需授权且目标环境可达。 |
+| 后端连库全量 `mvn test` | MySQL 3306 不可达 | 恢复 MySQL 后实跑 3500 例基线,核对 34 红归属;当前引用 R120=98.06%。 |
+| LangGraph 9000 复验 | 需 AI 服务 + 凭据 | POST `/api/...` 验证报告解析/画像;待服务可达且凭据注入。 |
+| JaCoCo 下载/配置 | 离线缺依赖 | 用户授权联网或本地缓存后引入,设定 ≥80% 门禁。 |
+
+---
+
+## 9. 门禁结论
+
+**结论:⛔ 不通过(有条件)—— 与 R117/R118/R119/R120 持平,连续 5 轮零漂移稳态。**
+
+- **绿区(本小时实测通过)**:cfc-web 116/116 全绿;cfc-frontend 423/0/3(无新增失败);后端 `test-compile` GREEN;内网探针 2/2 可达;全量基线 98.06% 零漂移。
+- **未放行原因(硬缺口)**:① 覆盖率门禁 N/A(JaCoCo 缺);② 后端全量 34 红未重测(MySQL DOWN);③ 安全/性能/依赖漏洞未授权未执行;④ P-9 离线外联仍实证;⑤ B-69 鉴权未落码;⑥ 登录态 E2E 无凭据未实跑。
+
+**复评条件(满足即转通过)**:
+1. 后端连库全量 `mvn test` 0 真红(装置红除外)且 JaCoCo ≥80% 可产出;
+2. 修 P-9:前端 Jest 不再触公网(加网络护栏);
+3. 修 B-69:相关路径匿名访问返回 401;
+4. 授权并实跑安全/性能/依赖漏洞扫描,0 高危;
+5. 登录态 E2E 凭据注入后 28/28 稳定通过;
+6. 历史债(重复列 / 37 红类 / blank-key S-cfc-31)归零。
+
+---
+
+## 历史审查记录(对照,不作本次结论依据)
+
+- 本对象历史:R117(06:27 不通过/有条件)→ R118/R119/R120(测试负责人第118~120轮,98.06% 零漂移,B-61/B-120 销号)→ **本小时 R121(11:28,延续稳态)**。
+- 持续遗留缺口:JaCoCo 覆盖率(N/A)、登录态 E2E 凭据、安全/性能/依赖(公网未授权)、P-9 离线外联、B-69 鉴权、历史债。
+- 本次为「每小时闭环」第 5 个连续零漂移轮次,**未实测项与历史一致,无新增未实测项**,故未扩展范围、未补跑全量、未安装依赖。
+
+---
+
+*产物:docs/tdd/orchestration/report-test-2026-11-10T1128.md(未提交、未推送、未改生产源码)。*

+ 87 - 0
docs/tdd/test/automation-run-2026-11-10-R123.md

@@ -0,0 +1,87 @@
+# 自动化执行记录 · 第 123 轮(2026-11-10 12:35~13:30)
+
+## 环境探针(本轮新增前置步骤,B-123 处置)
+
+```
+java version "1.8.0_25"           JAVA_HOME=D:\jdk1.8.0_25
+Apache Maven 3.6.1                Maven home: D:\maven\apache-maven-3.6.1
+D: 294G total, 93G avail (69%)
+```
+
+结论:**本机 Maven / JDK 完全可用**。R122「本机无 Maven」第 4 次误判被推翻。
+
+## 基线
+
+| 项 | 值 |
+|----|----|
+| 分支 | `cfclub` |
+| 起点 HEAD | `568cecac6` |
+| 收尾 HEAD | `568cecac6`(工作区仅 3 项未跟踪) |
+| 收尾远端 | `origin/cfclub = f93992fd2`(+3 提交,全为 docs / auto bump,零源码) |
+| 隔离树 | 未使用(工作区已跟踪文件 0 修改,直接在本工作区执行) |
+
+## 执行清单
+
+| 步骤 | 命令 | 结果 |
+|------|------|------|
+| 后端全量 | `mvn -o -B clean test` | 2865 例 / 2828 过 / 30F+3E+4S / 48:05 / XML 339-339 |
+| 管理端 | `cd cfc-web && npx jest --silent` | 17 套 / 116 例 / 116 过 / 25.8s |
+| 小程序 | `cd cfc-frontend && npx jest --silent` | 26 套 / 426 例 / 423 过 / 3 skip / 17.4s |
+| 根级 | `cd tests && npx jest --silent` | 3 套 / 23 例 / 7 过 / 16 红 / 11.0s |
+| 浏览器 live | `npx playwright test -c playwright.config.live.js --output=/d/cfc/_r123_pw_live` | **15/15** / 2.5m |
+| 浏览器 health | `npx playwright test -c playwright.config.health.js --output=/d/cfc/_r123_pw_health` | **13/13** / 7.2s |
+| langgraph@251 | `POST /api/shell?location[directory]=/sc-data/cfc/cfc-langgraph` | **42 过 / 1 红 / 344.83s** |
+| 线上鉴权 | `curl POST /api/mind/fortune`、`/api/energy/overview` | 均 401 |
+| 站点可达 | `curl /admin`、`/frontend` | 均 302(24ms / 21ms) |
+
+## 后端红例全清单(33)
+
+```
+EnergySystemFlowTest                         6  (5×expected 200 but 500 + 1 false)
+CfCommissionServiceSettleTest                8  (Wanted but not invoked)
+ArticleAutoTagServiceTest                    4  (execute 未命中)
+DimensionRegistryMapContractTest             3  (契约口径)
+GrowthRecordSyncFlowTest                     3  (1F + 2E)
+OrchestrationEngineTest                      1
+OrchestrationIntegrationTest                 1
+MembershipPaySwitchTest                      1
+PaymentServiceORDRoutingTest                 1
+UserServiceWechatLoginTest                   1
+UserServiceWechatLoginContractTest           1
+TeamProfitCronContractTest                   1
+TaskPlanServiceTest                          1
+GuideModuleIntegrationTest                   1  (platform_fee truncation)
+```
+
+红类集合对比 R118(34 红 / 15 类):**差集为空,仅少 1 例**——
+少的那例是 `MindFortuneControllerTest`,随 `/api/mind/**` 鉴权修复转绿。
+
+## 节点探活原始结果
+
+```
+189: 22 CLOSED / 4090 OPEN / 4096 CLOSED
+251: 9000 OPEN / 4096 OPEN / 22 OPEN
+204: 4090 CLOSED
+```
+
+189 shell 通道实证(Basic 认证通过):
+
+```
+POST http://192.168.16.189:4090/api/shell?location[directory]=C:\   -> 200
+hostname = Lenovo-y50        shell = powershell.EXE      (Windows 节点)
+C:\worktrees\cfc-user-is-child  branch=feature/user-is-child  HEAD=e3e52ca38
+Test-Path tests\e2e-live = False   Test-Path node_modules = False
+```
+
+→ 通道可用但**不具备执行浏览器套件的前置条件**,本轮未派发(B-122)。
+
+## 251 派发踩坑记录(本轮关键)
+
+- 第 1 次:`dispatch_shell.cjs` 默认 8s 轮询 → 每轮都新建 shell。pytest 跑到第 36 例(`...F................................`)被后续 shell 连带终止,日志无 summary、`DONE_0`。
+- 第 2 次:改 `setsid nohup ... > /tmp/r123b.log 2>&1 &` 分离进程,**本地 sleep 后只读 1 次文件** → 正常拿到 `1 failed, 42 passed in 344.83s`。
+- 结论:远程长任务的「kick + 本地等待 + 单次读取」是唯一稳定模式;轮询会杀进程。
+
+## 浏览器关键观测
+
+- `TC-A-U05`(R122 连续 2 次失败)本轮 **58.4s 通过**;`TC-A-U04` 10.2s 通过。
+- 全部 5 例 admin 用例首轮即绿,无重跑。

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

@@ -359,3 +359,19 @@
 | B-55-Update(第 122 轮 · 派发受阻延续) | `192.168.16.251` opencode 派发 langgraph 不可达 | 运维 | **延续(用户要求 langgraph 测试派发 251 未满足)**。`251:4090` → 000(CLOSED);`251:4096` → `UnauthorizedError`(鉴权门控);`251:9000` langgraph 服务 → 200 OPEN 但非 pytest runner。本轮 langgraph 测试以**本地 venv 兜底**重跑(验证 fix 有效),251 派发通道待运维注入 opencode 凭据后开通 | 测试负责人(第 122 轮探活) | 2026-11-10 12:10 | 待处理(P2) |
 | B-69-Close(第 122 轮 · **线上闭环销号**) | `/api/mind/**` 匿名可达(鉴权清单缺项) | 研发 | **销号(第 122 轮,连续 22 轮 P0 终落地)**。研发 `63cf7455a`/`84239ce22`(merge)将 4 端点移入 `JwtInterceptor.LOGIN_REQUIRED_PATHS` 强制登录;**本轮线上实测 `POST /api/mind/fortune` → 401** + `{"code":401,"message":"请先登录"}`,对照 `/api/energy/overview` 维持 401(机制正常)→ O-21 落码闭环 | 测试负责人(第 122 轮线上复验) | 2026-11-10 12:10 | **已闭环(销号)** |
 | B-36-Update(第 122 轮 · 第 25 轮零漂移) | 根级黑盒 23 例 16 红 | 测试 | **零漂移**。本轮实跑 23 例:7 绿 / 16 红(与 R121 逐项一致) | 测试负责人(第 122 轮实测) | 2026-11-10 12:10 | 待处理(P1) |
+
+<!-- ===== 第 123 轮(2026-11-10 13:30,本自动化)追加 ===== -->
+
+| B-55-Close(第 123 轮 · **销号**) | `192.168.16.251` opencode 派发 langgraph 不可达 | 运维 | **销号(第 123 轮,实派达成)**。根因是**派发器用法**而非鉴权门控:`POST /api/shell?location[directory]=/sc-data/cfc/cfc-langgraph` + Basic `opencode:****`(port 4096)→ 取 `data.id` → `GET /api/shell/{id}/output`。251 实派 pytest **43 例 / 42 过 / 1 红 / 344.83s**(节点 HEAD `568cecac6`),首次由 251 取回权威结果。R122「`251:4096` UnauthorizedError」为探针路径/凭据写法问题 | 测试负责人(第 123 轮实派) | 2026-11-10 13:30 | **已闭环(销号)** |
+| B-122(第 123 轮 · 新增) | `192.168.16.189` 通道可用但不具备浏览器执行前提 | 运维 | **新增(P2)**。189 为 **Windows 节点**(`hostname=Lenovo-y50`,shell=`powershell.EXE`),`4090` OPEN 且 Basic 认证通过、shell 可建可读;但仓库为 `C:\worktrees\cfc-user-is-child @ e3e52ca38`(分支 `feature/user-is-child`),`Test-Path tests\e2e-live = False`、`Test-Path node_modules = False` → 无法执行浏览器套件(禁止装依赖)。闭环判据:189 worktree 更新至 `cfclub` 且预置 `tests/node_modules` → 实派 `admin-desktop` 5/5 取回 | 测试负责人(第 123 轮探活实证) | 2026-11-10 13:30 | 待处理(P2,运维) |
+| B-123(第 123 轮 · 新增) | R122 以「本机无 Maven」降级致后端整模块漏测(第 4 次误判) | 测试 | **新增(P1 流程)**。实测 `D:\maven\apache-maven-3.6.1` + `D:\jdk1.8.0_25` 完全可用;本轮 `mvn -o -B clean test` 48:05 拿到 2865 例 / 98.71%。R122 未做探针即写「降级(未实测)」,采信历史基线。处置:SOP 前置 `java -version && mvn -v && df -h`,三项任一失败才允许降级且须贴探针输出。闭环判据:连续 3 轮报告含探针输出且无同类降级 | 测试负责人(第 123 轮推翻+补测) | 2026-11-10 13:30 | 处置中(P1) |
+| B-124(第 123 轮 · 新增) | TC 锚点度量口径不一致(三套正则三组数) | 测试 | **新增(P2 度量)**。同一台账得:严格 `57/333=17.1%`、宽松 `165/866=19.1%`、R118 口径 `86/812=10.6%`,跨轮不可比。`docs/tdd/tools/test_report_metrics.py` 实测**无 stdout 输出**,各轮报告手写正则。处置:锚点定义为「测试代码引用的唯一 TC 数 / 台账定义的唯一 TC 数」,正则入脚本并输出 JSON。闭环判据:连续 2 轮 G9 由脚本产出且一致 | 测试负责人(第 123 轮度量复算) | 2026-11-10 13:30 | 待处理(P2) |
+| B-125(第 123 轮 · 新增) | 远程 shell 轮询会杀掉在跑进程(派发器缺陷) | 测试 | **新增(P1 工具)**。`dispatch_shell.cjs` 默认 8s 轮询、每轮新建 shell;251 pytest 首轮跑到第 36 例(日志 `...F................................`)被后续 shell 连带终止,产出无 summary + `DONE_0`(伪成功)。处置:改 `setsid nohup ... > LOG 2>&1 &` 分离 + **本地 sleep 后单次读文件**(杀器即停)。闭环判据:`dispatch_shell.cjs` 改为「kick 分离 + 本地等待 + 单次读」并使 `-q` 进度点字符数 == 用例数 | 测试负责人(第 123 轮定位) | 2026-11-10 13:30 | 待处理(P1,工具) |
+| B-121-Update(第 123 轮 · 未复现,转观察) | 本机 `admin-desktop` TC-A-U05 登录前置确定性失败 | 研发/测试 | **未复现**。本轮本机同套件 **5/5 全绿**,U05 **58.4s 通过**、U04 10.2s 通过,首轮即绿无重跑。R122 记「确定性失败 2/2」过重 → 改判「节点偶发(滑块/风控时序)」。闭环判据:连续 2 轮 U05 绿 → 销号(本轮为第 0 轮绿,尚需 1 轮);若再红且 U04 同流程绿则转产品侧 | 测试负责人(第 123 轮实跑) | 2026-11-10 13:30 | 观察(P1→P2) |
+| B-74-Update(第 123 轮 · 收窄至 1 例) | langgraph `test_auto_tag.py` 红例 | 研发/运维 | **5 例 → 1 例**。251 实派仅 `test_auto_tag_content_relevance` 一例 `AssertionError`(依赖 LLM 语义相关性判定),其余 4 例随 `eeb147273` 转绿。建议:主断言改确定性桩 + 另设 `@pytest.mark.llm` 真实链路冒烟(允许 skip);251 `.venv` 装 `pytest-timeout` 防挂起 | 测试负责人(第 123 轮 251 实派) | 2026-11-10 13:30 | 待处理(P1) |
+| B-65-Close(第 123 轮 · 独立复核) | langgraph analyze checkpointer 缺 thread_id | 研发 | **销号成立(251 实派独立复核)**。R122 以本地 venv 判绿,本轮由 251 节点实派复核:`test_analyze` 2 例**不在失败清单**。双通道一致,销号无异议 | 测试负责人(第 123 轮 251 实派) | 2026-11-10 13:30 | **已闭环(销号)** |
+| B-82-Close(第 123 轮 · 独立复核) | langgraph `test_intent.py` 4 例静默降级 | 研发 | **销号成立(251 实派独立复核)**。`test_intent` 4 例**不在失败清单**;251 全量仅 1 红 | 测试负责人(第 123 轮 251 实派) | 2026-11-10 13:30 | **已闭环(销号)** |
+| B-69-Update(第 123 轮 · 双通道复核) | `/api/mind/**` 匿名可达 | 研发 | **维持销号**。线上匿名单 `POST /api/mind/fortune` → **401**(0.035s),对照 `/api/energy/overview` → 401;并且后端全量 `MindFortuneControllerTest` **本轮不在红类清单**(R118 为 1 红)→ 生产与单测两侧同时成立 | 测试负责人(第 123 轮线上+后端双证) | 2026-11-10 13:30 | **已闭环(销号)** |
+| B-36-Update(第 123 轮 · 第 26 轮零漂移) | 根级黑盒 23 例 16 红 | 测试 | **零漂移**。本轮实跑 23 例:7 绿 / 16 红(`ECONNREFUSED`,9082 未启动) | 测试负责人(第 123 轮实测) | 2026-11-10 13:30 | 待处理(P1) |
+| B-13-Update(第 123 轮 · 首次实跑) | 3 类硬编码 `127.0.0.1:3306` 的 `@SpringBootTest` | 研发/环境 | 后端全量实跑 339 类,**环境型红 0**(`AdminFamilyOverviewControllerTest` 3/3 绿);硬编码仍在,换机即复现 | 测试负责人(第 123 轮实测) | 2026-11-10 13:30 | 观察(P2) |
+| B-95-Update(第 123 轮 · 延续失联) | `192.168.16.204` 节点失联 | 运维 | 延续失联。本轮浏览器任务由本机承担(单节点单任务合规) | 测试负责人(第 123 轮探活) | 2026-11-10 13:30 | 待处理(P2) |

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

@@ -0,0 +1,100 @@
+# 研发交接通知 · 第 123 轮(2026-11-10 13:30)
+
+> 测试负责人(陆谨 · 软件测试专家团)|对象 `d:/cfc`|基线 `cfclub @ 568cecac6`
+> 全量 **3501 例 / 3444 过 = 98.37%**(红 50 / skip 7)|门禁 **不通过(有条件)**
+
+---
+
+## 一、本轮需要研发动作的 5 件事(按优先级)
+
+### 1. B-121 已自行转绿,但请确认登录链路无隐患(P1→观察)
+
+R122 记录的 `admin` `TC-A-U05` 确定性失败 2/2,本轮**同机同套件 5/5 全绿**(U05 58.4s,U04 10.2s)。
+
+判读:更可能是滑块/风控时序偶发,而非产品回归。**但 R122 是 2/2 必现,属于异常强的偶发**,请研发确认 11:40~12:30 之间 `/api/admin-auth/login` 侧是否有风控/限流调整或滚动重启。若确认无变更,测试侧按偶发处理,连续 2 轮绿即销号。
+
+### 2. `platform_fee` 列溢出(P1,第 12 轮)
+
+`GuideModuleIntegrationTest::testGuidePackageCreationFlow` 写库失败:
+
+```
+MysqlDataTruncation: Data truncation: Out of range value for column 'platform_fee' at row 1
+```
+
+请确认 `guide_order.platform_fee` 的列类型与业务上限。若业务金额合法 → 需扩列(DDL 走 `DatabaseInitializer.runMigrations()` + 同步 `schema.sql` + 递增迁移编号);若造数超界 → 测试侧修造数。**这是真实大额订单会踩的坑**。
+
+### 3. `DimensionRegistryMap` 契约 3 例悬空未决(P1,第 8 轮)
+
+```
+map_unknownLegacy_returnsNullData   expected null, actual "unknown_legacy_xyz"
+map_emptyLegacy_returnsNullData     expected null, actual ""
+map_missingLegacy_returnsBadRequest expected 400,  actual 200
+```
+
+需要产品/研发对「未知 legacy 键」语义**单向拍板**(回 null 还是原样回传;缺失键是否 400),拍板后测试侧按条款改断言,不再双向扯。
+
+### 4. B 类产品红 13 例(P0 候选)
+
+| 类 | 例数 | 现象 | 建议 |
+|----|------|------|------|
+| `EnergySystemFlowTest` | 6 | 5 例 `expected 200 but was 500`,1 例断言 false | 最需优先:能量系统在生产会直接 5xx,请抓服务端堆栈 |
+| `TeamProfitCronContractTest` | 1 | 冷静期退款后 `cancelled=0`,资金仍待发 | 核对 §8.2 实现 |
+| `OrchestrationEngineTest` / `OrchestrationIntegrationTest` | 2 | `"manual_fail"` 为 null / 状态 `failed` 不在允许集 | 编排失败态语义 |
+| `MembershipPaySwitchTest` | 1 | `configMissing` 时仍返回订单对象(期望 null) | 开关兜底 |
+| `PaymentServiceORDRoutingTest` | 1 | 未知前缀回调 `FAIL`(期望 `SUCCESS`) | 路由兜底 |
+| `UserServiceWechatLoginTest` / `...ContractTest` | 2 | 首次登录未返回 token(`expected jwt-token-1, was null`) | 疑 mock 桩缺失,也可能是产品分支回归,需确认 |
+
+> 说明:上表 3 类(MembershipPay / PaymentORD / WechatLogin)**兼具装置与产品两种可能**,测试侧会在下一轮先做定向复跑再定性,请暂不必立即改代码。
+
+### 5. 规范项:`@GetMapping` 仍有 8 处(P2,长期)
+
+`AGENTS.md` 要求「统一 `@PostMapping`,禁止 `@GetMapping/@PutMapping/@DeleteMapping`」。本轮实测仍 **8 处**。不影响功能,但违反项目约定,建议清理。
+
+---
+
+## 二、已闭环 / 已改善(供研发确认)
+
+| 编号 | 内容 | 本轮证据 |
+|------|------|---------|
+| **B-55** | 251 节点派发通道 | **首次由 251 实派取回 pytest 结果**(43 例 / 42 过 / 1 红 / 344.83s)。长期记的「鉴权门控」是误判,实为需要 `POST /api/shell?location[directory]=` |
+| **B-65** | langgraph analyze checkpointer | 251 实派 `test_analyze` 2 例**全绿**,独立复核 R122 销号成立 |
+| **B-82** | langgraph intent 静默降级 | 251 实派 `test_intent` 4 例**全绿** |
+| **B-74** | langgraph auto_tag 5 例 | **收窄至 1 例**(`test_auto_tag_content_relevance`,LLM 语义相关) |
+| **B-69** | `/api/mind/**` 匿名可达 | 线上 401 + 后端 `MindFortuneControllerTest` 转绿,**双通道一致** |
+
+---
+
+## 三、本轮新增处置项(测试侧自办,不需研发)
+
+| 编号 | 内容 | 处置 |
+|------|------|------|
+| **B-122** | 189 节点不能承载浏览器任务 | 4090 通道可用,但仓库停在 `feature/user-is-child @ e3e52ca38`、无 `tests/e2e-live`、无 `node_modules` → 本轮浏览器任务全由本机承担。请运维把 189 的 worktree 更新到 `cfclub` 并预置 `tests/node_modules`(**不需要研发动代码**) |
+| **B-123** | 环境能力探针缺失致整模块漏测 | 已在本轮 SOP 前置 `java -version && mvn -v && df -h`;R122 的「无 Maven」降级不再成立,后端全量 98.71% 已补回 |
+| **B-124** | TC 锚点口径三种不一致 | 拟固化到 `test_report_metrics.py` 输出 JSON,报告只引用脚本结果 |
+
+---
+
+## 四、门禁与放行建议
+
+| 门禁 | 实测 | 结论 |
+|------|------|------|
+| G1 全量通过率 | 98.37% | ✅ |
+| G2 红例数 | 50 | ❌ |
+| G3 前端 / G4 管理端 | 423 / 116 | ✅ |
+| G5 编译完整性 | 345 源 0 错、XML 339/339 | ✅ |
+| G6 浏览器 | 28/28 | ✅ |
+| G7 langgraph | 1 红 | ❌ |
+| G8 鉴权契约 | 23/23 全 401 | ✅ |
+| G9 SRS 锚点 | 17.1% | ❌ |
+| G10 双节点派发 | 251 ✅ / 189 ⚠️ | 部分 |
+| G11 CI 后端全量 | 无 | ❌ |
+
+**建议**:后端 98.71% + 鉴权全绿 + 浏览器 28/28,**可支撑内网灰度**;对外发布建议先清掉 `EnergySystem` 6 例与 `platform_fee` 1 例。
+
+---
+
+## 五、附
+
+- 完整报告:`docs/tdd/orchestration/report-test-2026-11-10-R123.md`
+- 执行明细:`docs/tdd/test/automation-run-2026-11-10-R123.md`
+- 阻塞台账:`docs/tdd/test/blockers.md`(第 123 轮段)