瀏覽代碼

test(tdd): 第148轮闭环——后端强制实跑51:57=347类/2946例/2925过/99.29%/17红(与R146零漂移第8次)+langgraph 251实派51例50过/1红ConnectError(B-142-2复验未过不销号)+浏览器28/28(189实派5/5 blob一致)+web116/fe601过3红/根级7过16红+全量3782/3727=98.55%;SRS零变更G12合规;新增B-148-1网关瞬抖502;结果变化触发push+通知研发

E2E Test Bot 1 天之前
父節點
當前提交
1573d89e33

+ 51 - 0
docs/tdd/automation-run-2026-11-11-R148.md

@@ -0,0 +1,51 @@
+# 自动化执行记录 · 测试负责人闭环 第 148 轮(2026-11-11 16:40–17:40 GMT+8)
+
+> 触发:定时自动化 6255181e-9118-426d-887a-a897c2cbb810「测试负责人闭环(全部用例通过 + 覆盖 SRS/场景含异常流)+ 浏览器走 cfc.iwintrue.com/admin 与 /frontend(189/本机每节点单任务)+ langgraph 派 251 + 结果有变提交远程并通知研发」。
+> 执行档:review(离线)。全程只读:未装依赖、未启停服务、未改生产代码、未改测试断言。
+
+## 1. 时序
+
+| 时间 | 动作 | 结果 |
+|------|------|------|
+| 16:40 | 读自动化记忆 + 今日工作日志;`git fetch` | 落后 3 提交(`c9d6192a5` → `ffa97bf02`) |
+| 16:41 | `pull --rebase --autostash --ff-only` | 快进至 `ffa97bf02`;变更 8 文件 = cfc-web 构建元数据 + 研发 docs,**零功能源码** |
+| 16:41 | 环境探针 | JDK 1.8.0_25 / Maven 3.6.1 / Node v22.22.2 / D: 93G 可用 → 全部可用 |
+| 16:42 | 后端全量 kick(后台) | `mvn -o -B clean test` |
+| 16:43 | 251 langgraph kick | `setsid nohup` + 落盘 `/tmp/r148_pytest.log`;节点 HEAD `ffa97bf02` |
+| 16:43 | 189 admin-desktop 实派 | 5/5(81s,EXIT=0) |
+| 16:45 | 本机 fe / shop / health | 6/6、4/4、13/13(health 首跑 1 例 502 → 复跑全绿) |
+| 16:47 | langgraph 读结果 | 51 例:50 过 / 1 红(ConnectError) |
+| 16:48 | 线上探针 5+3 | 鉴权 5/5 = 401;`/api/admin/families/overview` = 200+code:400;`/admin` `/frontend` 302、`/` 404 |
+| 16:50 | 三套 Jest | web 116/116、fe 616(601/3/12)、根级 23(7/16) |
+| 16:55 | 度量脚本 + 锚点扫描 | 场景 215 / 映射 155(72.1%);TC 837 / 异常流 498(59.5%);锚点 104(脚本) / 65(严格) |
+| 17:35 | 后端收尾 | **51:57**;347 类 / 2946 例 / 2925 过 / 16F+1E+4S = **99.29%** |
+| 17:40 | 报告 + 台账 + 通知 | 本记录 + `report-test-2026-11-11-R148.md` + `notice` + blockers/status 附录 |
+
+## 2. 关键判定
+
+- **后端强制实跑**(R147 采信 R146,累计 1 轮;按纪律上限 2 轮,但本轮窗口有 cfc-web 构建元数据变更,选择实跑取证)→ 结果与 R146/R145 逐类逐例一致,**零回归第 8 次**。
+- **langgraph 不销号 B-142-2**:R147 全绿 51/51 为第 1 轮;本轮 50/51(`test_auto_tag_short_content` → chat 500,`ConnectError`)→ 未达「连续 2 轮绿」,维持观察。
+- **新增 B-148-1**:health 契约首跑 1 例 502(复跑 13/13、直连 2/2 = 401)→ 网关瞬抖,非鉴权缺陷;建议用例对 5xx 做重试/skip 分流。
+- **B-189 维持**:189 仓库 `C:\code\cfc`、spec blob `4703d73fb` = 本机 → 跨节点结论可比。
+
+## 3. 与 R147 差异
+
+| 指标 | R147 | R148 | 差异 |
+|------|------|------|------|
+| 后端 | 采信 99.29%(347/2946/17红) | **实跑 99.29%(同集合同数)** | 0(零漂移) |
+| langgraph | 51/51(0 红) | **50/51(1 红 ConnectError)** | -1 过 |
+| 前端 | 601/3/12 | 601/3/12 | 0 |
+| 管理端 | 116/116 | 116/116 | 0 |
+| 根级 | 7/16 | 7/16 | 0 |
+| 浏览器 | 28/28 + 2 skip | 28/28 + 2 skip | 0 |
+| 全量 | 3782 / 3728 = 98.57% | **3782 / 3727 = 98.55%** | -1 过 / -0.02pp |
+| 门禁 | 有条件通过 | 有条件通过(G7 由 ✅ 转 ❌) | 恶化 1 项 |
+
+## 4. 未实测 / 未授权项(如实记录)
+
+- 性能压测(k6/JMeter):无脚本 + 需联网/需目标环境 → **未实测**。
+- 依赖漏洞扫描(SCA)、DAST:需联网 → **未授权未执行**。
+- 变异测试(PIT):仓库未配置 → **未实测**。
+- 后端行覆盖(jacoco):`pom.xml` 无插件 → **无凭据**。
+- 多引擎兼容(webkit/firefox)、axe 无障碍:需联网装浏览器 → **未实测**。
+- 业务 UAT:无签署记录 → **待核实**。

+ 41 - 0
docs/tdd/notice-2026-11-11-R148-研发通知.md

@@ -0,0 +1,41 @@
+# 研发交接通知 · 测试负责人 第 148 轮(2026-11-11 17:40)
+
+> 发起:测试负责人(自动化闭环)|接收:研发负责人 / 后端 / 前端 / AI(LangGraph)/ 运维
+> 触发原因:**测试结果有变化**(langgraph 51/51 → 50/51,全量 98.57% → 98.55%),且新登记 1 项运维观察项。
+
+## 一、本轮结论
+
+| 项 | 结果 |
+|---|---|
+| 门禁结论 | **⚠️ 有条件通过**(G2 / G7 / G9 / G11 未达阈值,无新增回归) |
+| 全量 | **3782 例 / 3727 过 = 98.55%**(剔 skip 99.02%);红 37 / 跳 18 |
+| 后端(实跑 51:57) | 347 类 / 2946 例 / **2925 过 / 17 红 / 4 跳 = 99.29%**,与 R146/R145 逐类逐例一致 → **零回归第 8 次** |
+| langgraph@251(292s) | **51 例 / 50 过 / 1 红** ← 唯一变化点 |
+| 浏览器 | **28/28 + dx 2 skip**(189 admin 5/5、本机 fe 6/6、shop 4/4、health 13/13) |
+| 三套 Jest | web 116/116 · fe 601/3/12(3 预期 RED)· 根级 7/16 |
+
+## 二、需研发处置(按优先级)
+
+| # | 编号 | 优先级 | 问题 | 归属 | 建议动作 |
+|---|------|--------|------|------|----------|
+| 1 | B-142-2 | **P0** | 251 `POST /api/v1/chat` → **500**,日志 `ConnectError('All connection attempts failed')`(`test_auto_tag_short_content`) | 运维/AI | 上游 LLM 链路可用性;服务侧应对上游故障返回 **503 + 结构化 code + 熔断**,不得裸露 500 |
+| 2 | B-142-1 | **P1** | 匿名 `POST /api/admin/families/overview` → HTTP 200 + `code:400`(对照组 energy/health-plan/mind/huawei/xiaomi 全 401)——**第 7 轮未修** | 后端安全 | `JwtInterceptor` 放行清单收口至 8 个公开路径;补 admin 域鉴权契约用例 |
+| 3 | B-145-1 | **P1** | `schema.sql:5343` `nutrition_age_dosage` 含 `INDEX idx_product(product_id)` 但无该列 → 建表恒失败,`DatabaseInitializer` 静默吞错——**第 4 轮未修** | 后端 | 删无效索引或补列;建表失败改为抛错 |
+| 4 | 17 后端红(10 类) | **P0** | EnergySystem 6(5×500 + 1×5001)· Orchestration 2 · UserServiceWechatLogin 2 · MembershipPay 1 · PaymentORD 1 · TeamProfitCron 1 · DimensionRegistryMap 3(契约待裁决 P-9)· GuideModule 1(平台费截断) | 后端/产品 | EnergySystem 需先取堆栈定位(等于该链路零有效覆盖);P-9 需产品书面裁决「缺参是否 400 / 未知 legacy 是否透传」 |
+| 5 | B-134-4 | P1 | `intent_classifier` 异常兜底默认 `chat`,把上游 429/401 伪装成分类正确 | AI | 异常路径返回 `degraded=True` + 结构化日志 |
+| 6 | B-148-1 | P2(新) | health 首跑 `TC-H-U01` 收 **502**,复跑 13/13、直连 401/401 → 网关瞬抖 | 运维 | 网关侧稳定性;测试侧已记观察项 |
+| 7 | B-DX-1 | P2 | dx-bridge `bridge/list`、`bridge/sync-status` 仍 404(2 例 skip)——第 10 轮 | 部署 | TR-24 待部署 |
+| 8 | B-95 | P2 | `192.168.16.204:4090` = 000(189/251 均 200)——第 19 轮 | 运维 | 节点恢复或从派发池摘除 |
+| 9 | B-36 | P3 | 根级黑盒 16 红全 `ECONNREFUSED 127.0.0.1:9082`——第 44 轮 | 测试 | 下轮改「探活失败即 skip 并输出原因」 |
+| 10 | B-141-3 | P3 | 站点根 `/` = 404(`/admin`、`/frontend` = 302→200) | 运维 | 根路径重定向或落地页 |
+
+## 三、结构性缺口(需排期,非单点修复)
+
+1. **G11 CI 全量门禁**:`.gitlab-ci.yml` 后端全量仍为 observed 非阻断(`-Dtest=!${OBSERVED}`)→ 17 红可持续挂账。
+2. **G9 场景锚点 30.0%**(347 唯一 TC 中 104 可定位;严格口径 18.7%)→ 建议优先补 `parent.md`/`admin.md` 的 `TC-*` 注释。
+3. **G-148-4 后端覆盖率无凭据**:`pom.xml` 无 jacoco/pitest → 无法判「测了但没断言」。
+4. **G-148-6 可靠性**:无故障注入用例;本轮 `ConnectError → 500` 正是该类缺口实证。
+
+## 四、通知通道说明
+
+Agent Mail `GetMe` 仍返回 `not_bound`(连接器 connected,但邮箱未开通)→ 按纪律不重试。本通知以**仓库文件 + `blockers.md` 登记 + 推送 `origin/cfclub`** 作为送达载体。

+ 337 - 0
docs/tdd/orchestration/report-test-2026-11-11-R148.md

@@ -0,0 +1,337 @@
+# 测试负责人工作汇报(第 148 轮 · 2026-11-11 GMT+8)
+
+> 角色:cfc-tester(测试负责人)|执行档:**review(离线;内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化;langgraph 实派 192.168.16.251;未联网装依赖、未启停服务、未改生产代码)**
+> 基线 HEAD:`ffa97bf02`(跑前 = 跑后,零漂移)。窗口 `c9d6192a5..ffa97bf02` 共 8 文件变更,**排除 docs/ 与 cfc-web 构建元数据后为零**(`git diff --name-only` 实证)→ 后端本轮**强制实跑**(R147 为采信 R146)。
+> 节点分工:`189:4090` = 200 → **admin-desktop 实派 5/5**|`251:4096` = 200 → **langgraph pytest 实派 51 例**|`204:4090` = 000(B-95 第 19 轮)|本机 = fe/shop/health/dx + 三套 Jest + 根级黑盒
+> 结论:⚠️ **有条件通过** —— 后端 99.29%(17 红,与 R146/R145 逐类逐例一致 → **零回归第 8 次**);langgraph **50/51**(1 红为 LLM 上游 `ConnectError`,B-142-2 未完成第 2 轮绿 → **不销号**);浏览器 **28/28 + dx 2 skip**;全量 **3782 例 / 3727 过 = 98.55%**。
+> **变更触发**:langgraph 上轮 51/51 → 本轮 50/51(净 -1 过),全量 98.57% → 98.55% → **已 push + 通知研发**(见 §9)。
+
+---
+
+## 0. 基本信息(测试负责人模板)
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | `cfc-tester`(测试负责人) |
+| 汇报周期 | 2026-11-11(第 148 轮,跑测窗口 16:40–17:36) |
+| 负责模块/单元 | cfc-backend(全量实跑) · cfc-frontend(Jest 实跑) · cfc-web(Jest 实跑) · cfc-langgraph(251 实派) · 浏览器 E2E(admin@189 / frontend·shop·health·dx@本机) · 根级黑盒(实跑) |
+| 执行档 | review(离线;未装依赖、未启停服务、未改生产代码) |
+
+### 0.1 测试用例建设与执行
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数** | `0` 个 | `docs/superpowers/specs` / `tests/test-cases` / 场景池在窗口 `c9d6192a5..ffa97bf02` **零变更**(`git diff --name-only` 空)→ G12 合规,无需因变更更新用例 |
+| **本轮验证执行测试数** | `3782` 个 | 后端 2946 + 前端 616 + 管理端 116 + 根级 23 + langgraph 51 + 浏览器 30(含 dx 2 skip) |
+| **用例通过率** | `98.55%`(3727/3782) | 剔 skip 口径 **99.02%**(3727/3764);红 37 = 后端 17 + 前端 3 + 根级 16 + langgraph 1 |
+| **新增覆盖资产** | `0` 项 | 无 SRS 变更、无新契约文件;本轮无资产入库 |
+
+### 0.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数** | `2` 个 | ① 189:admin-desktop E2E(1.3m,5/5,`EXIT=0`);② 251:langgraph pytest(292.22s,50/51);其余本机直跑 |
+| **恢复智能体会话数** | `0` 个 | 无中断/重建 |
+| **当前在用会话数** | `3` 个 | 本机(done)/ 189 = shell(done)/ 251 = shell(done) |
+
+### 0.2b 各会话当前工作状态
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 耗时 | 工作目录 | 备注 |
+|----------|---------|----------|----------|------|----------|------|
+| 本机 | localhost | done | 浏览器 fe/shop/health/dx + Jest×3 + 根级 + 后端全量 | mvn 51:57 | `d:\cfc` | fe 6/6 (56.6s)、shop 4/4 (13.5s)、health 13/13 (8.5s,首跑 1 例 502 复跑转绿) |
+| 189:4090 | `sh_1c9c668a4…` | done | admin-desktop E2E | 81s | `C:\code\cfc\tests` | **5/5(EXIT=0)**;spec blob `4703d73fb` = 本机 |
+| 251:4096 | shell 直连(`setsid nohup` + 落盘) | done | langgraph pytest | 292.22s | `/sc-data/cfc/cfc-langgraph` | **50/51**;节点 HEAD `ffa97bf02` = 本机 |
+| 204:4090 | — | unknown(000) | 失联 | — | — | B-95 第 19 轮 |
+
+### 0.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数** | `1` 个 | **B-148-1(P2 运维)**:health 套件首跑 `TC-H-U01` 收到 **502**(复跑 13/13 全绿、直连 2/2 = 401)→ 网关/上游瞬抖,非鉴权缺陷;记观察项 |
+| **已解决测试相关问题数** | `0` 个 | 本轮无测试侧自闭环(零 SRS 变更、零装置类红) |
+| **待解决测试相关问题数** | `9` 类 | 后端 17 存量红 · 前端 3 预期 RED · 根级 16 环境红 · langgraph 1 环境红(ConnectError)· dx 2 端点 404(B-DX-1 第 10 轮)· 204 失联(B-95)· admin 鉴权门缺失(B-142-1 第 7 轮)· nutrition_age_dosage 建表失败(B-145-1 第 4 轮)· B-134-4 兜底伪装(本轮未触发) |
+
+### 0.4 本轮 git 提交与推送证据
+
+| 提交 sha | 关联键 | 阶段 | 触及文件 | 目标分支 | 已推送远端 | 备注 |
+|----------|--------|------|----------|----------|------------|------|
+| 见 §9 | R148 报告 + 通知 + 台账追加 | 测试闭环 | `docs/tdd/**` + `tests/e2e/_automation_reachability_result.json` | `cfclub` | 是 | 结果变化触发(langgraph -1 过、全量 98.57% → 98.55%) |
+
+---
+
+## 1. 项目画像(本轮复核)
+
+| 维度 | 内容 |
+|------|------|
+| 业务定位 | 家庭教育「浠艾福(XAF)」:家长端 / 孩子端 / 成长规划师端三视角 + 五维能量(身/心/智/行/富)+ 健康报告解析 + 商城 + 管理后台 |
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus(Java 8,`cfc-backend`,9082)· uni-app 小程序 Vue2(`cfc-frontend`)· Vue2 + Element UI(`cfc-web`,8082)· Python FastAPI + LangGraph(`cfc-langgraph`,9000)· 独立商城(`dan/danshop`,8888) |
+| 模块结构 | 后端 366 控制器 / 347 测试类 · 前端 40 套件 616 例 · 管理端 17 套件 116 例 · langgraph 51 例 · `tests/` 浏览器 30 + 根级黑盒 23 |
+| 关键路径 | 微信登录/建档 → 家庭与成员 → 五维能量 → 健康报告上传与解析 → 健康方案 → 任务编排 → 测评订单 → 支付/会员 → 管理端审核与配置 |
+| 测试现状 | 后端 347 类全量可跑(`-o -B clean test` 51:57);三套 Jest 全量可跑;浏览器 live 30 例;CI(`.gitlab-ci.yml`)存在但**后端全量为非阻塞**(阻断作业用 `-Dtest=!${OBSERVED}` 排除红类)→ G11 仍不达标 |
+| 质量目标 | 全量通过率 ≥98%、零未归因红、SRS 场景锚点可追溯、CI 全量门禁 |
+| 风险点 | ① 17 存量红长期挂账(EnergySystem 6 全 500 / 契约 3 / 支付会员 3 / 编排 2 / 平台费截断 1 / 分佣冷静期 1 / 微信登录 2);② 17 红中「产品类」已跨 8 轮零漂移 → 缺研发修复排期;③ `/api/admin/**` 鉴权门缺失 7 轮未修 |
+| 历史审查记录 | 上次 R147(16:05,HEAD `df4c2ab45`→`c21934790`):**有条件通过** 98.57%(3782/3728),langgraph **首次全绿 51/51**、后端采信 R146 99.29%。**本次为该对象第 148 次审查,非首次**;R147 遗留待复验项 = B-142-2(langgraph 51/51 疑似销号,需第 2 轮绿)。**本轮复验结果:50/51(1 红 ConnectError)→ 未达连续 2 轮绿 → 不销号**。历史结论仅作对照,本轮全部指标重新取证。 |
+
+---
+
+## 2. 20 类测试覆盖矩阵(三态 + 证据)
+
+> 「未发现」仅表示本轮扫描未命中,「待核实」表示证据不足或扫描受限;不得读作「项目没做」。
+
+| # | 测试类型 | 层次 | 判定 | 证据 |
+|---|----------|------|------|------|
+| 1 | 单元测试 | 功能层次 | 已发现 | `cfc-backend/src/test/java/**/unit` + service/controller 单测(347 类 / 2946 例实跑);前端 `__tests__/pages/**` 601 过 |
+| 2 | 组件测试 | 功能层次 | 已发现 | `cfc-frontend/__tests__/components/**`、`cfc-web/src/__tests__/views/**`(116 过);3 例预期 RED(健康方案摘要 / 收货人编辑 / 成长日分组) |
+| 3 | 集成测试 | 功能层次 | 已发现 | `integration/**`:`EnergySystemFlowTest` 6、`GuideModuleIntegrationTest` 1(E)、`OrchestrationIntegrationTest` 1 |
+| 4 | 契约测试 | 功能层次 | 已发现 | `DimensionRegistryMapContractTest` 3、`UserServiceWechatLoginContractTest` 1、`TeamProfitCronContractTest` 1、`tests/test-cases/*.md` 347 唯一 TC |
+| 5 | 接口 API 测试 | 功能层次 | 已发现 | `tests/playwright.config.api*.js` + `tests/e2e/api/**`(含 generated);线上 POST 鉴权探针 5/5 = 401 |
+| 6 | 冒烟测试 | 功能保障 | 已发现 | `playwright.config.smoke.js`、`tests/e2e-live/frontend-live.spec.js` TC-F-U01(首页可渲染)每轮执行 |
+| 7 | 回归测试 | 功能保障 | 已发现 | 本轮后端全量 347 类实跑 + 三套 Jest + 浏览器 30 例 = 全量回归;与 R146/R145 逐类逐例零漂移(第 8 次) |
+| 8 | 验收测试(UAT) | 功能保障 | 待核实 | `tests/test-cases/{parent,child,teacher,admin,vendor,guest,butler}.md` 有验收口径,但**无 UAT 执行记录/签署**;线上 admin 5/5 属技术验收非业务 UAT |
+| 9 | BDD / 场景规格 | 功能保障 | 待核实 | 场景池 215 条、被 TC 覆盖 155(72.1%)、spec 字面命中 33(15.3%);**无 Gherkin feature 文件**(`grep -c "Feature:"` 为空) |
+| 10 | 探索性测试 | 功能保障 | 未发现 | 无探索性会话章程/记录(仓库内零 charter 文档);本自动化未做人工探索 |
+| 11 | 性能测试 | 非功能 | 未发现 | 无 k6/JMeter/Gatling 脚本;仅有 `SLOW_REQUEST` 日志(本轮 14.99s chat)作被动感知;压测需联网未授权 |
+| 12 | 可靠性测试 | 非功能 | 待核实 | 有熔断/兜底代码(`AiGateway`)与 `OrchestrationPollingJob` 轮询,但**无故障注入/长稳测试**;本轮 langgraph `ConnectError` → 500 暴露兜底不足(1 例) |
+| 13 | 安全测试 | 非功能 | 已发现(含缺陷) | 线上匿名鉴权探针 5/5 = 401(mind/energy/health-plan/huawei/xiaomi);**`/api/admin/families/overview` 匿名 200 + code:400(B-142-1 第 7 轮)**;`SECURITY_REVIEW_2026-11.md` 存在;SAST 无流水线集成 |
+| 14 | 兼容性测试 | 非功能 | 未发现 | 无多浏览器/多设备矩阵(`playwright.config.live.js` 仅 chromium 单通道:admin-desktop / frontend-mobile 两种视口) |
+| 15 | 可用性测试 | 非功能 | 未发现 | 无真实用户可用性评估记录 |
+| 16 | 无障碍测试 | 非功能 | 未发现 | 无 axe-core / WCAG 规则集;浏览器用例未断言 aria 属性 |
+| 17 | 测试覆盖率 | 度量 | 已发现(含缺口) | 前端 `test:coverage` 可跑(管理端已产出 10.09/6.12/7.50/9.97);**后端 `pom.xml` 无 jacoco / pitest(`grep -c` = 0)** → 后端行覆盖无凭据 |
+| 18 | 变异测试 | 度量 | 未发现 | 无 PIT / Stryker 配置与报告 |
+| 19 | 质量指标与缺陷度量 | 度量 | 已发现 | `docs/tdd/test/blockers.md`(B-* 台账 721 行)、`automation-status.md`、`test_attr.py` 三层归因(装置/产品/数据) |
+| 20 | QA 流程与 CI/CD 门禁 | 流程 | 部分已发现 | `.gitlab-ci.yml` 存在(build/test/observed 多作业),但**后端全量为非阻断**、langgraph / Playwright 仅在 observed 作业 → G11 ❌ |
+
+**矩阵小结**:已发现 11 类、待核实 3 类(UAT / BDD / 可靠性)、未发现 6 类(探索性 / 性能 / 兼容性 / 可用性 / 无障碍 / 变异)。
+
+---
+
+## 3. 测试方案(本轮执行口径)
+
+| 项 | 内容 |
+|----|------|
+| 目标 | 全量用例可跑、红例可归因、SRS 零变更即零新增、双节点派发可用 |
+| 范围 | 后端全量(强制实跑)· 三套 Jest · 浏览器 live 30 · langgraph 51 · 根级 23 · 线上鉴权 5 探针 · 路由/根路径 3 探针 |
+| 执行档 | review(离线白名单);压测/漏洞库扫描需联网 → 未授权未执行 |
+| 排除项 | ① `tests/qna`(B-141-1:`from src.qna import` 缺模块,收集期中断);② `tests/test_chat.py`(口径与历轮一致,避免 LLM 抖动污染计数);③ dx-bridge 2 例(端点 404 → 设计为 skip) |
+| 节点约束 | 每节点单任务:189 仅 admin-desktop;251 仅 langgraph pytest;本机承担其余 |
+
+---
+
+## 4. 执行结果
+
+### 4.1 后端全量(实跑 · `mvn -o -B clean test`,JDK 1.8.0_25 + Maven 3.6.1)
+
+| 指标 | 数值 |
+|------|------|
+| 耗时 | **51:57**(主源 2121 编译 + 353 测试源 0 错) |
+| 类 / 例 | **347 类 / 2946 例** |
+| 通过 | **2925** |
+| 失败 / 错误 / 跳过 | 16 F + 1 E + 4 S |
+| 通过率 | **99.29%**(剔 skip 99.42%) |
+| 产物完整性 | 347/347 XML 全产出、`*.dump` = 0、`target/classes` 2330 |
+| 恒等式 | `@Test 2935 − @Disabled 4 + 参数化净增 15 = 2946` ✅ 误差 0 |
+| 与 R146/R145 对比 | 类/例/红完全一致,**红类集合差集为空 → 零漂移第 8 次** |
+
+**17 红三层归因(10 类)**
+
+| 桶 | 数量 | 明细 |
+|----|------|------|
+| B 产品 | 14 | EnergySystem 6(5×500 + 1×5001)· Orchestration 2 · UserServiceWechatLogin 2 · MembershipPay 1 · PaymentORD 1 · TeamProfitCron 1 |
+| 契约待裁决 | 3 | DimensionRegistryMapContractTest 3(P-9 第 10 轮) |
+| C 数据 | 1 | GuideModuleIntegrationTest(`MysqlDataTruncation` 平台费超列宽) |
+
+### 4.2 其余套件
+
+| 套件 | 结果 | 备注 |
+|------|------|------|
+| cfc-web(Jest) | **116/116**(17 套件,26.7s) | 零漂移 |
+| cfc-frontend(Jest) | **616:601 过 / 3 红 / 12 跳**(27.1s) | 3 红全为 S-cfc-30/52/53 契约(预期 RED,组件未交付) |
+| 根级黑盒(tests/jest.config.js) | **23:7 过 / 16 红**(8.7s) | 16 红全 `ECONNREFUSED 127.0.0.1:9082`(本机后端未起)→ B-36 第 44 轮 |
+| langgraph@251(pytest) | **51:50 过 / 1 红**(292.22s) | 1 红:`test_auto_tag_short_content` → `chat` 返回 500,根因 `ConnectError('All connection attempts failed')` |
+| 浏览器 live@本机 | fe **6/6**(56.6s) · shop **4/4**(13.5s) · health **13/13**(8.5s,复跑) | health 首跑 1 例 502(B-148-1) |
+| 浏览器 live@189 | admin **5/5**(81s,`EXIT=0`) | spec blob `4703d73fb` = 本机 → 结论可比 |
+| dx-bridge | 2 skip | 端点 404(B-DX-1 第 10 轮) |
+
+### 4.3 线上探针
+
+| 探针 | 结果 |
+|------|------|
+| 匿名 `POST /api/mind/fortune` | 401 |
+| 匿名 `POST /api/energy/overview` | 401 |
+| 匿名 `POST /api/health/plan/list` | 401 |
+| 匿名 `POST /api/huawei-health/auth-url` | 401(2/2;浏览器首跑曾 502) |
+| 匿名 `POST /api/xiaomi-health/auth-url` | 401 |
+| 匿名 `POST /api/admin/families/overview` | **200 + `{"code":400,"message":"请求参数格式错误"}`** → B-142-1 |
+| `/admin` `/frontend` `/` | 302 / 302 / 404 |
+| `251:4096` / `189:4090` / `204:4090` | 200 / 200 / **000** |
+
+---
+
+## 5. 覆盖缺口清单
+
+| 编号 | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|------|----------|------|------|--------------|--------|----------|
+| G-148-1 | 场景锚点(G9) | 唯一 TC **347**,脚本口径锚点 **104(30.0%)**;严格口径(仅测试资产、排除 generated)**65(18.7%)** | SRS 场景无自动化凭据,回归靠人工 | 按 `tests/test-cases/*.md` 逐条在 e2e-live / 契约测试内挂 `TC-*` 注释,优先 `parent.md`/`admin.md` | P1 | 每轮提升 ≥3pp,达 95% 封板 |
+| G-148-2 | 场景-用例映射 | 场景 215,被 TC 覆盖 155(72.1%);spec 字面 33(15.3%) | 60 条场景无用例,需求变更易漏测 | 先补 07-five-dimension / 08-butler 两域剩余场景的 TC 条目(各 17 / 10 条) | P1 | 映射率 ≥90% |
+| G-148-3 | 异常流覆盖 | TC 837 条,异常流 498(59.5%) | 异常分支漏测 | 对支付/会员/健康解析三条链路补异常流用例(超时、重复回调、非法载荷) | P2 | 异常流占比 ≥70% |
+| G-148-4 | 后端覆盖率凭据 | `pom.xml` 无 jacoco / pitest(grep = 0) | 无行/分支覆盖数据,无法判「测了但没断言」 | pom 增 jacoco 插件(离线可用),生成 `target/site/jacoco` | P1 | 每轮产出覆盖率报告并入库 |
+| G-148-5 | 变异测试 | 无 PIT / Stryker | 断言强度未知(`assertNotNull` 类弱断言可能放过缺陷) | 对 `service/**` 抽样 3 个包做 PIT(离线 mvn 插件) | P2 | 变异杀灭率 ≥60% |
+| G-148-6 | 性能/可靠性 | 无压测脚本、无故障注入 | 上游故障时 `chat` 直返 500(本轮 1 例实证) | ① 对 `/api/v1/chat` 做上游断开注入,断言降级响应而非 500;② 记录 P95 基线 | P1 | 故障注入用例 ≥6 条并全绿 |
+| G-148-7 | 兼容性/无障碍 | 仅 chromium 单通道、无 axe | 多设备/读屏不可用风险 | 增 `--project=webkit/mobile-safari` 与 axe-core 断言(需联网装浏览器 → 未授权) | P2 | 兼容矩阵 ≥3 引擎 |
+| G-148-8 | CI 全量门禁(G11) | `.gitlab-ci.yml` 后端全量为非阻断(`-Dtest=!${OBSERVED}`) | 红例不阻断合并 → 长期挂账 17 红 | 红例清零后把 `backend-observed-junit` 转 blocking;先加「新增红例即失败」基线条 | P0 | CI 阻断全量后端 |
+
+---
+
+## 6. 域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|----------|----------|------|----------|
+| 单元·组件级 | 苏雅 | ⚠️ 有条件通过 | 后端 2925/2946(99.29%)、前端 601/616;3 例预期 RED;后端无 jacoco/pitest |
+| 集成·接口级 | 柯砚 | ❌ 不通过 | 集成红 8(EnergySystem 6 + Orchestration 2)、契约红 3、数据截断 1;线上鉴权 5/5 = 401 但 `/api/admin/**` 缺门 |
+| 系统·验收级 | 白樾 | ⚠️ 有条件通过 | 浏览器 28/28 + 2 skip;UAT 无签署记录;dx-bridge 2 端点 404 |
+| 测试保障级 | 闻朔 | ⚠️ 有条件通过 | 冒烟/回归齐备(每轮全量);探索性测试无章程;B-36 根级 16 红环境型 |
+| 性能·可靠性 | 骆骋 | ❌ 未实测(降级) | 无压测脚本;langgraph `ConnectError` → 500 暴露无降级;压测需联网未授权 |
+| 安全 | 关屿 | ⚠️ 有条件通过 | 5/5 探针 401;**B-142-1 admin 鉴权门缺失第 7 轮**;SAST 未入流水线 |
+| 兼容·体验 | 阮清 | ⚠️ 有条件通过 | 双视口(desktop/mobile)可跑;无多引擎/无障碍断言 |
+| 流程·度量·代码 | 何序 | ⚠️ 有条件通过 | 台账/归因齐备;CI 后端全量非阻断;7 轮未修项仍挂账 |
+
+---
+
+## 7. 五要素问题清单
+
+### 问题 1|`/api/admin/**` 鉴权门缺失(B-142-1,第 7 轮)
+1. **问题描述**:匿名 `POST /api/admin/families/overview` 返回 HTTP 200 + `code:400`,而同窗口对照组 `/api/energy/overview`、`/api/health/plan/list`、`/api/mind/fortune` 均 401。
+2. **测试 bug 点**:`cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java`(放行清单未覆盖 `/api/admin/families/**`);用例 `tests/e2e-live/health-contract.spec.js:41` 同类契约未覆盖 admin 域。
+3. **最优修改方案**:把 `/api/admin/**` 纳入拦截器保护(仅保留登录/验证码等 8 个公开路径),并在 `tests/e2e-live/` 增 `admin-auth-contract.spec.js` 断言 401。
+4. **修改目的**:消除越权面,保证「未鉴权一律 401」全局不变式。
+5. **能否闭环**:能。复测:匿名 POST 该端点 → 401;回归跑 admin-desktop 5 例 + 契约 1 例全绿。
+
+### 问题 2|`nutrition_age_dosage` 建表恒失败(B-145-1,第 4 轮)
+1. **问题描述**:`schema.sql:5343` 建表体含 `INDEX idx_product (product_id)`,但该表无 `product_id` 列 → DDL 恒失败;`DatabaseInitializer` catch 后仍打印「数据表检查完成」,表从未创建。
+2. **测试 bug 点**:`cfc-backend/src/main/resources/schema.sql:5354`;`DatabaseInitializer.runMigrations()` 缺失该表存在性校验。
+3. **最优修改方案**:删除无效索引(或补 `product_id BIGINT` 列 + 外键语义),并在 `DatabaseInitializer` 增「建表失败即抛错」严格模式。
+4. **修改目的**:保证 schema 与运行库一致,避免功能静默不可用。
+5. **能否闭环**:能。复测:启动日志零 `SQLSyntaxErrorException`;`SHOW TABLES LIKE 'nutrition_age_dosage'` 命中;增 1 条 DDL 自检用例。
+
+### 问题 3|langgraph LLM 上游不可达导致 500(B-142-2,第 7 轮)
+1. **问题描述**:`tests/test_auto_tag.py::test_auto_tag_short_content` 断言 `chat` 200,实得 500;日志 `ConnectError('All connection attempts failed')`、`加载提示词 intent_classifier 失败`、`SLOW_REQUEST 14.99s`。
+2. **测试 bug 点**:`cfc-langgraph/tests/test_auto_tag.py:93`(断言硬编码 200,无降级分支);`app/middleware.py:113` 直接把上游异常抛成 500。
+3. **最优修改方案**:① 服务侧对 LLM 上游故障返回 503 + 结构化 `code`,并短时熔断;② 用例侧对「环境不可用」与「逻辑错误」分流(`pytest.mark.env`),环境红不计入逻辑门禁。
+4. **修改目的**:把「上游抖动」与「代码回归」解耦,避免每轮重复误判。
+5. **能否闭环**:能。复测:断开上游 → 断言 503(非 500);上游恢复 → 51/51 全绿连续 2 轮后销号。
+
+### 问题 4|`intent_classifier` 兜底把上游故障伪装成分类错误(B-134-4,第 11 轮)
+1. **问题描述**:`intent_classifier` 捕获异常后默认 `chat`,429/401 被伪装为「分类正确」;本轮上游 `ConnectError` 同样被吞(仅 middleware 记录)。
+2. **测试 bug 点**:`cfc-langgraph/app/intent_classifier.py:62`(`except → return "chat"` 无告警上抛)。
+3. **最优修改方案**:异常路径返回 `degraded=True` 并写结构化日志(含状态码),用例断言 `degraded` 而非仅断 intent。
+4. **修改目的**:让「降级」可见,避免红例被静默转绿。
+5. **能否闭环**:能。复测:注入 429 → 响应含 `degraded:true` 且日志带 429;正常路径 intent 5/5 绿。
+
+### 问题 5|EnergySystem 集成 6 红(全 500)
+1. **问题描述**:`EnergySystemFlowTest` 6 例中 5 例期望 200 实得 500,1 例期望 500 实得业务码 5001。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java`(overview/logs/exchange/task 四链路)。
+3. **最优修改方案**:先取 surefire 堆栈定位根因(跨 8 轮未变,疑 DB 初始化或能量账户缺失),再决定修产品或修夹具;若为数据前置缺失,用例侧补 `@Sql` 造数。
+4. **修改目的**:恢复五维能量核心链路可验证性(当前等于该链路零有效覆盖)。
+5. **能否闭环**:能。复测:该类 6/6 绿,且全量红数 17 → 11。
+
+### 问题 6|DimensionRegistryMap 契约 3 红(P-9 第 10 轮,待裁决)
+1. **问题描述**:`map_emptyLegacy_returnsNullData` 期望 `data=null` 实得 `""`;`map_missingLegacy_returnsBadRequest` 期望 400 实得 200;`map_unknownLegacy_returnsNullData` 期望 null 实得原值透传。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java`(3 例)。
+3. **最优修改方案**:由产品/研发就「缺参是否 400、未知 legacy 是否透传」拍板,按裁决要么改实现要么改契约断言(P-9 需给出书面结论)。
+4. **修改目的**:消除「契约未定 → 测试常红」的噪音,恢复红例可归因性。
+5. **能否闭环**:能。复测:该 3 例与裁决一致;红类数 10 → 9。
+
+### 问题 7|平台费字段截断(`MysqlDataTruncation`)
+1. **问题描述**:`GuideModuleIntegrationTest.testGuidePackageCreationFlow:63` 抛 `Data truncation: Out of range value`(平台费超列宽)。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/integration/GuideModuleIntegrationTest.java:63`;对应列定义在 `schema.sql` 分佣/平台费表。
+3. **最优修改方案**:列宽 `DECIMAL(10,2)` → `DECIMAL(18,4)`(或按金额上限评估),并同步 `schema.sql` 与迁移脚本。
+4. **修改目的**:金额计算不因列宽静默失败(财务类高风险)。
+5. **能否闭环**:能。复测:该类 1/1 绿;金额边界用例(1e8 级)新增 2 条。
+
+### 问题 8|前端 3 例预期 RED(S-cfc-30/52/53 契约)
+1. **问题描述**:`health-plan-summary.vue`、`consignee-edit.vue`、`growthHistory.dayGroupView` 契约测试引用的组件/方法未交付,3 例常红。
+2. **测试 bug 点**:`cfc-frontend/__tests__/pages/{health-plan,growth-main}/**`、`signature.consignee.test.js:172`。
+3. **最优修改方案**:研发按 S-cfc-30/52/53 交付组件;测试侧把 3 例标记 `test.todo` 或 `describe.skip`(带契约 ID),交付后解除。
+4. **修改目的**:让「预期 RED」与「真回归」在报表上可区分,避免污染 G3。
+5. **能否闭环**:能。复测:组件交付后 3 例转绿,前端 616/616。
+
+### 问题 9|根级黑盒 16 红(环境型,B-36 第 44 轮)
+1. **问题描述**:`tests/integration/*.spec.js` 16 例全 `ECONNREFUSED 127.0.0.1:9082`(本机未起后端)。
+2. **测试 bug 点**:`tests/jest.config.js` 的 baseURL 固定本机 9082,无 skip 条件或外部实例回退。
+3. **最优修改方案**:增「后端探活 → 不可达则 `describe.skip` 并输出 skip 原因」,或指向内网实例(`cfc.iwintrue.com`)。
+4. **修改目的**:避免 16 条环境红每轮刷屏,掩盖真实回归信号。
+5. **能否闭环**:能。复测:后端未起 → 输出 16 skip(带原因);起后端 → 16 通过。
+
+### 问题 10|网关瞬抖致健康契约首跑 1 红(B-148-1 新)
+1. **问题描述**:`TC-H-U01 POST /api/huawei-health/auth-url` 首跑收到 **502**(断言只允许 401/403);同一时刻直连 2/2 = 401,套件复跑 13/13 绿。
+2. **测试 bug 点**:`tests/e2e-live/health-contract.spec.js:51`(未区分「网关 5xx」与「鉴权放行」)。
+3. **最优修改方案**:断言前对 502/503 做 1 次重试(≤2 次,退避 1s),仍 5xx 则 `test.fixme` 并标注「网关不可用」;或断言集合加「5xx 视为环境不可用 → skip 并按环境红计数」。
+4. **修改目的**:区分部署/网关故障与鉴权缺陷,避免误报安全回归。
+5. **能否闭环**:能。复测:注入 502 → skip 且报告标注环境;正常 → 13/13 绿。
+
+---
+
+## 8. 门禁结论
+
+| 门禁 | 指标 | 阈值 | 实测 | 判定 |
+|------|------|------|------|------|
+| G1 | 全量通过率 | ≥98% | **98.55%**(3727/3782) | ✅ |
+| G2 | 零未归因红 | 0 | 37 红(已三层归因,但未清零) | ❌ |
+| G3 | 前端预期 RED | ≤3 | 3(S-cfc-30/52/53) | ⚠️ |
+| G4 | 管理端全绿 | 116/116 | 116/116 | ✅ |
+| G5 | 编译与产物完整性 | 0 错 / 全 XML | 2121+353 源 0 错;347/347 XML;dump 0 | ✅ |
+| G6 | 浏览器 live | 28/28 | 28/28 + 2 skip | ✅ |
+| G7 | langgraph | 0 红 | 50/51(1 红 ConnectError) | ❌ |
+| G8 | 线上鉴权 | 5/5 = 401 | 5/5 = 401(admin 域另计) | ✅ |
+| G9 | SRS 场景锚点 | ≥95% | 30.0%(脚本口径 104/347)/ 18.7%(严格口径) | ❌ |
+| G10 | 双节点派发 | 均可用 | 189 ✅ 5/5(81s)· 251 ✅ 51 例(292s) | ✅ |
+| G11 | CI 全量门禁 | 阻断 | 后端全量为 observed 非阻断 | ❌ |
+| G12 | SRS 变更合规 | 变更即更新 | 窗口零变更 → 零新增用例 | ✅ |
+
+**最终结论:⚠️ 有条件通过**
+
+- 通过依据:G1 98.55% ≥ 98%、G4/G5/G6/G8/G10/G12 达标;后端与 R146/R145 **逐类逐例零漂移(第 8 次)**,说明本轮无新增回归。
+- 保留条件:① G2 37 红须清零(其中 17 后端红已挂账 8 轮,需研发排期);② G7 langgraph 1 红须连续 2 轮绿后方可销号;③ G9 锚点、G11 CI 门禁属结构性缺口,需按 §5 逐项闭环。
+- **不放行结论**:G2/G9/G11 三项未达阈值,故不判「通过」;但因无新增回归、核心链路(登录/家庭/能量/健康/商城/后台)均可用,判「有条件通过」,可否上线由用户与研发团队决定。
+
+---
+
+## 9. 变更、提交与通知
+
+| 项 | 内容 |
+|----|------|
+| 变更判定 | **有变化**:langgraph 51/51 → **50/51**(-1 过,ConnectError 环境红);全量 98.57% → **98.55%**;新增 B-148-1;其余套件零漂移 |
+| 提交范围 | `docs/tdd/orchestration/report-test-2026-11-11-R148.md`、`docs/tdd/automation-run-2026-11-11-R148.md`、`docs/tdd/notice-2026-11-11-R148-研发通知.md`、`docs/tdd/test/blockers.md`(追加 R148 段)、`docs/tdd/test/automation-status.md`(附录 R148) |
+| 推送分支 | `origin/cfclub`(`--autostash` rebase 后推,核验 `git branch -r --contains`) |
+| 研发通知 | Agent Mail `GetMe` → 仍 `not_bound`(连接器 connected 但邮箱未开通,按纪律不重试)→ 以 `notice-2026-11-11-R148-研发通知.md` + `blockers.md` + 推送为通知载体 |
+
+---
+
+## 附录 A:本轮命令(可复现)
+
+```bash
+# 环境探针
+/d/jdk1.8.0_25/bin/java -version && /d/maven/apache-maven-3.6.1/bin/mvn -v   # 1.8.0_25 / 3.6.1
+# 后端全量
+cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test   # 51:57
+# 三套 Jest
+cd cfc-web && npx jest --silent                       # 116/116
+cd cfc-frontend && npx jest --silent                  # 616 = 601/3/12
+cd tests && npx jest -c jest.config.js --silent       # 23 = 7/16
+# 浏览器(必须在 tests/ 内跑,否则 @playwright/test 双版本报 test.describe() called here)
+cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --reporter=list  # 6/6
+cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --reporter=list         # 4/4
+cd tests && npx playwright test -c playwright.config.health.js --reporter=list                          # 13/13
+node _r146_189.cjs admin    # 189 admin-desktop 实派 5/5(81s,EXIT=0)
+node _r148_lg.cjs kick      # 251 langgraph pytest 实派 51 例(292.22s,50 过)
+# 度量
+python docs/tdd/tools/test_report_metrics.py --repo-root . --scene --out-json _r148/metrics.json
+```
+
+## 附录 B:口径声明
+
+- 后端红数口径:`Tests run: 2946, Failures: 16, Errors: 1, Skipped: 4`(surefire 汇总,与 347 XML 逐类核对一致)。
+- 后端基线纯度:`cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleTagsContractTest.java` 为**未跟踪文件**(仍被编译执行)→ 本轮「347 类」含该文件,HEAD 纯度为 **346 类 / 2935 例**;历轮同口径,未影响可比性。
+- langgraph 口径:`--ignore=tests/qna --ignore=tests/test_chat.py`(B-141-1 阻断 + 历轮排除项),51 例。
+- 浏览器口径:28 过 + dx 2 skip = 30。
+- G9 两套口径并存(脚本 30.0% / 严格 18.7%),差异根因见 B-124;本轮判定取较宽的脚本口径仍远低于阈值。

+ 186 - 0
docs/tdd/orchestration/report-test-2026-11-11T1042.md

@@ -0,0 +1,186 @@
+# [测试闭环·每小时] 2026-11-11 10:42 轮(review 档,内网已授权)— ⛔ 有条件通过;cfc-web 双绿零漂移 / cfc-frontend 红 16→3(预期 RED 非回归)/ 后端 test-compile GREEN / E2E 探针 2/2 / SRS 闸门闭合跳过编写
+
+> 执行档:**review 档(已授权内网 + 测试用例编写)**。本小时未访问任何外部公网;为守「禁止访问外部公网」约束,cfc-frontend 运行显式排除 `api.test.js`、`config.test.js`(P-9 公网外联,R139 起已知缺口)。
+>
+> 主理人:软件测试专家团 · 陆谨(测试负责人)。只读审查 + 内网受限 E2E + 依据 SRS/需求闸门编写用例(本小时闸门闭合,未落库)。**未修改、未提交、未推送任何生产源码或被审查代码。**
+
+---
+
+## 一、执行范围(Execution Scope)
+
+| 项 | 本小时实测 / 引用 |
+|---|---|
+| cfc-web 单元·组件测试(Jest,覆盖率) | ✅ 实测 |
+| cfc-frontend 单元·组件·契约测试(Jest,排除 2 个公网套件) | ✅ 实测 |
+| cfc-backend 离线编译信号(`mvn -o test-compile`) | ✅ 实测 |
+| cfc-backend 全量单测 + JaCoCo(需 MySQL 3306) | ⛔ 引用 R142 基线(MySQL 本地 CLOSED,未重跑) |
+| 内网 E2E 无登录可达性探针(`/admin`、`/frontend`) | ✅ 实测(Playwright 1.63.0,hosts→192.168.16.251) |
+| 登录态 E2E 业务流(需凭据) | ⛔ 待核实(无 MACHINE_JSON_PATH 凭据) |
+| LangGraph 9000 / 浏览器登录态 E2E(需 AI+凭据) | ⛔ 引用 R142 基线(未重跑) |
+| 安全 SAST/DAST、依赖漏洞、性能压测(execute 档·公网) | ⛔ 未授权未执行 |
+
+## 二、用例总数 · 通过 · 失败
+
+| 套件 | 用例总数 | 通过 | 失败 | 跳过 | 说明 |
+|---|---|---|---|---|---|
+| **cfc-web**(Jest,17 套件) | 116 | 116 | 0 | 0 | 全绿,零漂移(基线 10.07%/6.08%/7.48%/9.94%) |
+| **cfc-frontend**(Jest,排除 2 公网套件后 38 套件) | 466 | 451 | **3** | 12 | 3 失败 = TDD 预期 RED(S-cfc-53 ×2、S-cfc-134 ×1),**非回归** |
+| cfc-backend 全量(引用 R142 基线,347 类) | 2946 | 2929 | 17 | — | 17 红 = 存量零回归(TDD-RED + 历史债),未连库重核实 |
+| 内网 E2E 探针 | 2 | 2 | 0 | — | `/admin` 200(登录墙)、`/frontend` 200(渲染) |
+
+**覆盖率**:cfc-web 语句 10.08% / 分支 6.06% / 函数 7.48% / 行 9.95%(与 R139 基线一致,远低于 20% 门禁)。后端 JaCoCo:N/A(MySQL 不可达,离线缺产物)。
+
+## 三、历史审查记录(对照,非本次结论依据)
+
+- 本对象**已有历史审查记录**,非首次。
+- 上次本对象轮(本自动化记忆)= **R139 @ 2026-11-11 06:16**(`abdb2d6de`)。
+- 两轮间(06:16→10:42)`git` 提交 **34 个**,其中 R140/R141/R142 为 TDD 编排闭环轮(已提交完整后端全量 / langgraph / 浏览器 E2E 结果),作为**相邻基线引用**,非本小时重跑。
+- 本次为 R139 之后本自动化的第 1 次重跑,结论与 R142 稳态持平、且前端较 R139 **改善**(预期 RED 16→3)。
+
+## 四、项目画像(速览,源自 AGENTS.md)
+
+- **业务**:浠艾福 XAF —— 家庭教育 / 五维能量(身·心·智·行·富)/ 双角色(家长⇄孩子视角)/ 成长规划师 / 测评订单 / 健康报告解析 / 饮食推荐 / 商城。
+- **技术栈**:cfc-backend(Spring Boot 2.7.18 + MyBatis-Plus + Java 8,9082);cfc-frontend(uni-app 微信小程序,Vue2);cfc-web(Vue2 + Element UI 管理端,8082);dan/danshop(商城 8888);cfc-langgraph(Python FastAPI + LangGraph + ChromaDB,9000,生产 ai.etotem.com.cn)。
+- **约定**:统一 `@PostMapping`、JWT Bearer、`Result<T>`、`@Resource`、`DatabaseInitializer` 迁移唯一入口、新增接口先查 `API_REFERENCE.md`、AI 统一走 `AiGateway`。
+- **关键路径(可测)**:登录/鉴权、家庭/成员、健康报告上传解析、饮食推荐、商城下单、测评订单、文章/标签、admin 运营统计。
+
+## 五、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
+
+| # | 类型 | 三态 | 证据 / 备注 |
+|---|---|---|---|
+| 1 | 单元测试 | 已发现 | cfc-web 116 例、cfc-frontend 组件单测、backend 单测(R142 基线) |
+| 2 | 组件测试 | 已发现 | cfc-frontend Vue 组件契约测试(signature/growth-main 等) |
+| 3 | 集成测试 | 已发现(引用) | backend 集成/契约测试;本小时仅 test-compile 实测,全量引用 R142 |
+| 4 | 接口/API 测试 | 已发现 | API_REFERENCE 契约 + backend ContractTest + E2E api 规格 |
+| 5 | 端到端测试 | 已发现(部分) | tests/e2e/*.spec.js + 无登录探针 2/2;登录态业务流待核实 |
+| 6 | 冒烟测试 | 已发现 | ci-smoke.spec.js + 可达性探针 |
+| 7 | 回归测试 | 已发现 | 每小时 Jest 重跑即回归;本小时无新增回归 |
+| 8 | 探索性测试 | 未发现 | 无专项探索性资产 |
+| 9 | 验收/UAT | 未发现 | 无独立 UAT 套件(部分 e2e 接近验收) |
+| 10 | 性能测试 | 未实测 | execute 档·公网,未授权 |
+| 11 | 可靠性测试 | 待核实 | langgraph health 引用 R142;需 AI+凭据 |
+| 12 | 安全测试(SAST/DAST) | 未实测 | 依赖漏洞/DAST 公网,未授权 |
+| 13 | 兼容性测试 | 未发现 | 无专项资产 |
+| 14 | 可用性测试 | 未发现 | 无专项资产 |
+| 15 | 无障碍测试 | 未发现 | 无专项资产 |
+| 16 | 测试覆盖率 | 部分已发现 | cfc-web 实测 ~10%(低);backend JaCoCo 待核实 |
+| 17 | 变异测试 | 未发现 | 无变异测试资产 |
+| 18 | 契约测试 | 已发现 | ArticleTagsContractTest、AdminFamilyStatsContractTest(R142 9/9) |
+| 19 | QA 流程 | 已发现(部分) | git 闸门 + TDD 状态机;CI 门禁未固化(G11) |
+| 20 | 全项目代码审查 | 待核实 | 本小时聚焦测试执行+闸门;全项目代码审查为独立 Phase,未在本小时执行 |
+
+## 六、测试方案(review 档)
+
+- **目标**:每小时回归验证前端双栈 + 后端离线编译信号 + 内网可达性;依据 SRS/需求闸门增量编写用例;不触碰生产源码。
+- **范围**:cfc-web / cfc-frontend Jest(排除公网套件)、backend `test-compile`、内网无登录 E2E 探针。
+- **排除**:后端连库全量 + JaCoCo、登录态 E2E、langgraph 9000、安全/性能/依赖扫描(均降级并登记)。
+- **优先级**:P0 回归零漂移 → P1 覆盖率门禁 → P2 鉴权/安全缺口 → P3 未授权项。
+
+## 七、SRS / 需求变更闸门(测试用例编写决策)
+
+- 检测方式:`git log --since="2026-11-11 06:16" --name-only` 对 `docs/tdd/SRS.md | docs/需求分析 | docs/superpowers/specs | API_REFERENCE.md` → **零命中**。
+- `find -newermt` 曾标记 `API_REFERENCE.md` mtime 较新,已核对:**其最近真实提交为 `5f7cb6b013`(2026-11-11 01:12,早于本对象上次轮 06:16)**,属 checkout/pull 触发的 mtime 误报,内容无新增;该 `/api/admin/families/stats` 端点契约已由 R142 的 `AdminFamilyStatsContractTest 9/9` 覆盖。
+- **结论:闸门闭合 → 本次无需求文档变更,跳过测试用例编写,零仓库抖动。**
+
+## 八、覆盖缺口清单
+
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|---|---|---|---|---|
+| 覆盖率 <20% | cfc-web 10.08%;backend JaCoCo N/A | 未测分支多 | 扩充 cfc-web 组件/工具用例;backend 连库 + JaCoCo 阈值 | P1 | 重跑覆盖率 ≥20% / 后端 ≥80% |
+| 后端全量未重测(17 红) | MySQL 3306 DOWN,引用 R142 | 真红未核实 | 内网 MySQL 可达环境 `mvn test` + surefire/jacoco | P1 | 红例差集空或仅预期 RED |
+| 登录态 E2E 未跑 | 无凭据 | 业务流未验证 | 注入 MACHINE_JSON_PATH 凭据跑通业务流 | P2 | 业务流绿 + 无 401 绕过 |
+| admin 整族鉴权门缺失(B-142-1) | R142 标记,未重核 | P2 安全 | 后端鉴权单测覆盖 admin 族接口 | P2 | 无越权 + 单测绿 |
+| P-9 公网外联(api/config.test.js) | 离线仍发外联 | 违反离线约束 | mock 外部域名 / CFC_OFFLINE 守卫 | P2 | CFC_OFFLINE=1 下 0 真实外联 |
+| 安全/性能/依赖扫描 | 未授权 | 未知 | 授权后离线/内网执行 | P3 | 零高危 + 压测达标 |
+| 无 CI 固化(G11) | .gitlab-ci 未固化测试门禁 | 回归遗漏 | CI 加 mvn/jest/覆盖率/E2E 门禁 | P3 | CI 红阻断合并 |
+
+## 九、域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|---|---|---|---|
+| 单元·组件 | 苏雅 | ✅ 通过(零漂移) | cfc-web 116/116、cfc-frontend 451/466(3 预期 RED) |
+| 集成·接口 | 柯砚 | ⛔ 引用基线/未重跑 | backend test-compile GREEN;全量引用 R142 99.29% |
+| 系统·验收 | 白樾 | ⚠️ 部分(无登录探针 2/2) | 登录态业务流待核实 |
+| 测试保障 | 闻朔 | ✅ 零漂移 | 双栈 Jest 重跑无新增回归;红例差集空 |
+| 性能·可靠 | 骆骋 | ⛔ 未授权/待核实 | langgraph 引用 R142;压测未授权 |
+| 安全 | 关屿 | ⛔ 未授权/待核实 | SAST/DAST/依赖扫描未执行;admin 鉴权门待核 |
+| 兼容·体验 | 阮清 | 未发现 | 无专项资产 |
+| 流程·度量·代码 | 何序 | ⚠️ 覆盖率未达标/CI 未固化 | cfc-web 10% <20%;G11 未固化 |
+
+## 十、五要素问题清单
+
+**P1 — 覆盖率门禁未达标(G9)**
+① 问题描述:cfc-web 语句覆盖率仅 10.08%,远低于 20% 门禁;后端 JaCoCo 因 MySQL 不可达无法采集,覆盖率度量缺位。
+② 测试 bug 点:`cfc-web` 仅 17 套件 116 例覆盖核心组件;backend 无离线 JaCoCo 产物。
+③ 最优修改方案:扩充 cfc-web 组件/工具单元用例;后端在 MySQL 可达环境接入 `jacoco:report` 并设行/分支阈值。
+④ 修改目的:满足覆盖率门禁,暴露未测分支,提升缺陷拦截率。
+⑤ 问题闭环:cfc-web `--coverage` 语句 ≥20%;后端连库 `mvn test`+JaCoCo 行/分支 ≥80%;通过标准=两项达标。
+
+**P2 — 后端全量未重测 / 17 红未核实**
+① 问题描述:本地 MySQL 3306 CLOSED,后端全量 `mvn test` 无法执行,引用 R142 基线 2946 例/99.29%/17 红,17 红为存量(TDD-RED + 历史债)未连库核实。
+② 测试 bug 点:环境依赖(本地 MySQL DOWN)致测试不可执行,非用例缺陷。
+③ 最优修改方案:在 MySQL 可达的内网/CI 执行 `mvn test` 输出 surefire + jacoco,对 17 红逐条归因。
+④ 修改目的:取得后端真实红例明细,闭合"未实测"项。
+⑤ 问题闭环:连库跑通后红例差集为空或仅剩已登记预期 RED;通过标准=0 真红。
+
+**P3 — P-9 公网外联(离线约束缺口)**
+① 问题描述:`cfc-frontend/__tests__/api/api.test.js` 与 `config/config.test.js` 在测试中向公网 `cfc.etotem.com.cn` 发起真实 HTTP 请求,违反"禁止访问外部公网"约束。
+② 测试 bug 点:`cfc-frontend/__tests__/api/api.test.js`、`cfc-frontend/__tests__/config/config.test.js`(离线环境仍发起外部 POST)。
+③ 最优修改方案:用 axios-mock-adapter / MSW 拦截该外部域名,或用例顶部以 `process.env.CFC_OFFLINE` 守卫跳过外部断言,与现有 mock API 风格统一。
+④ 修改目的:确保离线/内网约束下测试不触达公网,避免数据外泄与网络依赖误报。
+⑤ 问题闭环:`CFC_OFFLINE=1` 重跑两文件,断言真实外联数=0 且用例仍 PASS;通过标准=0 真实外联。
+
+**P4 — 登录态 E2E 未实测 + admin 鉴权门缺失(B-142-1)**
+① 问题描述:无 `MACHINE_JSON_PATH` 凭据,登录态 E2E 业务流未跑;R142 标记 `AdminFamilyStatsController` 等 admin 整族接口缺统一鉴权门(P2 安全)。
+② 测试 bug 点:`tests/e2e` 无登录凭据注入;后端 admin 族接口需核验 `JwtInterceptor` 路径覆盖。
+③ 最优修改方案:经环境变量注入测试凭据跑通登录态 E2E;后端对 admin 整族接口补 `JwtInterceptor` 覆盖校验。
+④ 修改目的:验证鉴权门正确性与业务流可用(安全+功能)。
+⑤ 问题闭环:登录态 E2E 跑通且无 401 绕过;后端鉴权单测覆盖 admin 族接口;通过标准=无越权 + 业务流绿。
+
+**P5 — 安全/性能/依赖漏洞扫描未授权(execute 档·公网)**
+① 问题描述:依赖漏洞(OWASP DC)、性能压测、DAST 属 execute 档且需公网/远端,本小时未获单独授权 → 未执行。
+② 测试 bug 点:非用例缺陷,属授权缺项。
+③ 最优修改方案:用户单独显式授权后,在内网/离线镜像执行依赖扫描与压测(禁用公网下载)。
+④ 修改目的:取得安全与性能基线。
+⑤ 问题闭环:授权后执行并零高危;通过标准=无 Critical/High 漏洞 + 压测达标。
+
+**P6 — 无 CI 固化(G11)**
+① 问题描述:项目无持续集成门禁固化测试结果,依赖人工/定时自动化,回归可能遗漏。
+② 测试 bug 点:`.gitlab-ci.yml` 存在但测试门禁未固化(G11)。
+③ 最优修改方案:CI 中加入 `mvn test` + `jest` + 覆盖率阈值 + E2E 冒烟门禁。
+④ 修改目的:防止回归遗漏,固化质量闸门。
+⑤ 问题闭环:CI 流水线红则阻断合并;通过标准=CI 绿且覆盖率达标。
+
+## 十一、待核实项
+
+- 后端 17 红逐条归因(TDD-RED vs 真缺陷)— 需连库。
+- 登录态 E2E 业务流(无凭据)— 待用户注入凭据。
+- admin 整族鉴权门(B-142-1)、chat 120s 超时劣化(B-142-2)— 引用 R142,本小时未重核。
+- langgraph 9000 健康/实派(需 AI+凭据)— 引用 R142(51/50/1,429 环境红)。
+- cfc-frontend 覆盖率数值 — 本小时未采集(仅排除公网套件跑功能)。
+- 供应商/仓库资料中未明确的接口行为一律标「需核实」,本次未臆造任何断言。
+
+## 十二、需用户单独授权才能继续的项(标注「未授权未执行」+ 测试设计)
+
+1. **依赖漏洞扫描(OWASP Dependency-Check)** — 未授权未执行。设计:本地离线镜像运行 `dependency-check`,输出 `dependency-check-report.html`,阈值阻断 High+。
+2. **性能压测(后端 9082 / LangGraph 9000)** — 未授权未执行。设计:内网对 `/api/**` 跑基线+峰值压测,采集 P95/P99 与错误率。
+3. **DAST(动态应用安全测试)** — 未授权未执行。设计:对内网 `/admin`、`/frontend` 跑 ZAP 基线扫描,禁外联。
+4. **登录态 E2E 全业务流** — 需用户注入 `MACHINE_JSON_PATH` 凭据后执行(非授权问题,属凭据缺项)。
+
+## 十三、门禁结论
+
+**⛔ 有条件通过(与 R142 稳态持平,较 R139 改善)。**
+
+- ✅ 达标项:cfc-web 116/116 全绿零漂移;cfc-frontend 451/466(3 预期 RED 非回归,较 R139 的 16 RED 收敛);后端 `test-compile` GREEN;内网 E2E 探针 2/2 可达;SRS 闸门闭合零抖动。
+- ⛔ 未达标 / 未实测项:覆盖率 <20%(G9);无 CI 固化(G11);后端 17 红未连库核实;登录态 E2E 待核实;admin 鉴权门待核;安全/性能/依赖扫描未授权。
+
+**复评条件(满足后转「通过」):**
+1. 后端连库 `mvn test` 0 真红 + JaCoCo 行/分支 ≥80%;
+2. cfc-web 覆盖率 ≥20%;
+3. 修 P-9(CFC_OFFLINE 守卫,0 真实外联);
+4. 用户授权后安全/性能/依赖扫描零高危 + 压测达标;
+5. 登录态 E2E 凭据注入跑通业务流 + admin 鉴权门单测绿;
+6. CI 固化测试门禁(G11)。
+
+---
+*产物:`docs/tdd/orchestration/report-test-2026-11-11T1042.md`(未提交、未推送、未改生产源码)。内网 E2E 探针结果:`tests/e2e/_automation_reachability_result.json`。*

+ 107 - 0
docs/tdd/orchestration/report-test-2026-11-11T1522.md

@@ -0,0 +1,107 @@
+# 测试闭环报告 · 2026-11-11 15:22(R147 等效轮,review 档,内网已授权)
+
+> 主理人:陆谨(软件测试专家团)|对象:浠艾福 XAF(workspace `d:/cfc`)
+> 执行档:**review 档**(已授权内网 `cfc.iwintrue.com`→`192.168.16.251` 私有路由,仅 `/admin`、`/frontend`;不访问外部公网)
+> 约束:不修改/不提交/不推送生产源码;不输出密钥/口令/令牌。
+
+---
+
+## 1. 执行范围
+
+| 模块 | 动作 | 命令 | 状态 |
+|---|---|---|---|
+| cfc-web(Vue2 管理端) | 单元/组件 Jest(含覆盖率) | `npm run test:coverage -- --ci` | ✅ 实测 |
+| cfc-frontend(uni-app 小程序 H5) | 单元/组件 Jest(**排除 P-9 公网外联 `api.test.js`/`config.test.js`**) | `npx jest --ci --testPathIgnorePatterns="api.test.js" --testPathIgnorePatterns="config.test.js"` | ✅ 实测 |
+| cfc-backend(Spring Boot) | 全量 `mvn test` + JaCoCo | `mvn -q -DskipTests=false test` | ⛔ 未实测(见 §6/§8) |
+| 内网 Web 自动化(E2E 探针) | Playwright 探活 `/admin`、`/frontend` | `node _e2e_reach_probe.cjs`(无登录凭据) | ✅ 实测(仅可达性) |
+| 登录态业务流 E2E | Playwright 登录后用例 | — | ⛔ 降级(无 `MACHINE_JSON_PATH` 凭据) |
+| 安全/性能/依赖漏洞扫描 | SAST/DAST/压测/依赖审计 | — | ⛔ 降级(execute 档·公网未授权) |
+| LangGraph 9000 | Python 服务测试 | — | ⛔ 降级(需 AI+凭据) |
+
+## 2. 用例总数 · 通过 · 失败
+
+| 域 | 套件 | 用例总数 | 通过 | 失败 | 跳过 | 备注 |
+|---|---|---|---|---|---|---|
+| cfc-web Jest | 17 | 116 | **116** | 0 | 0 | 全绿 |
+| cfc-frontend Jest(P-9 排除) | 38 | 466 | **451** | **3(预期 RED)** | 12 | 与 R142 逐项一致 |
+| 内网 E2E 探针 | 2 | 2 | **2** | 0 | 0 | 可达性(无登录) |
+| **合计(本次实测)** | **57** | **584** | **569** | **3** | **12** | — |
+
+- 前端 3 个失败均为 **TDD 预期红**(未交付契约):`signature.consignee.test.js`(S-cfc-53,2 例:`<hand-signature>` 元素缺失 + `onConfirm` 未回调)、`growthHistory.dayGroupView.test.js`(S-cfc-134,1 例:RED-A7 分组逻辑)。**非回归**。
+- 后端全量用例:**本执行环境 `mvn` 不在 PATH**,无法实跑;引用最近一次成功全量基线(见 §6)。
+
+## 3. 覆盖率
+
+| 模块 | 语句 | 分支 | 函数 | 行 | 漂移 |
+|---|---|---|---|---|---|
+| cfc-web(Jest) | 10.08% | 6.06% | 7.48% | 9.95% | **零漂移**(= R142) |
+
+- 门禁阈值(项目约定)≥ 20% → **未达标(G9 风险)**,但本环境 Jest 仅覆盖少量组件级用例,绝大多数 Vue 页面无单测,属长期结构性缺口。
+- 后端 JaCoCo:未实测(mvn 不可用),引用 R146 基线 99.29% / 17 红(零回归第 6 次,详见 §6)。
+
+## 4. 新增风险 / 回归判定
+
+- **新增失败用例:0**(cfc-web 双绿、cfc-frontend 3 红与 R142 完全一致,红例差集为空)。
+- **新增风险:0**。自 R142(10:42)至本伦(15:22),HEAD 由 `e37498f70`(R142) 推进至 `df4c2ab45`(R146),代码/测试提交均已并入且未引入新红。
+- **持续风险(沿用基线,未闭环)**:
+  - **P-9 公网外联**:`cfc-frontend/__tests__/api/api.test.js`、`config/config.test.js` 含公网请求;本轮已显式排除以守「不访问公网」约束,但根因(缺 `CFC_OFFLINE` 守卫)未修。
+  - **G9 覆盖率门禁缺失**:cfc-web 覆盖率 10% < 20%。
+  - **G11 无 CI 固化**:测试未接入持续集成闸门。
+  - **后端 17 红**:最近基线 17 红(R146)未在本环境连库复核实测。
+  - **admin.referral(TR-25)零覆盖**:feat(admin) 新增团队推荐接口无测试,且 SRS 未同步。
+
+## 5. 测试用例编写产出(依据 SRS / 需求变更)
+
+- **SRS 闸门检查**:`git log --since="2026-11-11 10:42"` + `find -newermt` 对 `docs/tdd/SRS.md` / `docs/需求分析/` / `docs/superpowers/specs/` / `docs/superpowers/api/API_REFERENCE.md` 的变更 = **零命中**。
+- **结论:本次无需求/SRS 变更 → 跳过编写测试用例**,避免仓库抖动(与 R138/R139/R142 稳态轮一致)。
+- 既有测试资产已覆盖近期变更(如 diet 食谱推荐、article 标签搜索等契约),无新增缺口需落库。
+
+## 6. 历史审查记录(对照,非本次结论依据)
+
+- 最近一次本对象记忆轮:**R142 @2026-11-11 10:42**(结论 ⛔有条件通过)。
+- 当前 HEAD:`df4c2ab45`(R146 @14:55,commit "第146轮闭环——后端强制实跑 347类/2946例/99.29%/17红(零回归第6次)+浏览器28/28+langgraph 251实派51例49过/2红")。
+- 后端最近全量基线(R146,引用而非本环境重跑):**347 类 / 2946 例 / 99.29% / 17 红**,零回归第 6 次;MySQL3306 状态未变。
+- 本环境差异:本执行机 **`mvn` 不在 PATH**(无 `mvn`/`mvnw`、IntelliJ 内置 maven 亦无)→ 后端 `test-compile`/`test` 均不可在本环境实测,故引用 R146 基线并如实标注「未实测」。
+
+## 7. 五要素问题清单
+
+| # | ① 问题描述 | ② 测试 bug 点(文件:行号 / 用例名) | ③ 最优修改方案 | ④ 修改目的 | ⑤ 闭环方式与通过标准 |
+|---|---|---|---|---|---|
+| Q1 | 前端单测含公网外联,违反「不访问公网」约束 | `cfc-frontend/__tests__/api/api.test.js`、`__tests__/config/config.test.js` | 增加 `CFC_OFFLINE` 守卫:默认 mock 适配器拦截所有外部请求;仅在显式置位时才发真实请求 | 守住内网/公网隔离红线,防止自动化误打公网 | 复测:CI 注入 `CFC_OFFLINE=1` 跑全量 40 套,**0 真实外联**、0 网络错误即通过 |
+| Q2 | 覆盖率远低于门禁(10% < 20%) | `cfc-web` 全量 Jest 覆盖 10.08%;多数 `src/views/**` 组件 0% | 按 AGENTS.md 关键路径优先级,为 `review/`、`orchestration/`、`teacher/` 等高频页面补组件渲染/交互单测 | 提升变更防护能力,满足 G9 | 复测:cfc-web 行覆盖率 ≥ 20% 且关键页非零覆盖 |
+| Q3 | 后端 17 红未在本环境连库复核实测 | `cfc-backend/src/test/java` 引用 R146 基线 17 红 | 在具备 `mvn`+MySQL3306 的环境重跑 `mvn test`,逐类比对 R146 红例是否仍真红 | 确认 17 红非环境假象,定位真缺陷 | 闭环:连库 `mvn test` 后 17 红中真红数 = 0 或逐条给出根因 |
+| Q4 | 3 个 TDD 预期红契约未交付 | `signature.consignee.test.js`(S-cfc-53)、`growthHistory.dayGroupView.test.js`(S-cfc-134) | 按 S-cfc-53/S-cfc-134 需求实现手签名回调与成长记录日分组逻辑,使契约转绿 | 兑现契约覆盖,消除已知红 | 复测:3 例由红转绿、套件全绿即通过 |
+| Q5 | admin.referral(TR-25)零测试覆盖 | `AdminReferralController`/`TreeService`(feat(admin) 新增,无测试文件) | 补 `AdminReferralController` 单元/契约测试,并同步 SRS 条目 | 堵住新增接口覆盖缺口 | 闭环:新增测试文件且 `/api/admin/referral/*` 关键路径断言通过 |
+
+## 8. 需用户单独授权才能继续的项(未授权未执行 · 已给测试设计)
+
+| 项 | 为何未执行 | 测试设计(降级产出) |
+|---|---|---|
+| 后端全量 `mvn test` + JaCoCo | 本机无 `mvn`/`mvnw`,且 MySQL3306 不可达 | 在具备 mvn+MySQL 的 CI 或宿主环境运行 `mvn -q -DskipTests=false test`,采集套件/用例/行分支覆盖率,逐类比对 R146 基线 17 红 |
+| 依赖漏洞扫描(OWASP DC / `npm audit`) | execute 档,需联网拉取漏洞库 | 离线 `npm audit --offline`(仅已缓存 advisory)初筛;联网授权后在隔离环境跑 `dependency-check` |
+| 性能压测(JMeter/Chaos) | 打到目标环境=公网/远端,未授权 | 设计:对 `/api/family/member/add`(历史偶发 17s+ 慢)做单接口基准+梯度压测,定位 60s 超时瓶颈 |
+| DAST/渗透(安全) | 需联网/对生产扫描,未授权 | 设计:针对 `nonfunc-security.spec.js` 两处未授权应 401/403、上传格式校验,补契约断言并接入 ZAP baseline 扫描 |
+| 登录态业务流 E2E | 无 `MACHINE_JSON_PATH` 登录凭据 | 设计:凭据经环境变量/本地配置文件注入(绝不入报告/日志),跑 `e2e-live` 下 admin/frontend 业务流;当前仅做无登录可达性探针 |
+
+## 9. 待核实项
+
+1. **后端 17 红真实性**:本环境未实测,引用 R146 基线,需连库复核实测(Q3)。
+2. **admin.referral 覆盖缺口**:SRS 未同步,需 owner 确认是否纳入本轮测试范围(Q5)。
+3. **登录态 E2E 可用性**:待用户提供 `MACHINE_JSON_PATH` 凭据后跑通业务流(§8)。
+4. **P-9 守卫修复**:`api.test.js`/`config.test.js` 当前靠排除规避,根因未修(Q1)。
+
+## 10. 门禁结论
+
+> **结论:⛔ 有条件通过(与 R142/R146 稳态持平,零漂移)**
+
+- 本次实测:cfc-web 双绿(116/116)、cfc-frontend 与 R142 逐项一致(451/3预期红/12跳)、内网 E2E 探针 2/2 可达;无新增失败、无新增风险。
+- 阻断「完全通过」的未闭环项(复评条件,全部来自基线遗留,非本次新引入):
+  1. 后端连库全量 `mvn test` 0 真红 + JaCoCo ≥ 80%(本环境暂不可测,需授权环境);
+  2. cfc-web 覆盖率 ≥ 20%(G9);
+  3. 修 P-9 公网外联守卫(CFC_OFFLINE=1 全量 0 外联);
+  4. 授权安全+性能+依赖扫描零高危;
+  5. 登录态 E2E 凭据注入跑通业务流 + admin 鉴权门单测绿;
+  6. CI 固化(G11);admin.referral(TR-25)补测。
+
+---
+*产物:`docs/tdd/orchestration/report-test-2026-11-11T1522.md`(未提交、未推送、未改生产源码)。实测日志:`_e2e_jest_run.log`、`_e2e_jest_covsum.log`、`_e2e_fe_clean.log`、`_e2e_reach_result.json`。*

+ 20 - 0
docs/tdd/test/automation-status.md

@@ -1271,3 +1271,23 @@
 | TC 锚点 | 347 唯一 TC → 严格 **101 = 29.1%** | 口径:`tests/e2e-live` + `tests/e2e/*.spec.js`(排除 `api/generated`)+ `cfc-backend/src/test` 的 TC-ID 字面命中 |
 | 线上鉴权 | 5/5 匿名 POST → 401 | G8 ✅;另 **B-142-1 复核**:`/api/admin/families/overview` 匿名 200 + code:400 |
 | 节点 | 189:4090 ✅(恢复)/ 251:4096 ✅ / 251:9000 ✅ / 204:4090 ✗ | **G10 双节点通过**(B-189 撤销) |
+
+### 附录 R148(2026-11-11 17:40 · 后端强制实跑 + langgraph 复验未过)
+
+| 项 | 值 | 说明 |
+|---|---|---|
+| 后端全量 | **347 类 / 2946 例 / 2925 过 / 17 红 / 4 跳 = 99.29%** | `mvn -o -B clean test`,**51:57**;347/347 XML;2121 + 353 源编译 0 错;`*.dump` = 0 |
+| 恒等式 | `@Test 2935 − @Disabled 4 + 参数化净增 15 = 2946` | 误差 0 |
+| 红例三桶 | 产品 14 + 契约待裁决 3 + 数据 1 = 17 | 与 R146/R145 **逐类逐例一致 → 零回归(第 8 次)** |
+| 基线纯度 | 347 类 = HEAD 346 类 + 未跟踪 `ArticleTagsContractTest.java` | 历轮同口径 |
+| 前端 Jest | 616:601 过 / 3 红 / 12 跳(27.1s) | 3 红为 S-cfc-30/52/53 预期 RED |
+| 管理端 | 116/116(17 套件,26.7s) | 零漂移 |
+| 根级黑盒 | 23:7 过 / 16 红(8.7s) | B-36 第 44 轮,全 `ECONNREFUSED 9082` |
+| langgraph@251 | **51 例 / 50 过 / 1 红 / 292.22s** | 1 红 `test_auto_tag_short_content`(chat 500,`ConnectError`)→ B-142-2 不复销号 |
+| 浏览器 | **28/28 + 2 skip** | 189 admin 5/5(81s)+ 本机 fe 6 / shop 4 / health 13;dx 2 skip(404) |
+| 全量 | **3782 例 / 3727 过 = 98.55%**(剔 skip 99.02%) | 红 37 / 跳 18 |
+| 新增用例数 | **0** | specs 201 / test-cases 15 窗口零变更(G12 ✅) |
+| TC 锚点 | 347 唯一 TC → 脚本口径 **104 = 30.0%**;严格口径 **65 = 18.7%** | 两套口径并存(B-124 延续) |
+| 线上鉴权 | 5/5 匿名 POST → 401 | G8 ✅;`/api/admin/families/overview` 匿名 200 + code:400(B-142-1 第 7 轮) |
+| 节点 | 189:4090 ✅ / 251:4096 ✅ / 204:4090 ✗ | **G10 双节点通过** |
+| 门禁 | ⚠️ **有条件通过** | G1/G4/G5/G6/G8/G10/G12 ✅;G2/G7/G9/G11 ❌;G3 ⚠️ |

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

@@ -719,3 +719,28 @@
 > **全量 3782 / 3728 过 = 98.57%**(剔 skip 99.04%)。
 > **结论**:⚠️ **有条件通过** —— G1 ✅ 98.57%、G4 ✅、G5 ✅、**G6 ✅ 28/28**、**G7 ✅ langgraph 51/51 首次全绿**、G8 ✅ 5/5、**G10 ✅ 双节点**、G12 ✅;❌ G2 36 红、G9 29.1%、G11 无 CI;⚠️ G3 3 预期 RED。
 > **变化点**:langgraph 2 红→0 红(**首次全绿**,B-142-2 疑似销号待复验)、全量 98.52%→98.57% → **已推送 + 通知研发**(结果实质改善触发)。
+
+## R148 轮(2026-11-11 17:40,HEAD `ffa97bf02`,后端强制实跑 + langgraph 复验未过)
+
+| 编号 | 关联键 | 类型 | 描述 | 经办 | 登记时间 | 状态 |
+|---|---|---|---|---|---|---|
+| **B-142-2-Update(第 7 轮)** | 251 LLM 上游连接故障 | 运维/AI(P0) | **不销号(复验未过)**。langgraph **51 例 / 50 过 / 1 红 / 292.22s**;红例 `test_auto_tag_short_content` → chat **500**,日志 `ConnectError('All connection attempts failed')` + `加载提示词 intent_classifier 失败` + `SLOW_REQUEST 14.99s`。R147 全绿为第 1 轮,需连续 2 轮绿方可销号。 | 测试(R148 实派) | 2026-11-11 17:40 | 待处理(观察 1/2) |
+| **B-148-1(新)** | 网关瞬抖 502 污染鉴权断言 | 运维(P2) | health 套件首跑 `TC-H-U01 POST /api/huawei-health/auth-url` 收 **502**(断言仅允许 401/403)→ 首次 12/13;同一窗口直连 2/2 = **401**、套件复跑 **13/13 绿**。判定:网关瞬抖,非鉴权缺陷。建议用例对 5xx 做 ≤2 次退避重试或 `test.fixme` + 「网关不可用」标注。 | 测试(R148 巡检) | 2026-11-11 17:40 | 观察中 |
+| **B-142-1-Update(第 7 轮)** | `/api/admin/**` 鉴权门缺失 | 研发(P1 安全) | **延续(复核成立,7 轮未修)**。匿名 `POST /api/admin/families/overview` → HTTP **200** + `{"code":400,"message":"请求参数格式错误"}`;对照组 mind/energy/health-plan/huawei/xiaomi **全 401**。 | 测试(R148 巡检) | 2026-11-11 17:40 | 待处理 |
+| **B-145-1-Update(第 4 轮)** | `nutrition_age_dosage` 建表 SQL 无效 | 研发(P1 Schema) | **延续(4 轮未修)**。`schema.sql:5343` 建表体第 12 行 `INDEX idx_product (product_id)`,而列定义中无 `product_id` → DDL 恒失败;`DatabaseInitializer` catch 后仍打印「数据表检查完成」。 | 测试(R148 复核) | 2026-11-11 17:40 | 待处理 |
+| **B-134-4-Update(第 11 轮)** | intent_classifier 兜底伪装 | 研发/AI(P1) | **延续(缺陷仍在,本轮触发路径为 ConnectError)**。`app/intent_classifier.py:62` 异常 → 默认 `chat`,上游故障被伪装正常。 | 测试(R148 实派) | 2026-11-11 17:40 | 待处理 |
+| **B-95-Update(第 19 轮)** | `192.168.16.204:4090` 失联 | 运维(P2) | **延续**。204:4090 → **000**;189:4090 = 200、251:4096 = 200。 | 运维 | 2026-11-11 17:40 | 待处理 |
+| **B-DX-1-Update(第 10 轮)** | dx-bridge 端点 404 | 部署(P2) | **延续**。浏览器 dx-bridge 2 例 skip(端点 404)。 | 部署/运维 | 2026-11-11 17:40 | 待处理 |
+| **B-36-Update(第 44 轮零漂移)** | 根级黑盒门控 | 测试(P3) | **零漂移**。23 例 7 过 / 16 红,全 `ECONNREFUSED 127.0.0.1:9082`。建议下轮改「探活失败即 skip 并输出原因」。 | 测试 | 2026-11-11 17:40 | 待处理(环境型) |
+| **B-138-3-Update(第 6 轮)** | 后端超慢测试类 | 研发(P3 效率) | **延续**。本轮全量 **51:57**(R146 44m、R145 1:09h),前端 Jest 并发期间耗时抬升;慢类仍占大头。 | 测试(R148 实测) | 2026-11-11 17:40 | 待处理 |
+| **B-69-Update(第 11 轮销号维持)** | mind/fortune 匿名 200 | 研发(P1) | **维持销号**。匿名 POST 5 端点(mind/fortune、energy/overview、health/plan/list、huawei-health、xiaomi-health)**全 401**。 | 测试(R148 巡检) | 2026-11-11 17:40 | 已闭环 |
+| **B-141-3-Update** | 站点根 `/` 502 | 运维(P3) | **维持观察**。`/` = **404**、`/admin` = 302→200、`/frontend` = 302→200。 | 测试(R148 巡检) | 2026-11-11 17:40 | 观察中 |
+| **B-126-Update(第 9 轮)** | pytest 收尾 `EXIT=124` | 测试(P3) | **本轮口径不可判**:`/tmp/r148_pytest.log` 未见 `PYTEST_EXIT=` 行(kick 命令转义导致 `$?` 未落盘)→ 退出码缺失,不能据此判正常退出。**建议**:kick 命令改用 `bash -c '... ; echo EXIT=$? >> LOG'` 单引号包裹避免 `$?` 被外层展开。 | 测试 | 2026-11-11 17:40 | 待核实 |
+| **B-141-1(延续)** | qna 收集期缺陷 | 研发(P1) | **延续(排除项)**。pytest 口径 `--ignore=tests/qna --ignore=tests/test_chat.py`。 | 测试(R148 实派) | 2026-11-11 17:40 | 待处理 |
+
+> **R148 口径**:后端**强制实跑**(R147 采信 R146 累计 1 轮,且窗口含 cfc-web 构建元数据变更)。
+> 后端 **347 类 / 2946 例 / 2925 过 / 17 红 / 4 跳 = 99.29%**(恒等式 `@Test 2935 − @Disabled 4 + 净增 15`;347/347 XML;dump 0;与 R146/R145 逐类逐例一致 → **零回归第 8 次**)。
+> 浏览器 **28/28 + dx 2 skip**(189 admin 5/5 81s、本机 fe 6/shop 4/health 13);**langgraph 51 例 50 过 / 1 红(ConnectError)**;cfc-web 116/116;cfc-frontend 601/3/12;根级 23 = 7/16。
+> **全量 3782 / 3727 过 = 98.55%**(剔 skip 99.02%)。
+> **结论**:⚠️ **有条件通过** —— G1 ✅ 98.55%、G4 ✅、G5 ✅、G6 ✅ 28/28、G8 ✅ 5/5、**G10 ✅ 双节点**、G12 ✅;❌ G2 37 红、**G7 langgraph 1 红(由上轮 ✅ 回落)**、G9 30.0%、G11 无 CI;⚠️ G3 3 预期 RED。
+> **变化点**:langgraph 0 红→1 红(B-142-2 复验未过、不销号)、全量 98.57%→98.55% → **已推送 + 通知研发**。