Просмотр исходного кода

test(tdd): 第145轮闭环——后端强制实跑347类/2946例/99.29%(17红与R142逐类逐例一致,零回归)+浏览器28/28+189节点恢复实派5/5(G10双节点,B-189撤销)+langgraph 251实派51例45过/6红(429额度耗尽,较R144改善1例)+全量3782/3722=98.41%;新增B-145-1(nutrition_age_dosage建表SQL无效);SRS零变更G12合规;结果变化触发push+通知研发

E2E Test Bot 1 день назад
Родитель
Сommit
80dfa4526d

+ 350 - 0
docs/tdd/orchestration/report-test-2026-11-11-R145.md

@@ -0,0 +1,350 @@
+# 测试负责人工作汇报(第 145 轮 · 2026-11-11 13:25 GMT+8)
+
+> 角色:cfc-tester(测试负责人)|执行档:**review(离线;内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化;langgraph 实派 192.168.16.251;未联网装依赖、未启停服务、未改生产代码)**
+> 基线 HEAD:`ab33afac8` = origin/cfclub(跑前=跑后,**窗口零源码变更**)→ 本轮对全部套件做**实跑**(非采信),结果对 R142 基线可比。
+> 节点:`189:4090` = 200 且 **shell 可建可读(B-189 鉴权门控本轮未复现)** → admin-desktop 实派 5/5|`251:4096` = 200(langgraph pytest 实派 51 例)|`251:9000 /health` = 200|`204:4090` = 000(B-95 第 16 轮)
+> 分工:**189** = admin-desktop E2E(1.6m);**251** = langgraph pytest(127.77s);**本机** = 后端全量(1:09h)+ 三套 Jest + 浏览器 fe/shop/health/dx + 报告编译
+> 结论:⚠️ **有条件通过** —— 后端全量 **347 类 / 2946 例 / 2925 过 / 17 红 / 4 跳 = 99.29%**,17 红与 R142 **逐类逐例一致(零回归)**;浏览器 **28/28 + dx 2 skip**,**G10 双节点本轮首次恢复**;langgraph 51 例 45 过 6 红(**429 免费额度耗尽,较 R144 的 7 红改善 1 例,非代码回归**);全量 **3782 例 / 3722 过 = 98.41%**(G1 ✅)。G2/G7/G9/G11 仍未达阈值。
+> **变更触发**:后端由「采信」改「实跑」(R143/R144 连续 2 轮采信达上限)且 langgraph 7 红→6 红、189 节点恢复 → 结果有实质变化 → **已 push + 通知研发**(见 §9)。
+
+---
+
+## 0. 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | `cfc-tester`(测试负责人) |
+| 汇报周期 | 2026-11-11(第 145 轮,跑测窗口 12:07–13:25) |
+| 负责模块/单元 | cfc-backend(全量实跑) · cfc-frontend(Jest 实跑) · cfc-web(Jest 实跑) · cfc-langgraph(251 实派) · 浏览器 E2E(admin@189 / frontend·shop·health·dx@本机) · 根级黑盒(实跑) |
+| 执行档 | review(离线;未装依赖、未启停服务、未改生产代码) |
+
+### 0.1 测试用例建设与执行
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数** | `0` 个 | SRS/specs/API_REFERENCE/test-cases 窗口**零变更**(`git diff c7c7523c8..ab33afac8` 空)→ G12 合规 |
+| **本轮验证执行测试数** | `3782` 个 | 后端 2946 + 前端 616 + 管理端 116 + 根级 23 + langgraph 51 + 浏览器 30(含 dx 2 skip) |
+| **用例通过率** | `98.41%`(3722/3782) | 剔 skip 口径 **98.88%**(3722/3764);红 42(后端 17 + 前端 3 + 根级 16 + langgraph 6) |
+| **新增覆盖资产** | `0` 项 | 无 SRS 变更、无新契约文件 |
+
+### 0.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数** | `3` 个 | ① 189:admin-desktop E2E(1.6m,5/5);② 251:langgraph pytest(127.77s,51 例 45/6);③ 本机:后端全量 + 3 套 Jest + 浏览器 4 套 |
+| **恢复智能体会话数** | `0` 个 | 无中断/重建 |
+| **当前在用会话数** | `3` 个 | 本机(done)/ 189=shell(done, EXIT=0)/ 251=shell(done, 进程正常退出) |
+
+### 0.2b 各会话当前工作状态
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| 本机 | localhost | done | 后端全量 + Jest×3 + 浏览器 4 套 | — | `d:\cfc` | 后端 1:09h;Jest 19.4s/21.0s/10.4s;浏览器 1.8m+10.8s |
+| 189:4090 | `sh_1c8cb645…` | done | admin-desktop E2E | — | `C:\code\cfc\tests` | **5/5 通过(1.6m,EXIT=0)**;blob 与本机完全一致 |
+| 251:4096 | shell 直连(kick 分离) | done | langgraph pytest | 127.77s | `/sc-data/cfc/cfc-langgraph` | **51 例 / 45 过 / 6 红**;HEAD `2e16e662b` = 本机父提交 |
+| 204:4090 | — | unknown(000) | 失联 | — | — | B-95 第 16 轮 |
+
+### 0.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数** | `1` 个 | **B-145-1(P1)**:`nutrition_age_dosage` 建表 SQL 无效(`INDEX idx_product(product_id)` 引用不存在的列)→ 该表**从未创建成功**;PRD `2026-10-27-nutrition-product-tagging-prd.md` 第 4 条已自述但未修 |
+| **已解决测试相关问题数** | `0` 个 | 无测试侧自闭环(零 SRS 变更,无新契约) |
+| **待解决测试相关问题数** | `8` 类 | 后端 17 存量红 · 前端 3 预期 RED · 根级 16 环境红 · langgraph 6 环境红(429)· dx 2 端点 404(B-DX-1 第 7 轮)· 204 失联(B-95)· admin 鉴权门缺失(B-142-1 第 4 轮)· nutrition_age_dosage 建表失败(B-145-1 新) |
+
+### 0.4 本轮 git 提交与推送证据
+
+| 提交 sha | 关联键 | 阶段 | 触及文件 | 目标分支 | 已推送远端 | 备注 |
+|----------|--------|------|----------|----------|------------|------|
+| 见 §9 | R145 报告 + 通知 + 台账更新 | 测试闭环 | `docs/tdd/**` | `cfclub` | 是 | 结果变化触发 |
+
+---
+
+## 1. 历史审查记录(仅作对照,不作为本轮结论依据)
+
+| 轮次 | 时间 | 后端全量 | langgraph | 浏览器 | 前端 Jest | 结论 |
+|---|---|---|---|---|---|---|
+| R141 | 11-11 09:05 | 346 类 / 2937 例 / 99.11%(实跑)/ 22 红 | 251 实派 46 过 / 5 红 / 51 例 | 28/28 + dx 2 skip | 557 过 / 47 红 / 12 跳 | 不通过(有条件) |
+| R142 | 11-11 10:21 | 347 类 / 2946 例 / 99.29%(实跑)/ 17 红 | 251 实派 50 过 / 1 红 / 51 例 | 28/28 + dx 2 skip | 601 过 / 3 红 / 12 跳 | 有条件通过 |
+| R143 | 11-11 11:30 | 采信 R142 | 251 实派 40 过 / 3 红 / 43 例 | 28/28 + dx 2 skip | 采信 R142 | 有条件通过 |
+| R144 | 11-11 11:43 | 采信 R142 | 251 实派 36 过 / 7 红 / 43 例 | 28/28 + dx 2 skip | 采样 601/3/12 | 有条件通过 |
+| **R145(本轮)** | 11-11 13:25 | **347 类 / 2946 例 / 2925 过 / 99.29%(实跑)/ 17 红** | **251 实派 45 过 / 6 红 / 51 例** | **28/28 + dx 2 skip(189 恢复)** | **601 过 / 3 红 / 12 跳(实跑)** | **有条件通过** |
+
+**本轮变化(对照 R144)**
+
+| 项 | R144 | R145 | 判定 |
+|---|---|---|---|
+| 后端 | 采信 R142(347/2946/17 红) | **实跑 347/2946/2925 过/17 红(1:09h)** | **零漂移**(17 红逐类逐例一致) |
+| langgraph | 43 例 / 36 过 / 7 红 | **51 例 / 45 过 / 6 红** | +8 例(口径回到全仓库 51)+5 过 / −1 红 |
+| 浏览器 admin 节点 | 本机(189 鉴权门控) | **189 实派 5/5** | **G10 恢复双节点** |
+| 前端 Jest | 采信采样 | **实跑 601/3/12** | 零漂移 |
+| 全量通过率 | 98.55%(含采信) | **98.41%(全实跑)** | 同口径不可直接比较,本轮全部实跑 |
+
+---
+
+## 2. 项目画像(简版,SRS 口径)
+
+| 维度 | 本轮事实 |
+|---|---|
+| 业务定位 | 家庭教育成长平台(五维能量 · 健康报告 · 测评订单 · 家庭邀请 · 商城 · AI 管家) |
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus(Java 8,`9082`)· uni-app 小程序 Vue2 · Vue2+Element UI 管理端 · FastAPI+LangGraph+ChromaDB(`9000`) |
+| 模块结构 | `cfc-backend`(347 测试类 / 366 控制器)· `cfc-frontend`(40 套件 / 616 例)· `cfc-web`(17 套件 / 116 例)· `cfc-langgraph`(51 例)· `tests/`(浏览器 30 + 根级黑盒 23) |
+| 关键路径 | 登录鉴权(JWT + `/api/**` 拦截)→ 家庭/成员 → 五维能量 → 健康报告上传解析 → 健康方案 → 商城订单/支付 → AI 对话/分析 |
+| 质量目标 | 全量通过率 ≥98%、零未归因红、SRS 场景锚点可追溯、CI 全量门禁 |
+| 风险点 | ① `/api/admin/**` 鉴权门缺失(B-142-1,匿名可打到控制器);② langgraph 依赖 251 LLM 上游免费额度(429);③ `nutrition_age_dosage` 建表失败(B-145-1);④ 204 节点失联、dx 端点未部署 |
+
+---
+
+## 3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)
+
+| # | 测试类型 | 状态 | 证据(本轮) |
+|---|---|---|---|
+| 1 | 单元测试 | ✅ 已实测 | 后端 2946 例(347 类,**1:09h**);web 116;fe 616 |
+| 2 | 组件测试 | ✅ 已实测 | fe 40 套件 / web 17 套件(shallowMount 组件用例) |
+| 3 | 接口 API 测试 | ✅ 已实测 | 后端 MockMvc/直调覆盖 366 控制器面;langgraph 51 例(251 实派) |
+| 4 | 集成测试 | ✅ 已实测(有红) | `integration.*`:EnergySystemFlowTest 6F、DimensionRegistryMapContractTest 3F、GuideModuleIntegrationTest 1E |
+| 5 | 系统/端到端 E2E | ✅ 已实测 | 浏览器 30 例:**189 admin 5/5** + 本机 fe 6/6、shop 4/4、health 13/13、dx 2 skip |
+| 6 | 冒烟测试 | ✅ 已实测 | 浏览器 28 通过 + 后端 2925 过 + Jest 717 构成本轮冒烟面 |
+| 7 | 回归测试 | ✅ 已实测 | 后端存量 17 红逐类逐例一致(零漂移,第 5 次);web 116、fe 601、根级 23 零漂移 |
+| 8 | 探索性测试 | ⚠️ 待核实 | 无 charter 记录(沿用历轮结论) |
+| 9 | 验收 UAT / BDD | ⚠️ 待核实 | 无 cucumber/gherkin 执行证据(`*.feature` = 0) |
+| 10 | 性能测试 | ⛔ 未授权未执行 | 压测属 execute 档,需联网显式授权(仅记录真实耗时,见 §4.1 慢类) |
+| 11 | 可靠性测试 | ✅ 已实测 | 后端 1:09h 无中断、**347/347 XML 无沉默**、`*.dump` = 0(无 JVM 崩溃);langgraph 进程正常退出(B-126 未复现) |
+| 12 | 安全测试(SAST/DAST/SCA/渗透) | ⛔ 未授权未执行 | 仅鉴权契约面:线上 **5/5 匿名 POST → 401**(G8 ✅);**B-142-1 复核:`/api/admin/families/overview` 匿名 POST → HTTP 200 + code:400**(拦截器放行、控制器参数校验先返回);`@GetMapping` 违规 8 处 |
+| 13 | 兼容性测试 | ⚠️ 待核实 | 仅 Chromium 单引擎(1440×900 / 375×812) |
+| 14 | 可用性测试 | ⚠️ 待核实 | 无真实用户可用性证据 |
+| 15 | 无障碍测试 | ⚠️ 待核实 | 无 axe/WCAG 扫描 |
+| 16 | 覆盖率度量 | ⚠️ 已实测(低) | web 语句 ≈10%(17 套件);后端 **JaCoCo 未接入**(pom 中 jacoco=0)→ 无行覆盖 |
+| 17 | 变异测试 | ⛔ 未发现 | 无 PIT / mutation 资产(pitest=0) |
+| 18 | 契约测试 | ✅ 已实测 | health 13/13、shop 4/4、dx 2(skip=404);后端契约类 DimensionRegistryMap 3 红(待裁决)、WechatLoginContract 1 红、TeamProfitCronContract 1 红 |
+| 19 | QA 流程 | ⚠️ 待核实 | 145 轮闭环可追溯;门禁未脚本化(人工判读) |
+| 20 | 覆盖率门禁/CI | ⛔ 未发现 | `.github/workflows` 不存在(CI=0)→ 无 CI 全量 job(G11 ❌) |
+
+---
+
+## 4. 本轮实测明细
+
+### 4.1 后端全量(本机实跑,1 小时 09 分)
+
+```
+JAVA_HOME=/d/jdk1.8.0_25  /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test
+→ Tests run: 2946, Failures: 16, Errors: 1, Skipped: 4   (BUILD FAILURE:仅测试红)
+```
+
+| 指标 | 值 |
+|---|---|
+| 测试类 / 用例 | **347 类 / 2946 例** |
+| 通过 / 红 / 跳过 | **2925 / 17 / 4** |
+| 通过率 | **99.29%**(剔 skip 99.42%) |
+| 产物完整性 | `target/surefire-reports` **347/347 XML**(无静默丢失);`*.dump` = 0 |
+| 编译 | testCompile **353 源 0 错** |
+| **基线纯度** | 347 类 = HEAD 内 **346** 类 + 未跟踪 `integration/controller/ArticleTagsContractTest.java`(1 类,历轮同款,未入库) |
+| 耗时告警 | 3 类占 13.1 分钟:`AuthControllerTest` **348.8s**、`ActivityControllerTest` **337.3s**、`ArticleControllerTest` **184.5s**(B-138-3 延续,新增 Auth 类进榜) |
+
+**17 红三层归因(与 R142 逐类逐例一致 → 零回归)**
+
+| 桶 | 例数 | 明细 | 定性 |
+|---|---|---|---|
+| 装置/契约待裁决 | **10** | DimensionRegistryMapContractTest 3(P-9 第 10 轮)、OrchestrationEngineTest 1、OrchestrationIntegrationTest 1、MembershipPaySwitchTest 1、PaymentServiceORDRoutingTest 1、UserServiceWechatLoginContractTest 1、UserServiceWechatLoginTest 1、TeamProfitCronContractTest 1 | 测试装置与产品契约口径分歧,历轮同款 |
+| 集成 | **7** | EnergySystemFlowTest 6F + 1S、GuideModuleIntegrationTest 1E | 集成环境/夹具型 |
+| 数据 | 0(本轮无新增) | 平台费截断类本轮未红 | — |
+
+> 说明:`EnergySystemFlowTest` 本轮 6F+1S 与 R142/R141 完全一致;`GuideModuleIntegrationTest` 1E 亦一致。
+
+### 4.2 浏览器自动化(用户核心指令)— 双节点 ✅
+
+| 套件 | 节点 | 例数 | 结果 | 耗时 | 备注 |
+|---|---|---|---|---|---|
+| admin-desktop | **189** | 5 | **5/5 通过** | 1.6m | `TC-A-U01~U05` 全绿(含真实登录 16.1s、核心菜单 55.9s);spec blob `4703d73fb` = 本机 HEAD,结论可比 |
+| frontend-mobile | 本机 | 6 | **6/6 通过** | 1.1m | 游客浏览/五维沙盘/TabBar/鉴权引导 |
+| shop-api | 本机 | 4 | **4/4 通过** | 0.8s | 价格排序契约(S1) |
+| health-contract | 本机 | 13 | **13/13 通过** | 10.8s | 华为/小米/健康方案 鉴权 401 保障 |
+| dx-bridge | 本机 | 2 | **2 skip** | — | `bridge/{list,sync-status}` → 404(B-DX-1 第 7 轮) |
+| **合计** | 双节点 | **30** | **28/28 过 + 2 skip** | **~3m** | **G10 双节点本轮恢复**(189 派发 + 本机并行) |
+
+### 4.3 langgraph pytest(251 实派)⚠️
+
+| 类别 | 例数 | 结果 | 根因 |
+|---|---|---|---|
+| non-LLM(health_plan/memory/report_parse/tongue/graph/recommend/analyze) | 39 | 39/39 过 | 代码层面绿 |
+| auto_tag | 4 | **1/4 过 / 3 红** | `assert 500 == 200`(429 → chat 端点 500) |
+| intent | 5 | **2/5 过 / 3 红** | 429 → `intent_classifier.py:62` 静默兜底 `chat` → 断言 `RECOMMEND/MIND/HEALTH` 失败 |
+| qna / test_chat | — | 排除 | `--ignore=tests/qna --ignore=tests/test_chat.py`(B-141-1 收集期缺陷) |
+| **合计** | **51** | **45 过 / 6 红 / 127.77s** | 6 红全为 **LLM 上游 429 免费额度耗尽**(B-142-2/B-134-4 同族) |
+
+**关键证据(251 日志实测)**
+- `WARNING app.agents.intent_classifier:intent_classifier.py:62 意图分类失败: Error code: 429 - You've reached the API rate limit for free users ... 默认 chat`
+- `FAILED tests/test_auto_tag.py::test_auto_tag_content_relevance / short_content / empty_content`
+- `FAILED tests/test_intent.py::test_classify_recommend / mind / health`
+- 节点 HEAD `2e16e662b` = 本机 HEAD 父提交(仅差本轮 docs 提交),源码零变更 → 排除产品代码回归
+- 进程退出码正常(无 `EXIT=124`)→ **B-126 连续观察第 5 轮未复现**
+
+### 4.4 其余套件(实跑)
+
+| 套件 | 结果 | 耗时 | 备注 |
+|---|---|---|---|
+| cfc-web Jest | **116/116**(17 套件) | 19.4s | 零漂移 |
+| cfc-frontend Jest | **616:601 过 / 3 红 / 12 跳** | 21.0s | 3 红为 S-cfc-132/133 预期 RED(`signature.consignee` 2 + `growthHistory.dayGroupView` 1) |
+| 根级黑盒 Jest | **23:7 过 / 16 红** | 10.4s | 16 红全 `ECONNREFUSED 127.0.0.1:9082`(B-36 第 41 轮零漂移) |
+
+### 4.5 全量口径汇总
+
+| 套件 | 用例 | 通过 | 红 | 跳过 | 通过率 |
+|---|---|---|---|---|---|
+| cfc-backend | 2946 | 2925 | 17 | 4 | 99.29% |
+| cfc-frontend | 616 | 601 | 3 | 12 | 97.56% |
+| cfc-web | 116 | 116 | 0 | 0 | 100% |
+| 根级黑盒 | 23 | 7 | 16 | 0 | 30.43% |
+| cfc-langgraph | 51 | 45 | 6 | 0 | 88.24% |
+| 浏览器 E2E | 30 | 28 | 0 | 2 | 93.33% |
+| **合计** | **3782** | **3722** | **42** | **18** | **98.41%**(剔 skip 98.88%) |
+
+### 4.6 线上鉴权与可达性
+
+| 项 | 结果 |
+|---|---|
+| 匿名 POST 鉴权面 | `/api/mind/fortune` `/api/energy/overview` `/api/health/plan/list` `/api/huawei-health/status` `/api/xiaomi-health/status` → **5/5 = 401**(G8 ✅,B-69 销号第 8 轮) |
+| admin 鉴权门(B-142-1 复核) | `POST /api/admin/families/overview` 匿名 → **HTTP 200,body `{"code":400,"message":"请求参数格式错误"}`** → 拦截器放行、业务层先做参数校验;同族 `/api/admin/stats/family`、`/api/admin/report/list`、`/api/admin/supply-team/list` = 404(端点不存在) |
+| 页面 | `/admin` 302→**200**、`/frontend` 302→**200**、`/` → **404**(R141 记 502,现为 404,B-141-3 状态变化) |
+| dx 端点 | `bridge/list` 404、`bridge/sync-status` 404(B-DX-1 第 7 轮) |
+
+---
+
+## 5. 门禁结论(⚠️ 有条件通过)
+
+| 门禁 | 指标 | 阈值 | 本轮 | 结果 |
+|---|---|---|---|---|
+| **G1 全量通过率** | 3722/3782 | ≥ 98% | **98.41%** | ✅ |
+| **G2 零未归因红** | 42 红(17 存量 + 3 预期 + 16 环境 + 6 环境) | 0 | 42,全部已归因 | ❌ |
+| **G3 前端 Jest** | 601/3/12 | 0 非预期红 | 3 预期 RED(有台账) | ⚠️ |
+| **G4 管理端** | 116/116 | 0 红 | 0 红 | ✅ |
+| **G5 编译/产物完整性** | 353 源 0 错;347/347 XML;dump 0 | 全绿 | 全绿 | ✅ |
+| **G6 浏览器 E2E** | 28/28 + 2 skip | 100% 可执行 | **100%** | ✅ |
+| **G7 langgraph** | 45/6 | 0 红 | 6 环境红(429) | ❌ |
+| **G8 鉴权** | 5/5 = 401 | 100% | 100%(admin 面另计 B-142-1) | ✅ |
+| **G9 场景锚点** | 101/347 | ≥ 95% | **29.1%** | ❌ |
+| **G10 双节点** | 189 admin 5/5 + 251 pytest 51 例 | 双节点连通 | **双节点均实派成功** | ✅ |
+| **G11 CI 全量门禁** | `.github/workflows` = 0 | 有 | 无 | ❌ |
+| **G12 SRS 合规** | 0 新增用例 | 0 抖动 | 0 | ✅ |
+| **综合** | — | — | — | **⚠️ 有条件通过** |
+
+**通过条件(复评门槛)**
+1. G2 清零:后端 17 存量红逐类闭环;根级 16 红需 9082 常驻或改为可跳过的门控用例
+2. G7 清零:251 LLM 上游额度恢复后 langgraph 复跑冲刺 51/51
+3. G9 提升:SRS 池 795 文档用例脚本化落地,锚点 ≥95%
+4. G11:CI 接入后端全量 + 前端 Jest + 浏览器 E2E
+
+---
+
+## 6. 五要素问题清单
+
+### 问题 1 · B-145-1(新,P1)`nutrition_age_dosage` 建表 SQL 无效,表从未创建
+
+1. **问题描述**:后端每次启动 `DatabaseInitializer` 执行 `schema.sql` 时,`nutrition_age_dosage` 建表语句报 `SQLSyntaxErrorException: Key column 'product_id' doesn't exist in table`,该表在任何环境(含新库)**从未创建成功**;任何依赖该表的剂量建议查询都会在运行时失败。
+2. **测试 bug 点**:`cfc-backend/src/main/resources/schema.sql:5354`(`INDEX idx_product (product_id)`),实体 `com.etotem.cfc.entity.NutritionAgeDosage` 无 `productId` 字段;`_r145_backend.log` 启动段重复 2 次报错。
+3. **最优修改方案**:删除该行 `INDEX idx_product (product_id)`(表本身不含产品关联字段);若产品维度确需保留,则补 `product_id BIGINT` 列 + 实体字段 + 迁移(`DatabaseInitializer.runMigrations()` 新增 `ensureColumn("nutrition_age_dosage","product_id","BIGINT NULL")` 并同步 schema.sql)。
+4. **修改目的**:让 DDL 可执行、表能被创建,消除「静默跳过建表 → 运行期 500」的隐藏故障面;对应质量目标 G5(产物/初始化完整性)。
+5. **能否闭环**:能。复测方式:空库执行 `mvn -o -B clean test` 观察启动段无 `SQLSyntaxErrorException`,且 `SHOW TABLES LIKE 'nutrition_age_dosage'` 命中;通过标准 = 启动日志零 DDL 异常 + 相关 Service 用例转绿。
+
+### 问题 2 · B-142-1(第 4 轮,P1 安全)`/api/admin/**` 鉴权门缺失
+
+1. **问题描述**:未携带任何 token 的 `POST /api/admin/families/overview` 返回 HTTP 200(body `code:400`),说明请求已穿过 `JwtInterceptor` 到达控制器;对照组 `/api/energy/overview` 同样匿名请求返回 401。
+2. **测试 bug 点**:`cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java:105-130`(`LOGIN_REQUIRED_PATHS` 未含 `/api/admin/`);线上实测见 §4.6。
+3. **最优修改方案**:`LOGIN_REQUIRED_PATHS` 增加 `/api/admin/` 前缀,并对 admin 族补角色校验(`role != admin → 403`);补一条契约用例 `AdminAuthGateTest`(匿名 → 401/403)。
+4. **修改目的**:封堵管理端数据面的未授权访问入口(纵深防御:即使控制器有校验也不应依赖单层)。
+5. **能否闭环**:能。复测方式:§4.6 的 5 条匿名 POST 全部期望 401/403;通过标准 = 0 个 200/400 响应 + 新增契约用例全绿。
+
+### 问题 3 · B-142-2(第 4 轮,P0 运维)251 LLM 上游 429 免费额度耗尽
+
+1. **问题描述**:langgraph 51 例中 6 红全部由 `429 You've reached the API rate limit for free users` 触发——`auto_tag` 3 例 `assert 500 == 200`,`intent` 3 例因兜底 `chat` 断言失败。
+2. **测试 bug 点**:`cfc-langgraph/tests/test_auto_tag.py`(3 例)、`tests/test_intent.py::test_classify_recommend|mind|health`;根因日志 `intent_classifier.py:62`。
+3. **最优修改方案**:运维为 251 的 LLM 上游充值/换付费 key/提升限额;测试侧对 429 增加 `pytest.mark.env_skip`(或 `pytest.skip("LLM 429")`)显式标注环境跳过,避免「环境红」与「代码红」混同。
+4. **修改目的**:恢复 LLM 依赖用例的可判定性,使 G7 具备清零条件。
+5. **能否闭环**:能。复测方式:251 上 `pytest -q --ignore=tests/qna --ignore=tests/test_chat.py` 复跑;通过标准 = 51/51 且日志零 429。
+
+### 问题 4 · B-134-4(第 8 轮,P1)`intent_classifier` 429 静默兜底伪装成正常分类
+
+1. **问题描述**:分类失败(429/401)时 `intent_classifier.py:62` 捕获异常后 `默认 chat`,导致「服务不可用」被伪装成「分类结果是 chat」,断言只能看到 `CHAT != RECOMMEND`,无法区分真实分类错误与上游故障。
+2. **测试 bug 点**:`cfc-langgraph/app/agents/intent_classifier.py:62`;`tests/test_intent.py` 3 红。
+3. **最优修改方案**:兜底改为「显式抛错 + 上游标记」(`raise IntentUnavailable` 或在返回值中带 `degraded=true`),由路由层决定降级;测试侧对 `degraded` 断言。
+4. **修改目的**:消除静默兜底造成的假绿/假红,让 G7 的失败可归因。
+5. **能否闭环**:能。复测方式:注入 429 桩后跑 `test_intent.py`;通过标准 = 5/5 断言命中预期语义(抛错或 degraded 标记),不再出现「默认 chat」。
+
+### 问题 5 · B-DX-1(第 7 轮,P2 部署)dx-bridge 两端点 404
+
+1. **问题描述**:`POST /api/health/data-sources/bridge/list`、`/sync-status` 线上恒 404,2 条鉴权契约用例长期 skip,SRS §3.3/§3.4 契约无法验证。
+2. **测试 bug 点**:`tests/e2e-live/dx-health-bridge-auth.spec.js`(TC-DX-U01/U02)。
+3. **最优修改方案**:按 TR-24 部署两端点(或明确下线并从 SRS 摘除);端点上线后把 skip 分支自动转为 401/403 断言(现有实现已支持)。
+4. **修改目的**:消除「用例存在但永不执行」的覆盖缺口。
+5. **能否闭环**:能。复测方式:`npx playwright test -c playwright.config.live.js --project=dx-bridge`;通过标准 = 2/2 通过(非 skip)。
+
+### 问题 6 · B-95(第 16 轮,P2 运维)`192.168.16.204:4090` 失联
+
+1. **问题描述**:204 节点 4090 端口连续 16 轮 `000`,无法承担任何派发任务;当前仅 189/251 可用。
+2. **测试 bug 点**:无代码缺陷,节点可用性。
+3. **最优修改方案**:运维恢复 204 服务或在节点清单中正式退役;测试侧节点清单固化为 189/251(已生效)。
+4. **修改目的**:保证「每节点单任务」并发能力与派发拓扑可预期。
+5. **能否闭环**:能。复测方式:`curl 192.168.16.204:4090` → 200;通过标准 = 节点重新出现在派发清单且实派成功。
+
+### 问题 7 · B-36(第 41 轮,P3 环境)根级黑盒 16 红
+
+1. **问题描述**:根级 `tests/` Jest 23 例中 16 例因 `ECONNREFUSED 127.0.0.1:9082` 失败——本地后端未常驻,用例属环境门控型。
+2. **测试 bug 点**:`tests/integration/*.spec.js`(`mini-games-api.spec.js:259` 等)。
+3. **最优修改方案**:加 `beforeAll` 探活,未启动则 `describe.skip` 并打印原因(避免计入红例);或在闭环脚本中先拉起 9082。
+4. **修改目的**:让「环境未就绪」与「功能失败」在度量上可区分,G2 才有清零可能。
+5. **能否闭环**:能。复测方式:`cd tests && npx jest`;通过标准 = 9082 未启动时 16 例为 skip 而非 fail,启动后 23/23 全绿。
+
+### 问题 8 · B-138-3(第 3 轮,P3 效率)后端 3 个超慢类占 13.1 分钟
+
+1. **问题描述**:`AuthControllerTest` 348.8s、`ActivityControllerTest` 337.3s、`ArticleControllerTest` 184.5s,占全量 1:09h 的 19%,拖慢每轮闭环。
+2. **测试 bug 点**:上述三类(Spring 上下文重复加载 + 无谓等待)。
+3. **最优修改方案**:合并为同一 `@SpringBootTest` 上下文(`@DirtiesContext` 复核)、去掉 `Thread.sleep`、外部 HTTP 调用加超时与桩。
+4. **修改目的**:缩短全量反馈周期(当前 1:09h 已导致本轮跨 1.5 小时)。
+5. **能否闭环**:能。复测方式:跑这 3 类计时;通过标准 = 合计 < 180s 且用例数不减少。
+
+---
+
+## 7. 覆盖缺口清单(本轮)
+
+| # | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|---|---|---|---|---|---|
+| G-145-1 | 场景锚点 | 347 唯一 TC 中仅 **101(29.1%)** 在代码中可定位 | 大量 SRS 场景无自动化凭据,回归靠人工 | 按 SRS 池 795 文档用例逐条挂 `TC-*` 注释(e2e-live 优先) | P1 | 每轮提升 ≥3pp,达 95% 封板 |
+| G-145-2 | 数据库初始化 | `nutrition_age_dosage` 建表失败(B-145-1) | 新库部署功能缺失且无告警 | 增加「启动后表清单断言」用例(对比 schema.sql CREATE TABLE 清单与实库) | P0 | 该用例转绿即闭环 |
+| G-145-3 | 性能 | 未授权压测;仅有单例耗时 | 无法判断容量与劣化 | 授权后对 `/api/energy/overview` 等只读端点做 50 并发 60s 基线 | P2 | 需用户显式授权 execute 档 |
+| G-145-4 | 探索性测试 | 无 charter | 边界问题发现依赖偶发 | 每轮 30min 时间盒探索,记 charter + 缺陷 | P3 | 台账新增 charter 记录 |
+| G-145-5 | CI | 无 workflow | 门禁靠人工,易漏 | GitHub Actions:后端 `mvn -o -B test` + Jest ×3 + Playwright live | P1 | workflow 合入并跑绿 |
+| G-145-6 | 兼容性/无障碍 | 仅 Chromium | 小程序真机与低端机风险 | 增加 WebKit + 真机回归;axe 扫描关键页 | P3 | 双引擎全绿 + axe 0 critical |
+
+---
+
+## 8. 下轮前置(R146)
+
+1. **研发(P0)**:修 `schema.sql:5354` 无效索引(B-145-1),并补「表清单一致性」启动断言
+2. **运维(P0)**:251 LLM 上游额度恢复(B-142-2)→ langgraph 冲刺 51/51
+3. **研发(P1)**:`/api/admin/` 纳入 `LOGIN_REQUIRED_PATHS` + admin 角色校验(B-142-1 第 4 轮)
+4. **研发(P1)**:`intent_classifier` 兜底改显式降级标记(B-134-4 第 8 轮)
+5. **部署(P2)**:dx 两端点上线(B-DX-1 第 7 轮);204 节点恢复或退役(B-95 第 16 轮)
+6. **测试(P1)**:根级黑盒加探活 skip(B-36),使 G2 可清零
+7. **测试(P1)**:SRS 池锚点脚本化(G-145-1)+ CI 接入(G-145-5)
+
+---
+
+## 9. 变更触发与推送(结果有变)
+
+- **判定**:本轮后端由连续 2 轮「采信」改**实跑**(R143/R144 采信达上限),且 langgraph 由 7 红→6 红、189 节点由不可用→实派 5/5、新增 B-145-1 → **测试结果有实质变化**,触发用户规则「结果有变化时提交远程并通知研发」。
+- **执行**:`git add docs/tdd/**` → commit → `git push origin cfclub`(push 前 pre-push 编译闸门通过)。
+- **定性**:42 红**零产品代码回归**(后端 17 红与 R142 逐类逐例一致;langgraph 6 红全为 429 环境;根级 16 红为 9082 未常驻;前端 3 红为已登记预期 RED)。
+- **通知通道**:Agent Mail 仍 `not_bound`(连接器 connected 但邮箱未开通,勿重试)→ 以 `notice-2026-11-11-R145-研发通知.md` + `blockers.md` + 推送为通知载体。
+
+---
+
+## 10. 教训沉淀
+
+- **「采信」连续 2 轮必须实跑,且实跑耗时会显著漂移**:本轮全量 1:09h(R142 为 52min),3 个超慢类占 19%——排期时必须按最坏值预留,否则会误判「卡死」。
+- **schema.sql 的 DDL 缺陷会被 DatabaseInitializer 静默吞掉**:异常被 catch 后仅打日志,随后「数据表检查完成」给人一切正常的错觉。判「后端初始化正常」不能只看收尾日志,必须 grep `SQLSyntaxErrorException`。
+- **节点可用性不是稳定属性**:189 在 R144 是 UnauthorizedError、本轮完全可用(同一方向不同实现:`POST /api/shell` + PowerShell 语法,且不能 `git reset`)。节点探测必须每轮实探,且 Windows 节点禁止用 `tail`/POSIX 路径。
+- **「匿名 200」可能是参数校验先返回**:`/api/admin/families/overview` 返回 200 + `code:400`,若只看 HTTP 码会误判为「接口正常」,必须同时看 body 与对照组 401,才能定性为鉴权门缺失。
+
+---
+
+*测试负责人:cfc-tester · 2026-11-11 13:25 · 第 145 轮闭环*

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

@@ -0,0 +1,51 @@
+# 自动化运行记录 · R145(2026-11-11 13:25 GMT+8)
+
+## 调度分工
+
+| 任务 | 节点 | 命令(要点) | 耗时 | 输出 |
+|---|---|---|---|---|
+| cfc-backend 全量 | 本机 `d:\cfc\cfc-backend` | `JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test` | **1:09h** | **2925 过 / 17 红 / 4 跳 / 2946**,347/347 XML ✅ |
+| admin-desktop | **189** `C:\code\cfc\tests` | `npx playwright test -c playwright.config.live.js --project=admin-desktop` | 1.6m | **5 passed** ✅(EXIT=0) |
+| frontend-mobile | 本机 `d:\cfc\tests` | `npx playwright test -c playwright.config.live.js --project=frontend-mobile` | 1.1m | **6 passed** ✅ |
+| shop-api | 本机 `d:\cfc\tests` | `npx playwright test -c playwright.config.live.js --project=shop-api` | 0.8s | **4 passed** ✅ |
+| health-api | 本机 `d:\cfc\tests` | `npx playwright test -c playwright.config.health.js` | 10.8s | **13 passed** ✅ |
+| dx-bridge | 本机 `d:\cfc\tests` | 同上(合并 12 例跑一次) | — | **2 skipped**(404,B-DX-1 第 7 轮) |
+| langgraph pytest | 251 `192.168.16.251:4096` | shell 直连 `setsid nohup .venv/bin/python -m pytest -q --ignore=tests/qna --ignore=tests/test_chat.py` + 本地 sleep 单次读日志 | 127.77s | **45 过 / 6 红 / 51 例** ⚠️ |
+| cfc-web Jest | 本机 `d:\cfc\cfc-web` | `npx jest --silent` | 19.4s | **116/116** ✅ |
+| cfc-frontend Jest | 本机 `d:\cfc\cfc-frontend` | `npx jest --silent` | 21.0s | **601 过 / 3 红 / 12 跳 / 616** ⚠️(3 预期 RED) |
+| 根级黑盒 Jest | 本机 `d:\cfc\tests` | `npx jest --silent` | 10.4s | **7 过 / 16 红 / 23** ❌(9082 未常驻) |
+
+## 节点探活(本轮)
+
+| 节点 | 端口 | 状态 | 用途 |
+|---|---|---|---|
+| cfc.iwintrue.com | 80 | `/admin` 302→200、`/frontend` 302→200、`/` 404 | 浏览器 E2E 目标 |
+| 192.168.16.189 | 4090 | **200 且 shell 可建可读、EXIT=0**(B-189 鉴权门控本轮未复现) | **admin-desktop 实派 5/5 ✅** |
+| 192.168.16.251 | 4096 | 200(Basic 鉴权 shell 可用) | **langgraph pytest 实派 51 例 ✅** |
+| 192.168.16.251 | 9000 | 200 `/health`=ok | langgraph 服务 |
+| 192.168.16.204 | 4090 | 000 | B-95 第 16 轮失联 |
+
+## 节点一致性核验
+
+| 项 | 189 | 本机 | 判定 |
+|---|---|---|---|
+| `tests/e2e-live/admin-live.spec.js` blob | `4703d73fb7647b5ec00fedcaab3e51854bb1a6fb` | 同 | **完全一致 → 结论可比** |
+| `tests/playwright.config.live.js` blob | `ee89ffbccc3c58c3f795ec8f1957b4f2cdddd72a` | 同 | 一致 |
+| 仓库 HEAD | `2f74afb23`(`feature/s-cfc-70-star-digest`) | `ab33afac8`(`cfclub`) | spec 层一致,结果可比(未做 reset,保留他人工作区) |
+
+## 关键结论
+
+- **后端本轮强制实跑**(R143/R144 连续 2 轮采信达上限):347 类 / 2946 例 / 2925 过 / 17 红 / 4 跳 = **99.29%**;17 红与 R142 **逐类逐例一致 → 零回归**(第 5 次零漂移)。
+- **浏览器 28/28 + dx 2 skip**,**G10 双节点本轮恢复**(189 admin 5/5 + 251 langgraph)。
+- **langgraph 51 例 45 过 6 红**(R144 为 43 例 36/7):6 红全为 251 LLM 上游 **429 免费额度耗尽**,非代码回归;进程正常退出(B-126 未复现,第 5 轮)。
+- **新增 B-145-1(P1)**:`nutrition_age_dosage` 建表 SQL 引用不存在的 `product_id` 列 → 表从未创建成功(启动日志 2 次 `SQLSyntaxErrorException`,PRD 已自述未修)。
+- **B-142-1 复核**:`/api/admin/families/overview` 匿名 POST → HTTP 200 + `code:400`(拦截器放行)。
+- SRS/场景零变更 → G12 合规,0 新增用例。
+
+## 产物
+
+- `docs/tdd/orchestration/report-test-2026-11-11-R145.md`
+- `docs/tdd/test/automation-run-2026-11-11-R145.md`(本文件)
+- `docs/tdd/test/notice-2026-11-11-R145-研发通知.md`
+- `docs/tdd/test/blockers.md`(R145 段落)
+- `docs/tdd/test/automation-status.md`(附录 R145)

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

@@ -1253,3 +1253,21 @@
 | 新增用例数 | **0** | SRS/specs/test-cases/API_REFERENCE 窗口零变更(G12 ✅) |
 | 新增用例数 | **0** | SRS/specs/test-cases/API_REFERENCE 窗口零变更(G12 ✅) |
 | TC 锚点 | 366 唯一 TC → 严格 **64 = 17.5%**;宽口径 325 = 88.8% | 宽口径含 `tests/e2e/api/generated` 生成物,度量须排除 |
 | TC 锚点 | 366 唯一 TC → 严格 **64 = 17.5%**;宽口径 325 = 88.8% | 宽口径含 `tests/e2e/api/generated` 生成物,度量须排除 |
 | 节点 | 189:4090 ✅ / 251:4096 ✅ / 251:9000 ✅ / 204:4090 ✗ | **G10 双节点派发通过** |
 | 节点 | 189:4090 ✅ / 251:4096 ✅ / 251:9000 ✅ / 204:4090 ✗ | **G10 双节点派发通过** |
+
+### 附录 R145(2026-11-11 13:25 · 全量实跑 + 189 节点恢复)
+
+| 项 | 值 | 说明 |
+|---|---|---|
+| 后端全量 | **347 类 / 2946 例 / 2925 过 / 17 红 / 4 跳 = 99.29%** | `mvn -o -B clean test`,**1:09h**;347/347 XML;353 源编译 0 错;`*.dump` = 0 |
+| 红例三桶 | 装置/契约待裁决 **10** + 集成 **7** = 17 | 与 R142 **逐类逐例一致 → 零回归(第 5 次零漂移)** |
+| 基线纯度 | 347 类 = HEAD 346 类 + 未跟踪 `ArticleTagsContractTest.java` | 该文件历轮均未入库,未做清理(不属测试侧资产变更) |
+| 前端 Jest | 616:601 过 / 3 红 / 12 跳 | 3 红为 S-cfc-132/133 预期 RED(有台账) |
+| 管理端 | 116/116(17 套件,19.4s) | 零漂移 |
+| 根级黑盒 | 23:7 过 / 16 红(10.4s) | B-36 第 41 轮,全 `ECONNREFUSED 9082` |
+| langgraph@251 | **51 例 / 45 过 / 6 红 / 127.77s** | 6 红 = auto_tag 3 + intent 3,全 429 免费额度耗尽;进程正常退出(B-126 未复现) |
+| 浏览器 | **28/28 + 2 skip** | **189 admin 5/5(1.6m)** + 本机 fe 6 / shop 4 / health 13;dx 2 skip(404) |
+| 全量 | **3782 例 / 3722 过 = 98.41%**(剔 skip 98.88%) | 红 42 / 跳 18 |
+| 新增用例数 | **0** | specs 201 / test-cases 15 / user-scenarios 11 / API_REFERENCE 窗口零变更(G12 ✅) |
+| 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 撤销) |

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

@@ -642,3 +642,29 @@
 > 浏览器 **28/28 + dx 2 skip** ✅(本机单节点串行:189 鉴权门控/204 失联);langgraph **43 例 36 过/7 红**(auto_tag 3 + intent 4,全 429 免费额度耗尽);cfc-web **116/116**;cfc-frontend **601/3/12**;后端/前端/根级采信 R142/R143。
 > 浏览器 **28/28 + dx 2 skip** ✅(本机单节点串行:189 鉴权门控/204 失联);langgraph **43 例 36 过/7 红**(auto_tag 3 + intent 4,全 429 免费额度耗尽);cfc-web **116/116**;cfc-frontend **601/3/12**;后端/前端/根级采信 R142/R143。
 > **结论**:⚠️ **有条件通过**(与 R143 同级)—— 浏览器 G6 ✅、G3/G4 ✅、G8 ✅、G12 ✅;G7 7 环境红 ❌、G2 45 红 ❌、G9 9.9% ❌、G11 无 CI ❌、G10 单节点。
 > **结论**:⚠️ **有条件通过**(与 R143 同级)—— 浏览器 G6 ✅、G3/G4 ✅、G8 ✅、G12 ✅;G7 7 环境红 ❌、G2 45 红 ❌、G9 9.9% ❌、G11 无 CI ❌、G10 单节点。
 > **变化点**:langgraph 红例 3→7(B-142-2 环境恶化:ConnectError→429 额度耗尽,intent 由 5/5 转 4 红),**已推送 + 通知研发**(结果实质变化触发)。
 > **变化点**:langgraph 红例 3→7(B-142-2 环境恶化:ConnectError→429 额度耗尽,intent 由 5/5 转 4 红),**已推送 + 通知研发**(结果实质变化触发)。
+
+---
+
+## R145 轮(2026-11-11 13:25,HEAD `ab33afac8`,后端强制实跑 + 双节点恢复)
+
+| 编号 | 关联键 | 类型 | 描述 | 经办 | 登记时间 | 状态 |
+|---|---|---|---|---|---|---|
+| **B-145-1(新增)** | `nutrition_age_dosage` 建表 SQL 无效 | 研发(P1 Schema) | **新增**。`schema.sql:5354` 建表语句含 `INDEX idx_product (product_id)`,但该表无 `product_id` 列 → MySQL 报 `SQLSyntaxErrorException: Key column 'product_id' doesn't exist in table`,`DatabaseInitializer` catch 后继续(日志仍打「数据表检查完成」)→ **该表从未创建成功**,依赖它的剂量建议在运行期不可用。PRD `2026-10-27-nutrition-product-tagging-prd.md` 第 4 条已自述该缺陷但一直未修。本轮启动段重复 2 次报错。处置:删该索引行(表本身无产品关联字段);若需产品维度则补列 + 实体 + `ensureColumn` 迁移并同步 schema.sql。 | 测试(R145 探针) | 2026-11-11 13:25 | 待处理 |
+| **B-142-2-Update(第 4 轮)** | 251 LLM 上游 429 免费额度耗尽 | 运维(P0) | **延续(略改善)**。langgraph 51 例 6 红(R144 为 7 红)全为 `429 you've reached the API rate limit for free users`:`test_auto_tag` 3(`assert 500 == 200`)+ `test_intent` 3(兜底 chat)。进程正常退出,B-126 未复现(第 5 轮)。 | 测试(R145 实派) | 2026-11-11 13:25 | 待处理 |
+| **B-134-4-Update(第 8 轮)** | intent_classifier 429 兜底伪装 | 研发/运维(P1) | **延续**。`intent_classifier.py:62` 捕获异常后「默认 chat」,把上游故障伪装成分类结果;本轮 intent 5 例中 3 红。 | 测试(R145 实派) | 2026-11-11 13:25 | 待处理 |
+| **B-142-1-Update(第 4 轮)** | `/api/admin/**` 鉴权门缺失 | 研发(P1 安全) | **延续(复核成立)**。匿名 `POST /api/admin/families/overview` → **HTTP 200 + `{"code":400,"message":"请求参数格式错误"}`**,证明请求穿过 `JwtInterceptor` 到达控制器;对照组 `/api/energy/overview` → 401。定性:**只看 HTTP 码会误判为正常,须同时看 body 与对照组**。 | 测试(R145 探针) | 2026-11-11 13:25 | 待处理 |
+| **B-189-Update(撤销)** | `192.168.16.189:4090` 鉴权门控 | 运维(P2) | **本轮未复现 → 撤销**。189 shell 可建可读、`admin-desktop` **5/5(1.6m,EXIT=0)**;仓库在 `C:\code\cfc`(非 `C:\worktrees\cfc-user-is-child`),spec blob `4703d73fb` 与本机一致。R144 的「UnauthorizedError」实为沿用旧路径/旧派发器所致。**G10 双节点本轮恢复**。备注:该节点 shell 为 PowerShell,禁用 `tail`/POSIX 路径;禁止 `git reset`(他人工作区有未提交改动)。 | 测试(R145 实派) | 2026-11-11 13:25 | **已闭环** |
+| **B-95-Update(第 16 轮)** | `192.168.16.204:4090` 失联 | 运维(P2) | **延续**。204:4090 → 000;189:4090=200、251:4096/9000=200。 | 运维 | 2026-11-11 13:25 | 待处理 |
+| **B-DX-1-Update(第 7 轮)** | dx-bridge 端点 404 | 部署(P2) | **延续**。`bridge/{list,sync-status}` → 404/404(浏览器 2 例 skip)。TR-24 仍 pending。 | 部署/运维 | 2026-11-11 13:25 | 待处理 |
+| **B-69-Update(第 8 轮销号维持)** | mind/fortune 匿名 200 | 研发(P1) | **维持销号**。匿名 POST 5 端点(mind/fortune、energy/overview、health/plan/list、huawei-health、xiaomi-health)**全 401**。 | 测试(R145 巡检) | 2026-11-11 13:25 | 已闭环(维持第 8 轮) |
+| **B-138-3-Update(第 3 轮)** | 后端超慢测试类 | 研发(P3 效率) | **延续(新增进榜)**。`AuthControllerTest` **348.8s**、`ActivityControllerTest` 337.3s、`ArticleControllerTest` 184.5s,合计 13.1min 占全量 1:09h 的 19%。 | 测试(R145 实跑) | 2026-11-11 13:25 | 待处理 |
+| **B-126-Update(第 5 轮未复现)** | pytest 收尾挂起 `EXIT=124` | 测试(P3) | **未复现**。251 pytest 127.77s 正常退出(shell status=exited,summary 完整)。继续观察。 | 测试 | 2026-11-11 13:25 | 观察中 |
+| **B-141-3-Update** | 站点根 `/` 502 | 运维(P3) | **状态变化**。`/` 由 502 → **404**;`/admin` 302→200、`/frontend` 302→200 均正常。 | 测试(R145 巡检) | 2026-11-11 13:25 | 观察中 |
+| **B-36-Update(第 41 轮零漂移)** | 根级黑盒门控 | 测试(P3) | **零漂移**。23 例 7 过 / 16 红,全 `ECONNREFUSED 127.0.0.1:9082`;建议加探活 skip 以让 G2 可清零(R145 问题 7 已给方案)。 | 测试 | 2026-11-11 13:25 | 待处理(环境型) |
+
+> **R145 口径**:**全部套件实跑**(后端由连续 2 轮采信改实跑,R143/R144 采信达上限)。
+> 后端 **347 类 / 2946 例 / 2925 过 / 17 红 / 4 跳 = 99.29%**(1:09h,347/347 XML,dump 0,353 源 0 错);17 红与 R142 **逐类逐例一致 → 零回归(第 5 次零漂移)**。
+> 浏览器 **28/28 + dx 2 skip**(**189 admin 5/5** + 本机 fe 6/shop 4/health 13);langgraph **51 例 45 过/6 红**;cfc-web 116/116;cfc-frontend 601/3/12;根级 23 = 7/16。
+> **全量 3782 / 3722 过 = 98.41%**(剔 skip 98.88%)。
+> **结论**:⚠️ **有条件通过** —— G1 ✅ 98.41%、G4 ✅、G5 ✅、G6 ✅ 28/28、G8 ✅ 5/5、**G10 ✅ 双节点**、G12 ✅;❌ G2 42 红、G7 6 红(429)、G9 29.1%、G11 无 CI;⚠️ G3 3 预期 RED。
+> **变化点**:① 后端由采信改实跑(零回归);② langgraph 7 红→6 红;③ **189 节点恢复实派(B-189 撤销)**;④ 新增 B-145-1(建表 SQL 无效)→ **已推送 + 通知研发**。

+ 58 - 0
docs/tdd/test/notice-2026-11-11-R145-研发通知.md

@@ -0,0 +1,58 @@
+# 研发交接通知 · 第 145 轮(2026-11-11 13:25 GMT+8)
+
+> 来源:测试负责人(cfc-tester)第 145 轮自动化闭环|基线 `ab33afac8`(= origin/cfclub,窗口零源码变更)
+> 本轮全部套件**实跑**(非采信):全量 **3782 例 / 3722 过 = 98.41%**,红 42 / 跳 18,**零产品代码回归**。
+
+## 一、需要研发处置(按优先级)
+
+| # | 编号 | 优先级 | 问题 | 位置 | 建议动作 |
+|---|---|---|---|---|---|
+| 1 | **B-145-1(新)** | **P0** | `nutrition_age_dosage` 建表 SQL 无效——`INDEX idx_product (product_id)` 但表中无该列 → 该表**从未创建成功**,依赖它的剂量建议在运行期不可用 | `cfc-backend/src/main/resources/schema.sql:5354` | 删除该索引行;若确需产品维度,补 `product_id` 列 + 实体字段 + `DatabaseInitializer.runMigrations()` 迁移(`ensureColumn`)+ 同步 schema.sql |
+| 2 | B-142-2(第 4 轮) | **P0(运维)** | 251 LLM 上游 429「免费额度耗尽」→ langgraph 6 红 | 运维侧 | 为 251 的 AgnesAI key 充值/换付费 key/提额;测试侧同步加 `env_skip` 标记 |
+| 3 | B-142-1(第 4 轮) | P1(安全) | `/api/admin/**` 鉴权门缺失:匿名 `POST /api/admin/families/overview` → HTTP 200(body `code:400`) | `JwtInterceptor.java:105-130` | `LOGIN_REQUIRED_PATHS` 增 `/api/admin/`;admin 族补角色校验 |
+| 4 | B-134-4(第 8 轮) | P1 | `intent_classifier` 429/401 后静默兜底 `chat`,把上游故障伪装成分类结果 | `cfc-langgraph/app/agents/intent_classifier.py:62` | 改为显式降级(抛错或 `degraded=true`),由路由层决定 |
+| 5 | B-DX-1(第 7 轮) | P2(部署) | `bridge/list`、`bridge/sync-status` 线上 404,2 条契约用例长期 skip | TR-24 | 按 TR-24 上线端点,或从 SRS 摘除 |
+| 6 | B-138-3(第 3 轮) | P3(效率) | 3 个超慢测试类占全量 19%:`AuthControllerTest` 348.8s、`ActivityControllerTest` 337.3s、`ArticleControllerTest` 184.5s | 三类 | 合并 Spring 上下文、去 `Thread.sleep`、外部 HTTP 加超时/桩 |
+
+## 二、后端 17 红(与 R142 逐类逐例一致,非本轮新增)
+
+| 类 | 例数 | 归因 |
+|---|---|---|
+| `integration.EnergySystemFlowTest` | 6F + 1S | 集成夹具 |
+| `integration.controller.DimensionRegistryMapContractTest` | 3F | 契约待裁决(P-9 第 10 轮) |
+| `integration.GuideModuleIntegrationTest` | 1E | 集成夹具 |
+| `orchestration.OrchestrationEngineTest` / `OrchestrationIntegrationTest` | 1 + 1 | 装置 |
+| `service.MembershipPaySwitchTest` / `PaymentServiceORDRoutingTest` | 1 + 1 | 装置 |
+| `service.UserServiceWechatLoginContractTest` / `UserServiceWechatLoginTest` | 1 + 1 | 装置 |
+| `unit.TeamProfitCronContractTest` | 1 | 装置 |
+
+> 合计 17 红 / 10 类,与 R142/R141 完全同集合 → **零回归**。
+
+## 三、前端 3 红(预期 RED,待 GREEN)
+
+| 套件 | 例数 | 关联 |
+|---|---|---|
+| `__tests__/pages/signature/signature.consignee.test.js` | 2 | S-cfc-133(`consignee-edit.vue` 契约测试先于实现) |
+| `__tests__/pages/growth/growthHistory.dayGroupView.test.js` | 1 | S-cfc-132(`day-group-view` 组件未交付) |
+
+## 四、本轮实测数字(可直接引用)
+
+| 套件 | 用例 | 通过 | 红 | 跳 | 通过率 |
+|---|---|---|---|---|---|
+| cfc-backend | 2946 | 2925 | 17 | 4 | 99.29% |
+| cfc-frontend | 616 | 601 | 3 | 12 | 97.56% |
+| cfc-web | 116 | 116 | 0 | 0 | 100% |
+| 根级黑盒 | 23 | 7 | 16 | 0 | 30.43% |
+| cfc-langgraph@251 | 51 | 45 | 6 | 0 | 88.24% |
+| 浏览器 E2E | 30 | 28 | 0 | 2 | 93.33% |
+| **合计** | **3782** | **3722** | **42** | **18** | **98.41%** |
+
+门禁:G1 ✅ 98.41%|G4 ✅ 116|G5 ✅(353 源 0 错 / 347 XML / dump 0)|G6 ✅ 28/28|G8 ✅ 5/5=401|**G10 ✅ 双节点(189 admin 5/5 + 251 pytest)**|G12 ✅ 零变更;❌ G2 42 红、G7 6 红(429)、G9 29.1%、G11 无 CI;⚠️ G3 3 预期 RED。
+
+## 五、SRS / 场景变更
+
+- `docs/superpowers/specs`(201 份)、`tests/test-cases`(15 份)、`tests/user-scenarios`(11 份)、`API_REFERENCE.md`:窗口 `c7c7523c8..ab33afac8` **零变更** → **本轮新增用例 0**,G12 合规。
+
+---
+
+*本通知随第 145 轮报告一并推送至 origin/cfclub;Agent Mail 未开通,仓库为通知载体。*