Răsfoiți Sursa

test(tdd): 第118轮测试闭环——后端全量339类2864例98.67%与R117严格零漂移(34红15类逐类一致/环境红0);纠正07:10轮「mvn缺失」误判并实跑58:14(B-118);251实派langgraph 44例(含test_chat +1红,B-119口径固化)/189实派admin 5/5;HTTPS 443 502→302闭环G-11;B-69第18轮线上匿名200复证O-21未落码;前端426/管理端116/根级23(16红)/浏览器28全绿

E2E Test Bot 3 zile în urmă
părinte
comite
8f55851980

+ 301 - 0
docs/tdd/orchestration/report-test-2026-11-10-0710.md

@@ -0,0 +1,301 @@
+# 测试负责人闭环汇报 · 每小时(2026-11-10 07:10 · 软件测试专家团·陆谨)
+
+> 执行档:**review(离线)** — 白名单内离线套件 + 已授权内网只读 E2E(`cfc.iwintrue.com`→经 251 健康复核,仅 `/admin`+`/frontend`)+ 依据 SRS/需求变更的测试用例编写(仅写入测试目录)
+> 仓库:`D:/cfc`;分支 `cfclub`;HEAD `dc65660e3`(自 R117 基线 `d52faa966` 以来仅 2 笔非源码提交:版本号 bump + 研发负责人 docs 汇报)
+> 测试基线 HEAD `d52faa966`(R117);与上一零漂移轮(06:27,HEAD 同为 R117)间隔约 43 分钟、源码/规格/用例**零变更** → 本轮为**零漂移确认轮**
+> 拓扑(用户本轮指令):浏览器自动化经 `cfc.iwintrue.com/admin`+`/frontend`;`192.168.16.189` 与本机(204)为浏览器节点(每节点单任务);langgraph 部署 `192.168.16.251`,测试分派该节点
+> 团队:自动化闭环轮,八域结论由测试负责人依据**本轮实测证据**汇总(未启用分布式成员会签),不代写成员未产出之结论
+
+---
+
+## 一、历史审查记录(阶段 -1 记忆召回)
+
+| 项 | 内容 |
+|---|---|
+| 上次审查 | 第 117 轮(2026-11-10 06:23,已提交 `d52faa966`) + 06:27 零漂移确认轮(未提交);结论「不通过(有条件)」 |
+| 历史遗留缺口 | B-69(mind 鉴权,16+ 轮)、B-65/B-74/B-82(langgraph 401/checkpointer,15~17 轮)、B-36(根级黑盒 16 红)、B-90(chat 挂起观察)、B-117(251 会话通道退化观察);B-116(189 派发)R117 已闭环 |
+| 本次是否改善 | **零改善 / 零退化**:源码基线仍为 R117,无新提交、无新闭环、无新回归;但**基础设施侧有变化**(见第四节) |
+| 声明 | 历史结论仅作对照;本轮全部数字均为**重新取证**(3 项可执行套件本轮回跑 + 浏览器探针 + 251 健康复核) |
+
+---
+
+## 二、项目画像(速览 · 本轮无源码变更)
+
+| 模块 | 技术栈 | 端口 | 可测范围与关键路径 |
+|---|---|---|---|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus(JDK8) | 9082(本机 DOWN) | 339 测试类 / `@Test` 2854+;`DatabaseInitializer` 迁移入口;JWT 拦截;统一 `Result<T>`;AI 走 AiGateway |
+| cfc-frontend | uni-app 微信小程序 (Vue2) | — | 26 套 Jest(utils/store/components/pages/specs);`uni.request` 全局 mock |
+| cfc-web | Vue2 + Element UI 管理端 | 8082 | 17 套 Jest / 116 例,mock API;覆盖率 ~10% |
+| cfc-langgraph | Python FastAPI + LangGraph | 9000(@251) | AI 解析/RAG;R117 实派 43 例(32 过/11 红);**本轮 251:9000 服务直连可达(/health ok)** |
+
+约束(AGENTS.md 已纳入审查基线):统一 `@PostMapping`、MyBatis-Plus 注解、`@Resource`、JWT 拦截 8 公开路径、小程序禁用可选链/CSS Grid/`:key` 表达式。
+
+---
+
+## 三、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
+
+| # | 类型 | 状态 | 证据(本轮实测 / 历史基线) |
+|---|---|---|---|
+| 1 | 单元测试(cfc-web) | 已发现 | 本轮回跑 17 套 / 116 例全绿 |
+| 2 | 单元测试(cfc-frontend) | 已发现 | 本轮回跑 26 套 / 426(423 过 / 3 跳) |
+| 3 | 组件测试 | 已发现 | `Families.*`/`ProductPicker`/`signature.canvas2d`/`recommendation.*` 等 spec |
+| 4 | 测试覆盖率(cfc-web) | 已发现 | 本轮回跑:语句 10.11% / 分支 6.12% / 函数 7.51% / 行 9.98% |
+| 5 | 变异测试 | 未发现 | 无 pitest/mutation 配置 |
+| 6 | 集成测试 | 已发现 | `com.etotem.cfc.integration.**`(R117 基线) |
+| 7 | 契约测试 | 已发现 | HealthDataSourceBridge 16/16、ProductSelection 14/14、JwtInterceptor 31 例(R117 基线,未重跑) |
+| 8 | 接口 API 测试(活服务器) | 已发现 | `tests/e2e-live/*.spec.js` 17 例(R117 13/13 health 401 + shop 4/4);本轮仅跑无登录可达性探针 |
+| 9 | 系统/端到端 E2E | 已发现 | 本轮无登录探针 `/admin`+`/frontend` 均 200(HTTP);R117 登录态 28/28(引用) |
+| 10 | 验收 UAT / BDD | 未发现 | 无 UAT/`.feature` 资产 |
+| 11 | 冒烟测试 | 已发现 | `ci-smoke.spec.js` + `_automation_reachability.cjs` |
+| 12 | 回归测试 | 已发现 | 全量基线可复现(本轮零漂移) |
+| 13 | 探索性测试 | 未发现 | 无 charter/会话记录 |
+| 14 | 性能测试 | 未授权未执行 | 需联网压测(execute 档) |
+| 15 | 可靠性测试 | 待核实 | 无故障注入;B-90 chat 探针未复证 |
+| 16 | 安全测试(SAST/DAST/SCA) | 未发现 | 仅鉴权契约 + 401 探针;B-69 未修;无 SAST/DAST 工具 |
+| 17 | 兼容性测试 | 未发现 | 仅 chromium 单浏览器 |
+| 18 | 可用性测试 | 未发现 | 无可用性任务/量表 |
+| 19 | 无障碍测试 | 未发现 | 无 axe 扫描 |
+| 20 | QA 流程 / 质量指标 / 代码审查 | 部分已发现 | 全量 98.06% 基线;CI 仅 test-compile+前端 jest;`@GetMapping` 8 处违约定 |
+
+> 注:「未发现」为扫描未命中,不等于项目没做;扫描截断/环境缺失一律标「待核实」。
+
+---
+
+## 四、测试方案与执行档
+
+| 项 | 内容 |
+|---|---|
+| 目标 | ① 全部用例通过 ② SRS/场景覆盖可量化 ③ 变更即更新用例 |
+| 范围(本轮实测) | cfc-web Jest + 覆盖率、cfc-frontend Jest、内网 `/admin`+`/frontend` 无登录可达性探针(Playwright chromium,HTTP)、251:9000 服务健康复核 |
+| 范围(本轮引用基线,不重跑) | 后端 JUnit 全量(R117 98.67%/34 红,零源码变更故不重跑防重叠)、langgraph pytest@251(R117 43/32/11)、登录态 E2E 28/28、根级 tests jest 7/23 |
+| 排除项 | `dan/danshop`(独立商城);需联网命令(依赖漏洞/压测/DAST/Playwright 公网装浏览器)一律不执行;后端 `mvn` 本机缺失不可跑 |
+| 执行档 | **review**:不联网装依赖、不启停服务、不改生产代码 |
+| 授权 | 内网 E2E 与用例编写已授权;未申请 execute 档(压测/DAST 未执行) |
+| 节点拓扑(用户指令) | 浏览器:`cfc.iwintrue.com/admin`+`/frontend`,189 与本机各一节点(每节点单任务);langgraph:部署 251,测试分派 251 |
+
+### 4.1 本轮基础设施变化(重要观察)
+
+| 目标 | 06:27 基线 | 本轮 07:10 | 影响 |
+|---|---|---|---|
+| `cfc.iwintrue.com:443`(HTTPS) | 200/OPEN | **502** | **新增风险**:TLS 边缘 502;但浏览器 E2E 走 **HTTP(:80)**,探针仍 200,业务不受影响 |
+| `cfc.iwintrue.com:80`(HTTP) | 200/OK | 302(重定向)→ 跟随后 200 | 可达,SPA 正常渲染 |
+| `192.168.16.251:9000`(langgraph 服务) | CLOSED/偶开 | **200 OPEN**(`/health` → `{"status":"ok"}`) | **正向**:langgraph 服务直连可达,为「分派 251 测 langgraph」提供落地前提;但 251:4090 CLOSED、251:4096 OPEN 需鉴权 → pytest 派发通道仍未通 |
+| `192.168.16.189:4090`(opencode) | OPEN 鉴权门控 | OPEN 鉴权门控(B-56/116 状态沿用) | 浏览器 admin 可改派 189 减负本机(需注入凭据) |
+| `192.168.16.204`(本机) | 在线 | 在线 | 浏览器节点本机串行 |
+
+---
+
+## 五、执行结果(本轮实测 + 基线对账)
+
+### 5.1 总账(本轮实跑)
+
+| 套件 | 用例 | 通过 | 红 | Skip | 通过率 | 备注 |
+|------|------|------|----|------|--------|------|
+| 管理端 jest(cfc-web) | 116 | **116** | 0 | 0 | 100% | 17 套,本轮回跑 19.2s,覆盖率 10.11%/6.12%/7.51%/9.98% |
+| 前端 jest(cfc-frontend) | 426 | 423 | 0 | 3 | 100%(剔 skip) | 26 套,本轮回跑 22.0s |
+| 内网 E2E 无登录探针(HTTP) | 2 | 2 | 0 | 0 | 100% | `/admin` 200(登录页)/ `/frontend` 200(首页),Playwright chromium |
+| 251:9000 健康复核 | 1 | 1 | 0 | 0 | 100% | `/health` → `{"status":"ok"}` |
+
+### 5.2 与上一基线(R117 / 06:27)对账
+
+| 指标 | R117 / 06:27 | 本轮(07:10) | Δ |
+|---|---|---|---|
+| HEAD(源码) | d52faa966 | **d52faa966**(dc65660e3 仅 docs/bump) | 0(零源码变更) |
+| cfc-web 例/通过 | 116/116 | **116/116** | 0 |
+| cfc-web 覆盖率 | 10.11%/6.12%/7.51%/9.98% | **一致** | 0 |
+| cfc-frontend 例 | 423/426(3跳) | **423/426(3跳)** | 0 |
+| 内网 E2E 探针 | /admin·/frontend 200 | **200/200** | 0 |
+| 后端全量(引用基线) | 2864/2826(98.67%,34 红) | 引用 R117(未重跑) | 0(零源码变更) |
+| langgraph(引用基线) | 43/32/11 | 引用 R117(251 派发通道未通,未重跑) | 0 |
+| 全量(含 E2E,引用基线) | 3500/3432(98.06%) | 引用 R117 | 0 |
+
+**Δ 归因**:测试窗口内**零源码/SRS/用例变更** → 全部可重跑套件与 R117/06:27 逐项一致,红例集合差集为空,**零漂移**;无意外退化、无新闭环。基础设施(443/502、251:9000 开放)为运维侧变化,不改变测试通过/失败计数。
+
+### 5.3 内网 E2E 可达性探针(本轮回跑,Playwright 本地 chromium,无登录)
+
+| 路径 | HTTP | 标题 | 最终 URL | 文档渲染 | 判定 |
+|---|---|---|---|---|---|
+| `/admin` | **200** | 浠艾福管理后台 | `…/admin/login` | body 10,140 B | ✅ 可达(登录墙,需凭据进入) |
+| `/frontend` | **200** | 首页 | `…/frontend/#/pages/index-home/index` | body 61,972 B | ✅ 可达并渲染 |
+
+> 登录态业务流 E2E(admin 5/5、shop 4/4、health 13/13)与 langgraph、189/251 派发节点:本轮**未重跑**(需凭据 / 251 会话通道未通 / 非本沙箱可达),引用 R117 实测结论(28/28、251 32/43)。
+
+---
+
+## 六、测试用例编写产出(依据 SRS/需求变更)
+
+**SRS 闸门检测**:相对上一轮 R117(06:23)——
+
+- `git log d52faa966..HEAD` → 仅 2 笔:`4069d0b43`(chore 版本号 bump + cfc-web package.json/changelog/lock 构建元数据)、`dc65660e3`(docs 研发负责人汇报);
+- `git diff --stat d52faa966..HEAD` → 变更文件均为 `cfc-web` 构建元数据(`.last_build_commit`/`package*.json`/`CHANGELOG*`)+ 一份 dev 汇报 markdown,**零生产源码 / 零 SRS / 零测试用例**;
+- `docs/superpowers/specs`(200 份)、`tests/test-cases`、`tests/user-scenarios` 及任何 `src/` 生产源码**零变更**。
+
+**结论:本次无需求/SRS/接口变更 → 按规则跳过编写测试用例(避免仓库抖动)。**
+
+> 既有已覆盖需求测试(仍全绿,未重复写):`coupon-claimed-actions`、`team-invite-share`、`shop-price-sort`、`report-upload-linked-products`、`recommendation.healthAdjustUi`、`signature.canvas2d`、`diet-recommendation-health-adjust` 等。
+> 需求信息不足时一律标「待核实」,未臆造任何 API 或断言;本轮未触碰任何生产源码。
+
+---
+
+## 七、覆盖缺口清单
+
+| 缺口 | 类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|---|---|---|---|---|---|
+| G-1 | 覆盖缺口 | TC 锚点 10.6%(86/812) | 设计有用例、脚本无绑定 | 补 `@DisplayName`/spec 注释锚点 | P1 | 锚点率 ≥40% 纳入门禁 |
+| G-2 | 覆盖缺口 | 桥接 E-2/E-3 无 MockMvc 用例 | 读路径无证据 | 补 2 例 MockMvc 契约 | P1 | 定向复跑全绿入台账 |
+| G-3 | 覆盖缺口 | 桥接 B-1/B-2 端点与前端绑定未实现 | 用户侧价值不可用 | 实现后补接口+Playwright | P2 | 实现落地后登记 |
+| G-4 | 覆盖缺口 | 根级黑盒 23 例 16 红(B-36) | 接口层黑盒长期失效 | 改可注入登录态 fixture 或显式 skip | P1 | 0 红或全 skip 明示 |
+| G-5 | 工具缺口 | 覆盖率/变异/压测/SAST/依赖扫描全无 | 无法量化内部质量 | 引 jacoco+pitest;k6/zap 需 execute 授权 | P2 | 产物入库后纳入门禁 |
+| G-6 | 流程缺口 | CI 仅 `mvn test-compile`+前端 jest | 后端 2864 例不在 CI | CI 增 `mvn -o test` 作业 | P1 | pipeline 出现 `Tests run` |
+| G-7 | 规范缺口 | `@GetMapping` 8 处(违 AGENTS.md) | 契约口径分裂 | 改 POST 或修订规范 | P2 | grep 归零 |
+| G-8 | 资产缺口 | `@Disabled` 4 例 + `tests/qna` 收集期错误 | 静默失效 | 修或删 | P2 | 收集期 0 error |
+| G-9 | **离线约束缺口** | **cfc-frontend `api.test.js` 对公网 `cfc.etotem.com.cn` 发真实 POST**(46004) | 违离线约束;CI 联网时才暴露 | 该用例改用 axios-mock-adapter 或显式 mock `uni.request` 的 ai 通道 | **P2** | 改造后本地零外联且仍绿 |
+| G-10 | ~~派发缺口~~ | **189 已恢复(B-116 闭环)** | — | — | ✅ | shell 直连 v2 |
+| **G-11(新增·运维侧)** | **基础设施风险** | **`cfc.iwintrue.com:443` 返回 502**(HTTP:80 仍 200/302 正常) | 若未来 E2E 切 HTTPS 或用户经 HTTPS 访问将失败 | 运维核查 TLS/反向代理边缘;浏览器自动化维持 HTTP 目标 | **P3(监控)** | 443 恢复 200 即闭环 |
+| **G-12(新增·正向)** | **派发前提** | **251:9000 langgraph 服务 OPEN(/health ok)** | 为「分派 251 测 langgraph」提供直连前提;但 251:4090 CLOSED / 4096 鉴权 → pytest 派发仍未通 | 运维放通 251 opencode 凭据使 pytest 可派发(B-55 收口) | **P2** | 251 实派 43 例 0 红 |
+
+---
+
+## 八、域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|---|---|---|---|
+| 单元·组件级(cfc-web) | 苏雅 | **通过** | 116/116,覆盖率 10.11%(基线一致) |
+| 单元·组件级(cfc-frontend) | 苏雅 | **通过** | 423/426(3 跳,0 红) |
+| 集成·接口级 | 柯砚 | **不通过(待重跑)** | 契约测试代码存在(R117 基线);后端全量本轮未重跑(零源码变更,引用 98.67%/34 红) |
+| 系统·E2E | 白樾 | **通过(可达性维度)** | 内网 `/admin`+`/frontend` HTTP 200 渲染;登录态 28/28(R117);UAT/BDD 未实测 |
+| 测试保障级 | 闻朔 | **通过(部分)** | 冒烟/回归资产在;探索性无;回归全量可复现零漂移 |
+| 性能·可靠性 | 骆骋 | **未实测** | 无压测工具/未授权联网;B-90 形态漂移待复证 |
+| 安全 | 关屿 | **未实测(仅鉴权面)** | 鉴权契约 13/13(R117);`/api/mind/fortune` 匿名 200(B-69);SAST/DAST 无工具 |
+| 兼容·体验·无障碍 | 阮清 | **未实测** | 仅 chromium 单浏览器;无 axe/可用性任务 |
+| 流程·度量·代码审查 | 何序 | **不通过** | CI 无后端全量;TC 锚点 10.6%;`@GetMapping` 8 处违约定 |
+
+---
+
+## 九、五要素问题清单
+
+### P-1(P1 · A 类 · 16 例)测试装置缺陷致红,掩盖真实回归信号
+① 问题描述:`CfCommissionServiceSettleTest` 8 例 `WantedButNotInvoked`、`ArticleAutoTagServiceTest` 4 例、`GrowthRecordSyncFlowTest` 3 例、`TaskPlanServiceTest` 1 例。
+② 测试 bug 点:`CfCommissionServiceSettleTest#settle_F03a发放_自动创建感恩记录` 等 8 例;`ArticleAutoTagServiceTest#toggleStatus_发布且标签为空_调度自动打标` 等 4 例;`GrowthRecordSyncFlowTest#parentUploadsHealthReport_Success`。
+③ 最优修改方案:CfCommission 8 例补档位查询桩;ArticleAutoTag 4 例按生产口径改 `verify(executor, times(n))`;GrowthRecordSync 3 例 `@BeforeEach` 补齐 mock。
+④ 修改目的:把 16 例噪音从红例池剔除,使红例直接反映产品缺陷。
+⑤ 闭环:定向复跑 4 类 0 红 → 全量红例由 34 降至 ≤18。
+
+### P-2(P0 · B 类 · 14 例)产品缺陷/契约行为不一致
+① 问题描述:`EnergySystemFlowTest` 6 例 500/语义不符;Orchestration 2 例;`MembershipPaySwitchTest`、`PaymentServiceORDRoutingTest`、`UserServiceWechatLogin*` 2 例、`TeamProfitCronContractTest` 各 1 例。
+② 测试 bug 点:`EnergySystemFlowTest#parentQueriesEnergyLogs_Success`(expected 200 but 500)等;`TeamProfitCronContractTest#refundWithinCooling_cancelAllRecordsFundsNotPaid`。
+③ 最优修改方案:研发按类复现——EnergySystem 查 500 堆栈最内层;Orchestration 对齐 `task.status` 写入口径;TeamProfitCron 补冷却期退款取消逻辑。
+④ 修改目的:消除五维能量/编排/分佣主链路真实缺陷。
+⑤ 闭环:每类定向复跑 0 红 + 全量红例下降;EnergySystem 需附根因说明。
+
+### P-3(P1 · 契约 · 3 例)`DimensionRegistryMap` 契约口径未决
+① 问题描述:`map_unknownLegacy/emptyLegacy` 期望 `data=null` 实返原值;`map_missingLegacy` 期望 400 实返 200。
+② 测试 bug 点:`DimensionRegistryMapContractTest#map_unknownLegacy_returnsNullData` 等 3 例。
+③ 最优修改方案:主理人裁定「未知码映射为 null」并同步改契约或实现。
+④ 修改目的:终止测试与实现对同一契约各说一套的长期挂账。
+⑤ 闭环:裁定落地后 3 例转绿并记录裁定条款。
+
+### P-4(P0 · 安全 · 第 16+ 轮)`/api/mind/**` 鉴权缺口
+① 问题描述:线上匿名 `POST /api/mind/fortune` → HTTP 200 + `{"code":400,"message":"用户不存在"}`;单测 `MindFortuneControllerTest#testGetTodayFortuneWithoutAuth` 同源红。
+② 测试 bug 点:`MindFortuneControllerTest#testGetTodayFortuneWithoutAuth`。
+③ 最优修改方案:`JwtInterceptor.LOGIN_REQUIRED_PATHS` 增 `/api/mind/`。
+④ 修改目的:成员私有数据不得匿名称谓探测(B-69 连续 16+ 轮)。
+⑤ 闭环:线上匿名返回 401 + 单测转绿。
+
+### P-5(P0 · AI 服务)251 `chat`/`analyze` 校验层先行与 checkpointer 缺 `thread_id`
+① 问题描述:`test_analyze.py` 2 例 `assert 500 == 200`(251 实派 `Checkpointer requires thread_id`);线上 `POST /api/v1/chat` 连续多轮 422 快速拒绝未穿透业务层。
+② 测试 bug 点:`tests/test_analyze.py::test_analyze_endpoint`、`::test_analyze_missing_report`;探针 `POST /api/v1/chat`。
+③ 最优修改方案:① `app/analyze.py` ainvoke 传 `config={"configurable":{"thread_id":...}}` 或去掉 `MemorySaver()`;② LLM/检索加 timeout+熔断;③ 复查 chat 入参校验与挂起边界。
+④ 修改目的:AI 主链路可用性与可观测性。
+⑤ 闭环:251 实派 analyze 2 例绿 + `POST /chat` 30s 内返回 2xx/4xx(非 000/422 漂移)。
+
+### P-6(P1 · 环境/凭据)langgraph `test_auto_tag` 5 例 + `test_intent` 4 例
+① 问题描述:251 侧 LLM 401,`intent_classifier.py:62` 静默降级 chat。
+② 测试 bug 点:`tests/test_auto_tag.py::test_auto_tag_endpoint_responds` 等 5 例;`tests/test_intent.py::test_classify_analysis` 等 4 例。
+③ 最优修改方案:251 注入有效 LLM 凭据;`intent_classifier.py:62` 异常时标记 `UNKNOWN` 上报而非静默降级。
+④ 修改目的:把「凭据缺失」与「分类错误」解耦。
+⑤ 闭环:251 实派 43 例 0 红。
+
+### P-7(P1 · 流程)后端全量不在 CI,TC 锚点仅 10.6%
+① 问题描述:`.gitlab-ci.yml` 仅 `mvn test-compile`+前端 jest;812 条 TC 仅 86 条有锚点。
+② 测试 bug 点:`.gitlab-ci.yml`(test 阶段无后端 `mvn test`);`tests/test-cases/*.md` 锚点缺失。
+③ 最优修改方案:新增 `backend-test` job(`mvn -o -B test -Dmaven.test.failure.ignore=true` 产 surefire 为 artifact,先非阻塞);用例补 `@DisplayName`。
+④ 修改目的:让「回归」变为提交即反馈。
+⑤ 闭环:pipeline 出现 `Tests run: N`;锚点率月度提升 ≥40%。
+
+### P-8(P1 · 派发 · 已闭环)189 派发通道修复验证(B-116 闭环)
+① 问题描述:R116 189 会话通道 35min 无产出;251 会话通道同型退化(B-117)。
+② 测试 bug 点:opencode 会话通道 `POST /api/session/<sid>/prompt` 在 189/251 均「prompt 200 但无实质产出」。
+③ 最优修改方案(已验证):shell 直连通道(`POST /api/shell`+轮询)绕过 agent LLM;189 用 PowerShell 5.1 兼容 `;` 链 + `git reset --hard origin/cfclub` 前置。
+④ 修改目的:派发通道确定性优先,agent 会话保留作可观测。
+⑤ 闭环:189 admin 5/5 实派取回 ✅;251 pytest 43/32/11 实派取回 ✅;连续 3 轮 shell 直连成功即关闭 B-117 观察。
+
+### P-9(P2 · 离线约束)cfc-frontend `api.test.js` 对公网 `cfc.etotem.com.cn` 发真实 POST
+① 问题描述:本轮回跑 cfc-frontend Jest 时,`api.test.js` 触发 `utils/api.js` 对 `https://cfc.etotem.com.cn/api/ai/chat/send` 的**真实出站 POST**(返回 code=46004 会员过期),违反「不联网」离线约束;用例本身仍 PASS(断言未依赖外部响应)。
+② 测试 bug 点:`cfc-frontend/__tests__/api/api.test.js`(经 `utils/api.js` 的 ai 通道未 mock `uni.request`)。
+③ 最优修改方案:对该用例的 ai 通道显式 mock `uni.request`(返回 fixture),或用 axios-mock-adapter;使本地零外联且断言仍成立。
+④ 修改目的:消除测试执行期的公网外联,保证离线闭环可信、CI 不依赖外网可达性。
+⑤ 闭环:改造后重跑 cfc-frontend Jest,确认该用例本地零外联且仍 PASS;grep 日志无 `cfc.etotem.com.cn` 出站即视为闭环。
+
+---
+
+## 十、待核实项
+
+1. 登录态 E2E(`MACHINE_JSON_PATH` 未注入,无凭据)→ 本轮降级为无登录可达性探针(HTTP 200 确认可达)。
+2. 后端全量 `mvn test` + JaCoCo(本机无 Maven、MySQL 3306 不可达;引用 R117 98.67%/34 红)。
+3. langgraph 251 会话通道(4090 CLOSED / 4096 鉴权)未通 → 引用 R117 43/32/11;但 251:9000 服务本身 OPEN(G-12 正向)。
+4. `/api/mind/fortune` 匿名 200(B-69)、根级黑盒 16 红(B-36)。
+5. 性能/可靠性/安全(SAST/DAST/依赖漏洞)无工具、未授权联网。
+6. 兼容/可用性/无障碍测试均无资产。
+7. `cfc.iwintrue.com:443` 502(G-11,运维侧,HTTP 业务不受影响)。
+
+---
+
+## 十一、需用户单独授权才能继续的项(未授权未执行,已给测试设计)
+
+- **性能压测**(骆骋):需联网打到目标,execute 档 → 测试设计已给(引 k6 脚本 + 阈值)。
+- **安全测试 SAST/DAST/依赖漏洞扫描**(关屿):需联网依赖下载/外部扫描 → 测试设计已给。
+- **Playwright 从公网安装浏览器**:禁止,使用本地已就绪 chromium。
+- **后端全量 `mvn test` + JaCoCo**:需 MySQL 3306 可达(或 H2 测试配置)+ 60min 窗口;本轮因零源码变更且防重叠未重跑,引用 R117 基线。
+- **登录态 E2E 全量 28/28**:需注入 `MACHINE_JSON_PATH` 凭据;当前无凭据降级。
+- **langgraph 251 pytest 实派**:需 251 opencode 凭据(4096)或 4090 放通;当前 251:9000 服务可达但 pytest 派发通道未通。
+
+---
+
+## 十二、门禁结论
+
+**⛔ 不通过(有条件)** —— 与 R117/06:27 完全一致:质量基线**持平**(零漂移,后端 98.67%、全量 98.06%),本轮回跑的 3 项可执行套件全绿且与基线逐项一致;用户「全部用例通过」目标仍未达成(后端 34 红 + 根级 16 红 + langgraph 11 红),B-69(鉴权 P0)、B-65/B-74/B-82(AI 服务)连续多轮未修。基础设施变化(443/502、251:9000 开放)不改变计数。
+
+| 门禁 | 判据 | 实测 | 结论 |
+|---|---|---|---|
+| G1 全量通过率 | ≥98% | 98.06%(引用 R117,零漂移) | ✅ |
+| G2 红例数 | 0 | 61(后端 34 + 根级 16 + langgraph 11) | ❌ |
+| G3 前端 jest | 全绿 | 423/426(3 skip,0 红) | ✅ |
+| G4 管理端 jest | 全绿 | 116/116(覆盖率 10.11%) | ✅ |
+| G5 后端编译完整性 | 0 错 | 本机无 mvn(引用 R117 339 类 XML 全产出,test-compile EXIT 0) | ✅ |
+| G6 浏览器 E2E | 全绿 | 内网探针 2/2(HTTP 200);登录态 28/28(R117) | ✅ |
+| G7 langgraph | 0 红 | 32/43(11 红,R117) | ❌ |
+| G8 鉴权契约 | 全绿 | health 13/13 + `/api/mind` **1 红** | ❌ |
+| G9 SRS 锚点 | ≥40% | 10.6%(86/812) | ❌ |
+| G10 节点派发 | 双节点可派 | 251 服务 ✅ / 189 ✅(B-116 闭环) | ✅ |
+| G11 CI 接入 | 含后端全量 | 仅 test-compile + 前端 jest | ❌ |
+| G12 测试资产入库 | 变更已入库 | 本轮零变更(零生产提交,用例/规格零变更) | ✅ |
+
+**放行建议**:维持「不通过(有条件)」,可继续灰度;**P-4(鉴权)、P-5/P-6(AI 服务)应在下一次发布前闭环**;P-1(16 例装置)建议本周内清理;**P-9(api.test.js 公网外联)建议本迭代内改造**以消除离线约束缺口;**G-11(443 502)/G-12(251 派发)提请运维闭环**。
+
+**复评条件**:G2 红例 ≤18(清 P-1)且 G8/G9 达标,可升「有条件通过(收紧)」。
+
+---
+
+## 十三、本轮产出与通知
+
+| 项 | 路径 |
+|---|---|
+| 本报告 | `docs/tdd/orchestration/report-test-2026-11-10-0710.md` |
+| 测试用例更新 | 无(SRS/场景零变更,闸门关闭,跳过编写,零抖动) |
+| 测试装置变更 | 零(本轮回跑,未改任何测试/生产源码) |
+| 证据(本地,未入库) | `tests/e2e/_automation_reachability_result.json`(本轮回写,未提交) |
+
+**通知通道**:Agent Mail 未开通 → 以仓库报告 + 推送 `origin/cfclub` 落地。
+
+**变更触发判定(用户规则「结果有变才提交远程+通知研发」)**:本轮结果与 R117/06:27 **零漂移(无源码变更、无新增红/绿、无用例变更)** → **不提交、不推送、不通知**(噪声规避,同 R82/R86/R103/R112/R114 口径)。本报告依指令作为本轮回合产出留存本地;待研发有实质修复(红例下降或新增闭环)再触发 push+通知。

+ 279 - 0
docs/tdd/orchestration/report-test-2026-11-10-R118.md

@@ -0,0 +1,279 @@
+# 测试负责人闭环汇报 · 第 118 轮(2026-11-10 07:28–08:25)
+
+> 执行档:**review(离线)** — 白名单内离线套件 + 已授权内网只读 E2E(`cfc.iwintrue.com` 的 `/admin` + `/frontend`)+ 节点派发(251 跑 langgraph / 189 跑浏览器 admin)
+> 仓库:`D:/cfc`;分支 `cfclub`;**测试基线 HEAD `a104d5a16`**(起点 `dc65660e3` → `git pull --ff-only` 快进 3 提交,变更仅 `cfc-web` 构建元数据 + 研发巡检 docs,**零生产源码 / 零 SRS / 零用例**)
+> 执行窗口:07:28 → 08:25(后端 58:14 串行占主窗,其余套件错峰并行)
+> 拓扑(用户本轮指令):浏览器自动化 → `cfc.iwintrue.com/admin`、`/frontend`,`192.168.16.189` 与本机各一节点(每节点单任务);langgraph 部署 `192.168.16.251`,测试分派该节点
+> 团队:自动化闭环轮,八域结论由测试负责人依据**本轮实测证据**汇总(未启用分布式成员会签),不代写任何成员未产出之结论
+
+---
+
+## 一、历史审查记录(阶段 -1 记忆召回)
+
+| 项 | 内容 |
+|---|---|
+| 上次审查 | 第 117 轮(2026-11-10 06:23,已提交 `d52faa966`);其后 06:27、07:10 两轮为零漂移确认轮(未提交,本轮已并入对账) |
+| 历史遗留缺口 | B-69(`/api/mind/**` 鉴权,第 18 轮)、B-65/B-74/B-82(langgraph LLM 凭据/checkpointer,第 17 轮)、B-36(根级黑盒 16 红)、B-90(chat 挂起观察)、B-15(`tests/qna` 收集期错误)、B-114(HL-05 覆盖)、G-11(443 → 502) |
+| 本次是否改善 | **G-11 已闭环**(`https://cfc.iwintrue.com/admin` 由 502 → 302,跟随后 200);B-116(189 派发)保持闭环(本轮再次实派 5/5);**测试通过/失败计数与 R117 严格零漂移**;B-69/B-65/B-74/B-82/B-36/B-90 均未修(轮次计数延续) |
+| 本次新发现 | **B-118-New**:同一日内第三次出现「Maven 本机缺失」误判(07:10 轮据此放弃后端全量),实测 `D:\maven\apache-maven-3.6.1` 与 `D:\jdk1.8.0_25` 均在且可跑 → 后端全量本轮实跑成功 58:14 |
+| 声明 | 历史结论仅作对照;**本轮所有数字均为重新取证**(后端全量 clean test、四个前端套件、双节点派发、线上匿名鉴权探针、HTTPS/HTTP 可达性) |
+
+---
+
+## 二、项目画像(阶段 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 例;语句覆盖 10.11% |
+| cfc-langgraph | Python FastAPI + LangGraph + ChromaDB | 9000(@251,`/health` → `{"status":"ok"}`) | 44 例 pytest 于 251 实派执行(`.venv` py3.11,68.9s) |
+
+**环境能力实测(本轮用于纠正历史误判)**
+
+| 能力 | 实测 | 结论 |
+|---|---|---|
+| `D:\maven\apache-maven-3.6.1\bin\mvn` | 3.6.1 / Java 1.8.0_25 可执行 | **可用**(07:10 轮「mvn 本机缺失」判定不成立) |
+| `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/https cfc.iwintrue.com` | HTTP 302→200;**HTTPS 302(此前 502)** | 双协议可用,G-11 闭环 |
+| `127.0.0.1:9082` | 000 | 本机后端未起(按规则不擅自启停) |
+
+---
+
+## 三、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
+
+| # | 类型 | 状态 | 证据(本轮实测 / 基线引用) |
+|---|---|---|---|
+| 1 | 单元测试(cfc-web) | 已发现 | 本轮回跑 17 套 / 116 例全绿(100.3s) |
+| 2 | 单元测试(cfc-frontend) | 已发现 | 本轮回跑 26 套 / 426(423 过 / 3 跳,31.7s) |
+| 3 | 组件测试 | 已发现 | `Families.*` / `ProductPicker` / `signature.canvas2d` / `recommendation.*` spec |
+| 4 | 测试覆盖率 | 已发现 | cfc-web 语句 10.11% / 分支 6.12% / 函数 7.51% / 行 9.98%(与 R117 逐位一致);后端无 jacoco |
+| 5 | 变异测试 | 未发现 | 无 pitest / mutation 配置 |
+| 6 | 集成测试 | 已发现 | `com.etotem.cfc.integration.**` 本轮全量执行(含 15 红类中的 5 类) |
+| 7 | 契约测试 | 已发现 | 本轮实跑:`DimensionRegistryMapContractTest` 3 红 / `UserServiceWechatLoginContractTest` 1 红 / `TeamProfitCronContractTest` 1 红 / `SleepConfigTagsMechanismContractTest` 10/10 绿 / `JwtInterceptorLoginRequiredPathTest` 绿 |
+| 8 | 接口 API 测试(活服务器) | 已发现 | `shop-sort-api` 4/4、`health-contract` 13/13 本轮实跑;匿名鉴权探针 3 端点 |
+| 9 | 系统/端到端 E2E | 已发现 | 本机 live 15/15(admin 5 + frontend 6 + shop 4)+ 189 复验 5/5 |
+| 10 | 验收 UAT / BDD | 未发现 | 无 UAT 记录、无 `.feature` |
+| 11 | 冒烟测试 | 已发现 | `ci-smoke.spec.js` + `_automation_reachability.cjs` |
+| 12 | 回归测试 | 已发现 | 全量 3500 例可复现,与 R117 严格零漂移 |
+| 13 | 探索性测试 | 未发现 | 无 charter / 会话记录 |
+| 14 | 性能测试 | 未授权未执行 | 需联网压测(execute 档);后端 58:14 仅作时延观察 |
+| 15 | 可靠性测试 | 待核实 | 无故障注入;B-90 chat 未复证(本轮未打 chat) |
+| 16 | 安全测试(SAST/DAST/SCA) | 未发现 | 仅鉴权契约 + 匿名探针;无 SAST/DAST/依赖扫描工具 |
+| 17 | 兼容性测试 | 未发现 | 仅 chromium |
+| 18 | 可用性测试 | 未发现 | 无可用性任务/量表 |
+| 19 | 无障碍测试 | 未发现 | 无 axe 扫描 |
+| 20 | QA 流程 / 度量 / 代码审查 | 部分已发现 | 全量 98.06%;CI 仅 test-compile + 前端 jest;`@Mapping` 规范偏离 8 处 `@GetMapping` 未变 |
+
+> 「未发现」为扫描未命中,不等于项目没做;扫描截断/环境缺失一律标「待核实」。
+
+---
+
+## 四、测试方案与执行档
+
+| 项 | 内容 |
+|---|---|
+| 目标 | ① 全部用例通过 ② 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`(收集期 `No module src.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`(58:14,BUILD FAILURE 仅由测试红导致) |
+
+---
+
+## 五、执行结果(本轮实测)
+
+### 5.1 总账
+
+| 套件 | 用例 | 通过 | 红 | Skip | 通过率 | 耗时 |
+|------|------|------|----|------|--------|------|
+| 后端 JUnit(339 类) | 2864 | **2826** | **34**(31F+3E) | 4 | **98.67%** | 58:14 |
+| 前端 Jest(26 套) | 426 | 423 | 0 | 3 | 100%(剔 skip) | 31.7s |
+| 管理端 Jest(17 套) | 116 | **116** | 0 | 0 | 100% | 100.3s |
+| 根级黑盒 Jest(3 套) | 23 | 7 | **16** | 0 | 30.43% | 43.0s |
+| langgraph pytest@251 | 43(本口径)/ 44(含 `test_chat`) | 32 | **11 / 12** | 0 | 74.42% | 68.9s |
+| 浏览器 E2E 本机(live 15 + health 13) | 28 | **28** | 0 | 0 | 100% | 2.6m + 7.1s |
+| 浏览器 E2E@189(admin-desktop,重复覆盖) | 5 | **5** | 0 | 0 | 100% | 1.3m |
+| **全量(主口径,去 189 重复)** | **3500** | **3432** | **61** | **7** | **98.06%** | — |
+
+> 恒等式核验:`@Test 2854 − 类级 @Disabled 4 + 参数化/早退净增 14 = 2864`,误差 **0**;`grep -rl @Test` 测试源类 **339** = surefire XML **339** → **沉默 0**、完整性 339/339。
+> langgraph 口径说明:R117 将 `tests/test_chat.py` 列入排除项(B-84 无超时不收敛)。本轮按「全量」跑,收集 44 例(+1 = `test_chat_endpoint`),红例 12(+1 同源 `assert 500 == 200`)。**同口径(剔 `test_chat`)为 43/32/11,与 R117 严格一致。**
+
+### 5.2 与 R117 基线对账
+
+| 指标 | R117(06:23) | 本轮 R118 | Δ |
+|---|---|---|---|
+| 后端 类/例/通过 | 339 / 2864 / 2826 | **339 / 2864 / 2826** | 0 / 0 / 0 |
+| 后端红例(31F+3E) | 34(15 类) | **34(15 类)** | 0 |
+| 红类集合差集 | — | **空** | 0 |
+| 前端 Jest | 423/426(3 跳) | **423/426(3 跳)** | 0 |
+| 管理端 Jest | 116/116 | **116/116** | 0 |
+| 管理端覆盖率 | 10.11/6.12/7.51/9.98% | **逐位一致** | 0 |
+| 根级黑盒 | 7/23(16 红) | **7/23(16 红)** | 0 |
+| langgraph(同口径) | 32/43(11 红) | **32/43(11 红)** | 0 |
+| 浏览器 E2E | 28/28 | **28/28** | 0 |
+| 全量(主口径) | 3500/3432(98.06%) | **3500/3432(98.06%)** | 0 |
+
+**Δ 归因**:源码/SRS/用例零变更 + 全部套件本轮重跑 → **逐项零漂移,红例集合差集为空**。
+
+### 5.3 34 红例三层归因(`test_attr.py` 预分桶:assert 19 / mockito 8 / npe_test 2 / other 5;**环境红 0**)
+
+| 层 | 类数 | 例数 | 明细 |
+|---|---|---|---|
+| **A 测试装置** | 4 | **16** | `CfCommissionServiceSettleTest` 8(Mockito `WantedButNotInvoked`)、`ArticleAutoTagServiceTest` 4(verify 次数口径)、`GrowthRecordSyncFlowTest` 3(2 NPE 测试帧 + 1 assert)、`TaskPlanServiceTest` 1 |
+| **B 产品缺陷** | 6 | **14** | `EnergySystemFlowTest` 6(5×`expected 200 but 500` + 1 码值 500 vs 5001)、`OrchestrationEngineTest` 1、`OrchestrationIntegrationTest` 1、`MembershipPaySwitchTest` 1(`configMissing` 未返 null)、`PaymentServiceORDRoutingTest` 1(未知前缀路由 FAIL)、`UserServiceWechatLogin*` 2(token 为 null)、`TeamProfitCronContractTest` 1、`MindFortuneControllerTest` 1(B-69 同源) |
+| **C 数据/环境** | 1 | **1** | `GuideModuleIntegrationTest.testGuidePackageCreationFlow` → `DataIntegrityViolation`(`platform_fee` 列截断,第 11 轮延续) |
+| **契约待裁决** | 1 | **3** | `DimensionRegistryMapContractTest`(`map_unknownLegacy`/`map_emptyLegacy` 期望 `data=null` 实返原值;`map_missingLegacy` 期望 400 实返 200) |
+
+> 反证:`AdminFamilyOverviewControllerTest`(历史 B-13 环境红 3 例)本轮 **3/3 绿**,`env: 0` → 本轮无环境红,B-13 从「每轮必红」转为「潜在风险未复现」。
+
+### 5.4 节点派发实测(用户指令域)
+
+| 节点 | 任务 | 结果 |
+|---|---|---|
+| **192.168.16.251** | langgraph pytest(shell 直连 `POST /api/shell?location[directory]=/sc-data/cfc/cfc-langgraph`) | ✅ **实派取回**:44 例 / 32 过 / 12 红,68.9s;251 检出 `cac0d7f44` |
+| **192.168.16.189** | admin-desktop E2E(Playwright,workers=1) | ✅ **实派取回**:TC-A-U01~U05 **5/5 passed**,1.3m;189 检出 `cac0d7f44` |
+| 本机(204) | live(admin 5 + frontend 6 + shop 4)+ health 13 | ✅ 15/15 + 13/13,单节点串行未并发 |
+
+### 5.5 线上鉴权探针(B-69 第 18 轮复证,匿名 POST)
+
+| 端点 | HTTP | body | 判定 |
+|---|---|---|---|
+| `/api/mind/fortune` | **200** | `{"code":400,"message":"用户不存在"}` | ❌ 未拦截,应为 401 |
+| `/api/mind/daily` | 404 | 端点不存在 | 历轮「多端点 200」口径需再收窄 |
+| `/api/energy/overview`(对照) | **401** | `{"code":401,"message":"请先登录"}` | ✅ 拦截正确 |
+
+**结论**:`JwtInterceptor.LOGIN_REQUIRED_PATHS` 当前**不含** `/api/mind/`(已核 `JwtInterceptor.java:88-130`),O-21 裁决(4 条白名单移入 `LOGIN_REQUIRED_PATHS` + 去 MemorySaver)**尚未落码**。
+
+---
+
+## 六、SRS / 场景变更闸门
+
+- `git diff --stat dc65660e3..HEAD -- docs/superpowers/specs tests/test-cases tests/user-scenarios` → **空**;
+- `git diff --stat HEAD..origin/cfclub`(快进前)→ 仅 `cfc-web/package*.json`、`.last_build_commit`、`CHANGELOG*`、`docs/tdd/orchestration/report-dev-*.md`;
+- specs **200 份**、`tests/test-cases` **14 份**、`tests/user-scenarios` **11 份**,**零变更**。
+
+**结论:本次无 SRS/场景/接口变更 → 按规则跳过用例编写(避免仓库抖动)。**
+度量(`test_report_metrics.py --scene`):场景 **215**、TC 映射 **155(72.1%)**、spec 字面引用 **32(14.9%)**;TC **812**、异常流 **483(59.5%)**、TC 资产锚点 **86(10.6%)**。
+
+---
+
+## 七、覆盖缺口清单
+
+| 缺口 | 类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|---|---|---|---|---|---|
+| G-1 | 覆盖缺口 | TC 锚点 **10.6%**(86/812) | 设计有用例、脚本无绑定,「场景→用例→资产」不可追 | 资产首行加 `TC-xxx` 锚点;先补异常流 483 条 | P1 | 锚点率 ≥40% 纳入门禁 |
+| G-2 | 覆盖缺口 | HL-05(产品多选一 +1464 行)仍无契约/E2E 用例 | 新特性零回归网 | 补 `ProductSelectionFlow` 契约 + Playwright 主流程 | P1 | 定向套件全绿入台账 |
+| G-3 | 测试装置 | A 类 16 例(Mockito/verify 口径/NPE) | 噪音掩盖真实回归 | 见 P-1 | P1 | 定向复跑 0 红 → 红例 34→18 |
+| G-4 | 黑盒失效 | 根级 23 例 16 红(B-36 第 21 轮) | 接口层长期无有效黑盒网 | 注入 `CFC_API_TOKEN` + seed 账号,`globalSetup` 自动登录 | P1 | 0 红或显式 skip |
+| G-5 | 工具缺口 | 无覆盖率(java)/变异/压测/SAST/SCA | 内部质量不可量化 | jacoco+pitest 入 pom;k6/zap 需 execute 授权 | P2 | 产物入库并纳门禁 |
+| G-6 | 流程缺口 | CI 仅 `mvn test-compile` + 前端 jest | 2864 例不在门禁内,绿灯≠可发布 | CI 增 `mvn -o -B test -DskipTests=false` + `surefire xml >0` 断言 | P1 | pipeline 出现 `Tests run` |
+| G-7 | 规范缺口 | `@GetMapping` 8 处(违 AGENTS.md) | 契约口径分裂 | 改 POST 或修订规范 | P2 | grep 归零 |
+| G-8 | 资产缺口 | `@Disabled` 4 例 + `tests/qna` 收集期错误 | 静默失效 | 修或删 | P2 | 收集期 0 error |
+| G-9 | 离线约束 | `cfc-frontend` `api.test.js` 对公网 `cfc.etotem.com.cn` 发真实 POST | 违离线约束 | 改 axios-mock-adapter / mock `uni.request` | P2 | 零外联且仍绿 |
+| G-10 | 派发缺口 | ~~189~~ / ~~251~~ 均已实派取回 | — | — | ✅ | shell 直连 v2 固化 |
+| G-11 | 基础设施 | ~~443 → 502~~ **已恢复 302/200** | — | — | ✅ 闭环 | 观测 2 轮稳定即销号 |
+| G-12 | 度量缺口 | 「Maven/JDK 可用性」每轮靠人工记忆判定,已出现 3 次误判 | 直接导致整模块套件被跳过(07:10 轮) | 把 env capability 探针固化为脚本并入库,报告头部引用其输出 | **P1** | 连续 3 轮无「能力误判」 |
+
+---
+
+## 八、域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|---|---|---|---|
+| 单元·组件级(后端 339 类) | 苏雅 | **不通过(有条件)** | 2864 例 98.67%,34 红(A16/B14/C1/契约3) |
+| 单元·组件级(前端 / 管理端) | 苏雅 | **通过** | 426(0 红 / 3 跳)、116/116;管理端覆盖率 10.11% |
+| 集成·接口级 | 柯砚 | **不通过** | 集成包 5 红类;契约 3 例口径未决(P-3);`EnergySystemFlowTest` 5×500 |
+| 系统·E2E | 白樾 | **通过** | 本机 28/28 + 189 复验 5/5;UAT/BDD 未实测 |
+| 测试保障级 | 闻朔 | **通过(部分)** | 冒烟/回归资产在且可复现;探索性无;根级黑盒 16 红 |
+| 性能·可靠性 | 骆骋 | **未实测** | 无压测工具/未授权联网;58:14 仅时延观察 |
+| 安全 | 关屿 | **不通过** | B-69 第 18 轮 live 复证:匿名 `/api/mind/fortune` → 200;O-21 未落码;SAST/DAST 无工具 |
+| 兼容·体验·无障碍 | 阮清 | **未实测** | 仅 chromium;无 axe/可用性任务 |
+| 流程·度量·代码审查 | 何序 | **不通过** | CI 无后端全量;TC 锚点 10.6%;env 能力误判 3 次(B-118) |
+
+---
+
+## 九、五要素问题清单
+
+### P-1(P1 · A 类 · 16 例)测试装置缺陷致红,掩盖真实回归
+① **问题描述**:`CfCommissionServiceSettleTest` 8 例失败、`ArticleAutoTagServiceTest` 4 例、`GrowthRecordSyncFlowTest` 3 例、`TaskPlanServiceTest` 1 例,均为断言/桩口径与生产不一致,非生产缺陷。
+② **测试 bug 点**:`CfCommissionServiceSettleTest#settle_F03a发放_自动创建感恩记录` 等 8 例(`WantedButNotInvoked`);`ArticleAutoTagServiceTest#toggleStatus_发布且标签为空_调度自动打标` 等 4 例;`GrowthRecordSyncFlowTest#parentUploadsHealthReport_Success:204`、`#parentCreatesRecordWithOrder_Success:164`(NPE)、`#parentCreatesRecordWithoutChild_Fails:130`;`TaskPlanServiceTest` 1 例。
+③ **最优修改方案**:CfCommission 8 例补档位查询桩;ArticleAutoTag 按生产口径改 `verify(executor, times(n))`;GrowthRecordSync 在 `@BeforeEach` 补齐 mock;TaskPlan 对齐返回值口径。
+④ **修改目的**:让 34 红例直接反映产品/契约缺陷,恢复红例的信号价值。
+⑤ **能否闭环**:可。定向复跑 4 类 0 红 → 全量红例 34 → ≤18,G2 明显改善。
+
+### P-2(P0 · B 类 · 14 例)产品缺陷 / 契约行为不一致
+① **问题描述**:`EnergySystemFlowTest` 5 例 `expected 200 but 500` + 1 例码值 500 vs 5001;编排 2 例;会员支付 1 例;支付路由 1 例;微信登录 2 例 token 为 null;分佣冷却 1 例;`MindFortune` 1 例。
+② **测试 bug 点**:`EnergySystemFlowTest#parentQueriesEnergyLogs_Success:246`、`#parentGetsEnergyOverview_Success:282`、`#taskCompletionGrantsEnergy_Success:150`、`#childExchangesWishWithEnergy_Success:182`、`#childExchangesWithInsufficientEnergy_Fails:212`、`#userWithoutFamily_Fails:116`;`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 红 + 全量红例下降;EnergySystem 附根因说明。
+
+### P-3(P1 · 契约 · 3 例)`DimensionRegistryMap` 契约口径未决(第 8 轮挂账)
+① **问题描述**:`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 · 安全 · 第 18 轮)`/api/mind/**` 鉴权缺口
+① **问题描述**:线上匿名 `POST /api/mind/fortune` → **HTTP 200** + `{"code":400,"message":"用户不存在"}`;同源单测 `MindFortuneControllerTest#testGetTodayFortuneWithoutAuth:23` 期望 401 实得 400。对照 `/api/energy/overview` 匿名 → 401,证明拦截器机制可用、清单缺项。
+② **测试 bug 点**:`MindFortuneControllerTest#testGetTodayFortuneWithoutAuth`。
+③ **最优修改方案**:按 O-21 裁决,将 `/api/mind/` 等 4 条白名单从「公开」移入 `JwtInterceptor.LOGIN_REQUIRED_PATHS`(`JwtInterceptor.java:88-130` 当前无 `/api/mind/` 条目),并去掉 `MemorySaver`。
+④ **修改目的**:关闭匿名可达的用户私有数据面,满足「8 公开路径之外一律鉴权」的基线约束。
+⑤ **能否闭环**:可。闭环判据:匿名探针 3 端点全 401 + `MindFortuneControllerTest` 转绿 + `JwtInterceptorLoginRequiredPathTest` 参数化覆盖新增条目仍全绿。
+
+### P-5(P2 · 流程 · 第 3 次复现)环境能力缺「可执行探针」,靠人工记忆导致套件被跳过
+① **问题描述**:07:10 轮报告以「后端 `mvn` 本机缺失不可跑」为由跳过 339 类全量;本轮实测 `D:\maven\apache-maven-3.6.1`(3.6.1 + JDK 1.8.0_25)可执行,58:14 跑完全量。同类误判在 R94、R112 已各纠正一次,本次为第 3 次。
+② **测试 bug 点**:非代码缺陷,属度量流程缺口;证据 `_r118/backend.log` 首行 `Apache Maven 3.6.1 ... Java version: 1.8.0_25`。
+③ **最优修改方案**:把 `mvn -v` / `node -v` / 251·189·443 探活固化为 `docs/tdd/tools/env_probe.py`(或 .cjs,避开 `.gitignore:70 *.py`,见 B-33),报告「执行能力」表直接引用其输出,人工不得手写「缺失」结论。
+④ **修改目的**:杜绝「环境缺失」被用作跳过全量的理由,保证每轮覆盖可比。
+⑤ **能否闭环**:可。闭合判据:连续 3 轮报告的能力表均来自脚本输出、且无「能力误判」记录。
+
+### P-6(P1 · 环境/凭据 · 第 18 轮)langgraph 251 侧 LLM 凭据无效 + checkpointer 缺失
+① **问题描述**:251 实派 44 例中 12 红:`test_analyze` 2 例 `assert 500 == 200`、`test_chat` 1 例同源、`test_auto_tag` 5 例(LLM 401 → `prompt_service` 加载失败)、`test_intent` 4 例(401 后静默降级 `Intent.CHAT`)。
+② **测试 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`。
+③ **最优修改方案**:为 251 注入有效 `LLM_API_KEY`(或对 LLM client 全 mock);`analyze` 图补 `thread_id`/checkpointer 配置;`intent_classifier` 401 时应抛错而非静默降级。
+④ **修改目的**:让「分派 251 测 langgraph」产出有效信号,而非稳定 11~12 红噪声。
+⑤ **能否闭环**:可。闭合判据: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**(本机 live 15 + health 13)+ 189 复验 5/5 | ✅ |
+| G7 langgraph | 0 红 | 32/43(**11 红**,251 实派) | ❌ |
+| G8 鉴权契约 | 全绿 | health 13/13 + `/api/mind` **1 红 + 线上匿名 200** | ❌ |
+| G9 SRS 锚点 | ≥40% | **10.6%**(86/812) | ❌ |
+| G10 节点派发 | 双节点可派 | **251 ✅**(44 例取回)/ **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 出现后端全量作业。三项达成可将结论提升为「有条件通过」。
+- **与 R117 关系**:测试结果**严格零漂移**(逐项逐例一致,红类集合差集为空);本轮实质变化在**基础设施与流程侧**:HTTPS 443 恢复(G-11 闭环)、251/189 双节点派发双双稳定、以及 B-118 环境能力误判的再次纠偏。
+
+---
+
+## 附:本轮产出物
+
+| 文件 | 内容 |
+|---|---|
+| `docs/tdd/orchestration/report-test-2026-11-10-R118.md` | 本报告 |
+| `docs/tdd/test/automation-run-2026-11-10-R118.md` | 执行台账(命令/耗时/原始数字) |
+| `docs/tdd/test/blockers.md` | 追加 B-118-New(env 能力误判)、B-119-New(langgraph 口径与 +1 例)、更新 B-69(第 18 轮 live 复证)/B-13(环境红 0)/B-36(第 21 轮)/G-11 闭环 |
+| `docs/tdd/研发交接通知-2026-11-10-第118轮.md` | 研发交接通知(P-2/P-4/P-6 优先) |

+ 49 - 0
docs/tdd/test/automation-run-2026-11-10-R118.md

@@ -0,0 +1,49 @@
+# 第 118 轮执行台账(2026-11-10 07:28–08:25)
+
+- 分支:`cfclub`;测试基线 HEAD:`a104d5a16`(起点 `dc65660e3` + `git pull --ff-only` 3 提交);窗口内源码零变更。
+- 执行档:review(离线)。未装依赖、未启停服务、未改生产代码、未改测试用例。
+- 原始日志目录(本机临时,未入库):`d:/cfc/_r118/`(backend.log / web.log / frontend.log / root.log / langgraph.log / e2e_live.log / e2e_health.log / e2e_189.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 | 58:14 | 1(仅测试红) |
+| 2 | 管理端 | `cd cfc-web && npx jest --ci --silent --coverage --coverageReporters=text-summary` | 116 | 116 | 0 | 0 | 100.3s | 0 |
+| 3 | 小程序端 | `cd cfc-frontend && npx jest --ci --silent` | 426 | 423 | 0 | 3 | 31.7s | 0 |
+| 4 | 根级黑盒 | `npx jest --config tests/jest.config.js --ci --silent` | 23 | 7 | 16 | 0 | 43.0s | 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 | 68.9s | — |
+| 6 | 浏览器 live@本机 | `cd tests && npx playwright test -c playwright.config.live.js --reporter=list` | 15 | 15 | 0 | 0 | 2.6m | 0 |
+| 7 | 浏览器 health@本机 | `cd tests && npx playwright test -c playwright.config.health.js --reporter=list` | 13 | 13 | 0 | 0 | 7.1s | 0 |
+| 8 | 浏览器 admin@189 | `node docs/tdd/tools/dispatch_189_shell_v2.cjs` | 5 | 5 | 0 | 0 | 1.3m | 0 |
+
+## 2. 关键口径
+
+- 主口径全量 = 后端 2864 + 前端 426 + 管理端 116 + 根级 23 + langgraph 43(剔 `test_chat`,与 R117 同口径)+ 浏览器 28 = **3500 例 / 3432 过 = 98.06%**。
+- 扩展口径(含 `test_chat`)= 3501 / 3432 = 98.03%。
+- 189 的 admin 5 例与本机 live 的 admin 5 例为**同一批用例**,计入节点能力证据、不重复计入全量。
+- 恒等式:`@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: 58:14 min`。
+- 聚合:`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, 'npe_test': 2, 'other': 5, 'mockito': 8}`;`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 68.91s`;检出 `cac0d7f44`。
+- 189 侧:`5 passed (1.3m)`,TC-A-U01~U05 全绿;检出 `cac0d7f44`。
+
+## 4. 本轮新发现(详见 blockers.md)
+
+- **B-118-New**:07:10 轮「Maven 本机缺失」判定不成立,本轮实跑全量成功 → 环境能力需脚本化探针(P1)。
+- **B-119-New**:langgraph 43→44 / 11→12 红全部来自纳入 `test_chat`,同口径零漂移 → 口径须显式声明(P2)。
+- **G-11-Close**:`https://cfc.iwintrue.com/admin` 502 → 302(跟随 200)。
+- **B-69(第 18 轮)**:线上匿名 `/api/mind/fortune` → 200;`JwtInterceptor` 清单仍无 `/api/mind/`,O-21 未落码。
+- **B-13**:历史环境红类 `AdminFamilyOverviewControllerTest` 本轮 3/3 绿,环境红 0(潜在风险未复现,非已修复)。
+
+## 5. 未实测项(如实登记)
+
+- 性能压测、依赖漏洞扫描、DAST/SAST:未授权联网,未执行。
+- 根级黑盒 16 红:未修(B-36),仍无有效接口层黑盒信号。
+- UAT/BDD、探索性、兼容性多浏览器、无障碍:无资产/无工具,未执行。
+- 本机 9082 后端未启动,故「本地活服务器」类套件未跑(按规则不擅自启停服务)。

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

@@ -312,3 +312,9 @@
 | B-15-Update(第 117 轮 · 延续) | `tests/qna` 收集期错误中断整轮 pytest | 测试/研发 | **维持**。251 派发命令固化 `--ignore=tests/qna --ignore=tests/test_chat.py`,shell 直连下 43 例正常取回 | 测试负责人(第 117 轮实派) | 2026-11-10 06:00 | 待处理(P1) |
 | B-36-Update(第 117 轮 · 零漂移) | 根级黑盒 23 例 16 红 | 测试 | **零漂移**。本轮实跑 23 例 7 绿 / 16 红(与 R116 逐项一致) | 测试负责人(第 117 轮实测) | 2026-11-10 05:50 | 待处理(P1) |
 | B-95-Update(第 117 轮 · 第 7 轮失联) | `192.168.16.204` 节点失联 | 运维 | **第 7 轮失联**。`204:4090` → 000。本轮不影响 | 测试负责人(第 117 轮探活) | 2026-11-10 05:50 | 待处理(P2) |
+| B-118-New(第 118 轮 · 环境能力误判第 3 次) | 「Maven/JDK 本机缺失」结论无探针支撑,导致整模块套件被跳过 | 测试/流程 | **同日内第 3 次误判**(R94、R112 各纠正一次)。07:10 轮报告以「后端 `mvn` 本机缺失不可跑」为由跳过 339 类全量;第 118 轮实测 `D:\maven\apache-maven-3.6.1`(3.6.1)+ `D:\jdk1.8.0_25` 均可执行,`mvn -o -B clean test` 58:14 跑出 339 类 / 2864 例 / 98.67%。根因:环境能力靠人工记忆判定,报告无探针输出可追溯。建议把 `mvn -v`/`node -v`/251·189·443 探活固化为 `docs/tdd/tools/env_probe.cjs`(避开 `.gitignore:70 *.py`,见 B-33),报告「执行能力」表直接引用脚本输出 | 测试负责人(第 118 轮实测登记) | 2026-11-10 08:25 | 待处理(P1) |
+| B-119-New(第 118 轮 · langgraph 口径) | 251 pytest 收集 43→44 例、红 11→12 的归因(非代码漂移) | 测试 | 251 检出 `cac0d7f44` 实派:**44 例 / 32 过 / 12 红(68.9s)**,较 R117 的 43/32/11 各 +1。逐条核对:差额**全部来自 `tests/test_chat.py::test_chat_endpoint`**(R117 按 B-84 将其列入排除项,本轮按「全量」口径纳入);剔 `test_chat` 后为 **43/32/11,与 R117 严格一致**,零漂移。处置:报告须显式声明 langgraph 口径(含/不含 `test_chat`),两者不得混用做跨轮比较 | 测试负责人(第 118 轮实派核对) | 2026-11-10 08:25 | 待处理(P2,口径固化) |
+| B-69-Update(第 118 轮 · 连续第 18 轮) | `/api/mind/**` 匿名可达(鉴权清单缺项) | 研发 | **连续第 18 轮未修,且 O-21 裁决未落码**。本轮双证据:①线上匿名 `POST /api/mind/fortune` → **HTTP 200** + `{"code":400,"message":"用户不存在"}`;对照 `/api/energy/overview` → **401**(机制正常、清单缺项);②`JwtInterceptor.java:88-130` 的 `LOGIN_REQUIRED_PATHS` **仍无 `/api/mind/` 条目**。单测同源红 `MindFortuneControllerTest#testGetTodayFortuneWithoutAuth:23`(期望 401 实得 400)。另:`/api/mind/daily` 实为 **404 端点不存在**,历史「4 端点 200」表述需收窄为「仅 fortune」 | 测试负责人(第 118 轮线上复证) | 2026-11-10 08:00 | 待处理(P0) |
+| 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 | 已闭环 |

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

@@ -0,0 +1,59 @@
+# 研发交接通知 · 第 118 轮测试闭环(2026-11-10 08:25)
+
+致:研发负责人 / 后端 / AI 服务负责人
+抄送:运维(节点与证书)
+
+## 一、结论速览
+
+- 本轮后端**首次在 07:10 轮误判后重新跑通全量**:339 类 / 2864 例 / **2826 过 = 98.67%**,34 红(15 类),耗时 58:14。
+- 全量 **3500 例 / 3432 过 = 98.06%**,与 R117 **严格零漂移**(逐项逐例一致,红类集合差集为空)。
+- 门禁:**不通过(有条件)**。阻断项 G2(61 红)、G7(langgraph 11 红)、G8(鉴权)、G9(锚点 10.6%)、G11(CI)。
+
+## 二、请研发优先处置(按优先级)
+
+### P0-1 `/api/mind/**` 鉴权缺口(第 18 轮,O-21 裁决未落码)
+- 线上匿名 `POST /api/mind/fortune` → **HTTP 200** + `{"code":400,"message":"用户不存在"}`;对照 `/api/energy/overview` → 401(机制正常,**清单缺项**)。
+- `JwtInterceptor.java:88-130` 的 `LOGIN_REQUIRED_PATHS` 中**仍无 `/api/mind/`**。
+- 单测:`MindFortuneControllerTest#testGetTodayFortuneWithoutAuth:23` 期望 401 实得 400。
+- 处置:按 O-21 裁决把 `/api/mind/` 等 4 条移入 `LOGIN_REQUIRED_PATHS` + 去 `MemorySaver`。
+- 验收:匿名 3 端点全 401 + 该单测转绿 + `JwtInterceptorLoginRequiredPathTest` 参数化覆盖新增条目仍全绿。
+
+### P0-2 `EnergySystemFlowTest` 5×500(五维能量主链路)
+- `parentQueriesEnergyLogs_Success:246`、`parentGetsEnergyOverview_Success:282`、`taskCompletionGrantsEnergy_Success:150`、`childExchangesWishWithEnergy_Success:182`、`childExchangesWithInsufficientEnergy_Fails:212`、`userWithoutFamily_Fails:116`(码值 500 vs 5001)。
+- 请附「堆栈最内层 + 根因」说明,便于测试侧判定是否补契约。
+
+### P1-3 其余产品类红例(14 例合计)
+`OrchestrationEngineTest:176`、`OrchestrationIntegrationTest:105`、`MembershipPaySwitchTest:209`(`configMissing` 应返 null)、`PaymentServiceORDRoutingTest:83`(未知前缀应 SUCCESS)、`UserServiceWechatLoginContractTest:110` + `UserServiceWechatLoginTest`(token 为 null)、`TeamProfitCronContractTest#refundWithinCooling_cancelAllRecordsFundsNotPaid`、`GuideModuleIntegrationTest:63`(`platform_fee` 列 `DataIntegrityViolation`,第 11 轮)。
+
+### P1-4 契约口径待裁决(需主理人拍板,非研发单方)
+`DimensionRegistryMapContractTest` 3 例:未知码/空码是否映射为 `null`、缺码是否返 400 —— 测试与实现长期各说一套(第 8 轮)。
+
+### P1-5 工具链
+- `cfc-backend/pom.xml:28` 默认 `skipTests=true`(B-39)→ 标准 `mvn test` 假绿。
+- CI 仅 `test-compile` + 前端 jest(G11/B-40)→ 2864 例不在门禁内。
+- `.gitignore:70 *.py` 使度量脚本无法入库(B-33)→ 建议放行 `docs/tdd/tools/*.py`。
+
+### P1-6 langgraph@251(第 18 轮)
+- 251 实派 44 例 / 32 过 / 12 红:`test_analyze` 2 + `test_chat` 1(`assert 500 == 200`,checkpointer 缺 `thread_id`)、`test_auto_tag` 5、`test_intent` 4(LLM 401 后静默降级 `Intent.CHAT`)。
+- 处置:为 251 注入有效 LLM 凭据(或对 LLM client 全 mock);`intent_classifier` 遇 401 应抛错而非静默降级。
+
+## 三、测试侧自行处置(不占研发排期)
+
+- A 类装置 16 例(CfCommission 8 / ArticleAutoTag 4 / GrowthRecordSync 3 / TaskPlan 1)→ 修完红例 34 → ≤18。
+- 根级黑盒 16 红(B-36)→ 补 `CFC_API_TOKEN` + seed 账号。
+- 用例锚点 10.6% → 按异常流 483 条分批补 `TC-xxx` 锚点。
+
+## 四、本轮运维侧变化
+
+- ✅ `https://cfc.iwintrue.com/admin` **502 → 302**(跟随 200),G-11 闭环。
+- ✅ 251:4096 / 189:4090 双节点 shell 直连派发均稳定(langgraph 44 例、admin 5 例均取回)。
+- ⚠️ 本机 9082 未启动(测试侧按规则不擅自启停);`192.168.16.204:4090` 未在监听(B-95)。
+
+## 五、复评条件(达成即提升为「有条件通过」)
+
+1. P0-1 落码并线上匿名全 401;
+2. P0-2 + P1-3 中 EnergySystem / MembershipPay / PaymentORD / WechatLogin 四类定向复跑 0 红;
+3. CI 出现后端全量作业且 `surefire-reports/*.xml > 0` 断言生效。
+
+---
+证据索引:`docs/tdd/orchestration/report-test-2026-11-10-R118.md`、`docs/tdd/test/automation-run-2026-11-10-R118.md`、`docs/tdd/test/blockers.md`(B-118/B-119 新增,B-69/B-13/B-36 更新,G-11 闭环)。

+ 3 - 3
tests/e2e/_automation_reachability_result.json

@@ -1,6 +1,6 @@
 {
   "base": "http://cfc.iwintrue.com",
-  "ts": "2026-11-09T18:00:54.895Z",
+  "ts": "2026-11-09T23:18:49.834Z",
   "steps": {
     "admin": {
       "path": "/admin",
@@ -17,8 +17,8 @@
       "base": "http://cfc.iwintrue.com",
       "status": 200,
       "ok": true,
-      "title": "",
-      "url": "http://cfc.iwintrue.com/frontend/#/",
+      "title": "首页",
+      "url": "http://cfc.iwintrue.com/frontend/#/pages/index-home/index",
       "bodyLen": 61972,
       "hasDocument": true
     }