Ver Fonte

docs(tdd): 第154轮闭环——后端采信R153强制实跑(347类/2946例/99.29%零漂移第12次)+langgraph 251实派51例47过4红(429/401,EXIT=124收尾挂起B-154-1新增)+浏览器28/28(189首轮即5/5)+fe617过602/web116/根级7过16红+全量3783/3725=98.47%; SRS零变更G12合规; 结果变化(98.49→98.47)触发push+通知研发

cfc-tdd-bot há 1 dia atrás
pai
commit
5ee1739169

+ 42 - 0
docs/tdd/notice-2026-11-11-R154-研发通知.md

@@ -0,0 +1,42 @@
+# 研发交接通知 · 测试闭环第 154 轮(2026-11-11 22:25)
+
+> 基线:`d9866096a`(= `origin/cfclub`,跑前跑后一致)。执行档 review(离线),未改生产代码。
+> 本轮结论:**不通过**(硬门禁 G2/G7/G9/G11 未达成)。核心变化:langgraph **48→47 过**(红 3→4,intent 2 例回红 + auto_tag 1 例转绿,全为上游 401/429 抖动);**pytest 挂起恶化**(前两跑早期 hang、第三跑收尾挂起 EXIT=124,新增 B-154-1);全量 **98.49%→98.47%**(−0.02pp);189 admin 首轮即 5/5(B-153-1 观察第 2 轮 0 偶发,接近销号)。
+
+## 一、需要研发/运维处置的 10 项(按优先级)
+
+| 序 | 编号 | 优先级 | 归属 | 问题 | 需要做什么 | 闭环标准 |
+|----|------|--------|------|------|------------|----------|
+| 1 | **B-154-1(新)** | **P1** | 研发(测试装置) | langgraph pytest **挂起恶化**:本轮三跑——420s 断连、250s 仅 5 dots(早期 hang)、380s 全量 51 例完成但 **EXIT=124 收尾挂起**;警告含 `coroutine 'JavaClient._get_client' was never awaited`(teardown 协程泄漏) | 定位卡点文件;pytest 加每用例超时/retry;修 teardown 协程泄漏 | 连续 2 轮 51 例 <300s 且 EXIT≠124 |
+| 2 | **B-74 / B-142-2** | **P0** | 运维/AI | 251 pytest **47/51(4 红)**:`test_auto_tag` 2(short_content/empty_content)+ `test_intent` 2(classify_analysis/classify_recommend);日志 **401 api key `****ab12` invalid** + **429 AgnesAI free 配额**(第 6 轮观察,**较 R153 波动 −1 绿**) | 轮换/扩容 key 与配额;上游故障统一 503 + 结构化 code,不映射 500 | 连续 2 轮 langgraph 全绿 |
+| 3 | **B-152-2** | **P0** | 研发(CI) | `.gitlab-ci.yml:61` `BACKEND_OBSERVED_CLASSES` 漏 3 红类(`UserServiceWechatLoginTest`/`UserServiceWechatLoginContractTest`/`TeamProfitCronContractTest`)→ `backend-blocking-junit` 必红(第 3 轮未修) | 3 类加入排除清单(或修红) | blocking job 一次运行 success |
+| 4 | **B-152-1** | P1 | 研发(CI) | 同一清单 33 类中 26 类已转绿仍未解禁 → 硬门禁覆盖被缩小(第 3 轮未修) | 清单收敛为当前 10 红类 | blocking 覆盖 ≥337 类且连续 2 轮无新红 |
+| 5 | **B-152-3** | P1 | 研发(测试装置) | `@EnableScheduling` 测试期常驻:R153 日志 4,334/31,758 行(13.6%)与全量耗时 39:42 强相关(第 3 轮未修) | 测试 profile 关闭调度;慢类缩小切片 | scheduler 日志 0 行、耗时 ≤45min、17 红集合不变 |
+| 6 | B-134-4 | P1 | 研发/AI | `app/agents/intent_classifier.py:62` 异常 → 默认 `chat`,把 429 伪装成分类错误(第 15 轮) | 兜底改为抛出/标记 `unknown`,并记录上游状态码 | 429 时不再产出 `CHAT` 断言失败 |
+| 7 | B-142-1 | P1 | 研发(安全) | 匿名 `POST /api/admin/families/overview` → **200 + code:400**(第 11 轮未修);对照组 5 端点全 401 | `/api/admin/**` 纳入 `JwtInterceptor` + role 校验 | 匿名返回 401/403 |
+| 8 | B-145-1 | P1 | 研发(Schema) | `schema.sql:5343` `nutrition_age_dosage` 含 `INDEX idx_product (product_id)` 但无该列 → 建表恒失败(第 8 轮未修) | 删索引行,或补列 + 迁移 | 启动无 `SQLSyntaxErrorException`,表存在 |
+| 9 | 后端 17 存量红 | P1 | 研发 | 10 类 17 例(EnergySystem 6 / DimensionRegistryMap 3 / Orchestration 2 / WechatLogin 2 / MembershipPay 1 / PaymentORD 1 / TeamProfitCron 1 / GuideModule 1E),**零漂移第 12 次** | 见报告 §8 / blockers 明细 | 该 10 类转绿 |
+| 10 | B-36 | P3 | 测试 | 根级 16 红全为 9082 未启动(`fetch failed`,第 48 轮零漂移) | 测试侧改 `E2E_BASE_URL` 或探活 skip | 根级红数 = 0 |
+
+## 二、测试侧观察项(非产品缺陷)
+
+- **B-153-1(P3,观察第 2 轮)**:189 admin 本轮**首轮即 5/5 全绿**(R153 首轮 U05 偶发已复验绿,本轮未复现)——判登录态/滑块环境因素;**连续 2 轮 0 偶发即销号**(当前 1/2)。
+- **B-152-4(P3,契约待确认,第 3 轮)**:`pages/games/1a2b.vue:154` 首猜命中按 92 计分,用例已按实现断言 92 但无 SRS 明文——**请给出唯一口径**(92 或 100)。
+
+## 三、门禁与通过率
+
+| 指标 | 本轮 | R153 | 变化 |
+|------|------|------|------|
+| 后端 | 347 类 / 2946 例 / 99.29%(17 红,采信 R153 实跑) | 同(39:42) | 零漂移第 12 次 |
+| 前端 | 617 = 602/3/12 | 617 = 602/3/12 | 持平 |
+| 管理端 | 116/116 | 116/116 | 持平 |
+| 根级 | 23 = 7/16 | 23 = 7/16 | 持平(第 48 轮) |
+| langgraph | 51 = 47 过 / 4 红 / 133.36s | 51 = 48 过 / 3 红 / 137.00s | **−1 过**(上游 401/429 抖动) |
+| 浏览器 | 28/28 + 2 skip | 28/28 + 2 skip | 持平(189 首轮即绿) |
+| **全量** | **3783 / 3725 = 98.47%**(剔 skip 98.94%) | 3783 / 3726 = 98.49% | **−0.02pp** |
+
+## 四、结论
+
+- **硬门禁未达成 4 项**:G2 后端 17 红、G7 langgraph 4 红(+挂起)、G9 锚点 23.0%、G11 CI 必红(B-152-1/2 第 3 轮未修)。
+- **复评门槛**:①后端 17 红清零或转预期 RED;②langgraph 连续 2 轮全绿(含挂起修复);③CI 清单修正后 blocking job 绿;④锚点率 ≥60%;⑤调度器不常驻。
+- 本轮唯一负向为 **langgraph 上游抖动 + pytest 挂起**,其余全零漂移——非代码回归。

+ 330 - 0
docs/tdd/orchestration/report-test-2026-11-11-R154.md

@@ -0,0 +1,330 @@
+# 测试负责人工作汇报(第 154 轮 · 2026-11-11 21:28–22:25 GMT+8)
+
+> 角色:cfc-tester(测试负责人)|执行档:**review(离线)**——内网浏览器自动化(`cfc.iwintrue.com/admin` + `/frontend`)、langgraph 实派 `192.168.16.251:4096`、后端采信 R153 强制实跑(零源码变更);**未联网装依赖、未启停服务、未改生产代码**(本轮零代码改动)。
+> 基线 HEAD:`d9866096a`(跑前 = 跑后,与 `origin/cfclub` 零漂移)。窗口 `39717eb07..d9866096a` 仅含 R153 报告补提交 + 1 个 `chore: auto bump`,**零功能源码/零测试资产变更**。
+> 节点分工(用户约束:每节点单任务):`189:4090` = **admin-desktop 5/5**(首轮即绿,无偶发)|`251:4096` = **langgraph pytest 51 例**(前两跑挂起,第三跑结果见 §5)|`204:4090` = 000(B-95 第 23 轮)|本机 = fe/shop/health/dx + 三套 Jest + 根级。
+> 结论:**不通过**(硬门禁 G2/G7/G9/G11 未达成)——后端 99.29%(17 红,**零漂移第 12 次**);langgraph **47/51**(4 红上游 401/429 + 收尾挂起 B-135-2);浏览器 **28/28 + 2 skip**(189 首轮即绿);全量 **3783 例 / 3725 过 = 98.47%**。
+
+---
+
+## 0. 基本信息(测试负责人模板)
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | `cfc-tester`(测试负责人 / 陆谨) |
+| 汇报周期 | 2026-11-11 第 154 轮(跑测窗口 21:28–22:25) |
+| 负责模块/单元 | cfc-backend(采信 R153 全量实跑)· cfc-frontend(Jest)· cfc-web(Jest)· cfc-langgraph(251 实派)· 浏览器 E2E(admin@189 / fe·shop·health·dx@本机)· 根级黑盒 |
+
+### 0.1 测试用例建设与执行
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **本轮新增测试用例数** | **0** 个 | 无 SRS/需求/接口变更(窗口零变更)→ 按纪律不新增;既有 3783 例全量执行 |
+| **本轮验证执行测试数** | **3783** 个 | 后端 2946 + 前端 617 + 管理端 116 + 根级 23 + langgraph 51 + 浏览器 30(含 dx 2 skip) |
+| **用例通过率** | **98.47%**(3725/3783) | 剔 skip 口径 **98.94%**(3725/3765);红 40 = 后端 17 + 前端 3 + 根级 16 + langgraph 4 |
+| **新增覆盖资产** | **0** 项 | 本轮无源码/资产改动(纯复验轮) |
+| **SRS/场景变更** | **0** | `docs/tdd/SRS.md`、`tests/user-scenarios`、`API_REFERENCE.md`、`docs/superpowers/specs` 窗口内零变更(`git diff --name-only 39717eb07..HEAD` 空)→ **G12 合规**(SRS 未变、用例不擅改) |
+
+### 0.2 会话与任务分发
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **分派任务数** | **2** 个 | ① 189:admin-desktop(首轮即 5/5,1.3m,`EXIT=0`);② 251:langgraph pytest(三跑,最后一跑结果见 §2/§5) |
+| **恢复智能体会话数** | 0 | 无中断重建 |
+| **当前在用会话数** | 3 | 本机(done)/ 189(done)/ 251(done) |
+
+| 会话标签 | 会话 ID | 状态 | 任务 | 耗时 | 工作目录 | 备注 |
+|----------|---------|------|------|------|----------|------|
+| 本机 | localhost | done | Jest×3 + 根级 + 浏览器 fe/shop/health/dx(后端采信 R153) | ~4m | `d:\cfc` | fe 6/6、shop 4/4、health 13/13、dx 2 skip |
+| 189:4090 | `sh_1cad77f53…` | done | admin-desktop E2E | 1.3m | `C:\code\cfc\tests` | **5/5(EXIT=0)首轮即绿**;HEAD `3c3d4b0a5`、spec blob `4703d73fb` 与本机一致 |
+| 251:4096 | shell 直连(前台 timeout) | done | langgraph pytest | 见 §2 | `/sc-data/cfc/cfc-langgraph` | 前两跑挂起;节点 HEAD `d9866096a` = 本机 |
+| 204:4090 | — | unknown(000) | 失联 | — | — | B-95 第 23 轮 |
+
+### 0.3 问题处置
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **新测试发现问题数** | **1** 个 | B-154-1:langgraph pytest **早期挂起**(前两跑:420s 断连 / 250s 仅 5 dots EXIT=124)——从 B-135-2「收尾挂起」恶化为中途 hang,需逐文件定位卡点 |
+| **已解决测试相关问题数** | **0** 个 | 无(本轮复验,无新自处置) |
+| **待解决测试相关问题数** | 10 类 | 后端 17 存量红 · 前端 3 预期 RED · 根级 16 环境红(B-36 第 48 轮)· langgraph 上游红 + 挂起(B-74/B-142-2 第 6 轮 + B-154-1)· CI 排除清单两类缺陷(B-152-1/2 未修)· 建表 SQL 无效(B-145-1 第 8 轮)· admin 鉴权门缺失(B-142-1 第 11 轮)· dx 2 端点 404(第 14 轮)· 204 失联 |
+
+### 0.4 本轮 git 提交与推送证据
+
+| 提交 sha | 阶段 | 触及文件 | 目标分支 | 已推送 | 备注 |
+|----------|------|----------|----------|--------|------|
+| `1cb8cd5a9`→`d9866096a` | R153 补提交 | `docs/tdd/**`(R153 报告/通知/台账,5 文件 +489) | `cfclub` | 是 | R153 交付物此前仅 staged 未提交 → 本轮补提交 + rebase 推送(0/0) |
+| 见 §10 | R154 | `docs/tdd/**` | `cfclub` | 依结果判定 | 若与 R153 零漂移则按纪律不重复推送;含新观察项则推 |
+
+---
+
+## 1. 历史审查记录(记忆召回)
+
+- **本对象非首次审查**。最近一轮全量闭环:R153(21:20,后端 99.29%/17 红、lg **48/51** 3 红 429/401、浏览器 28/28、全量 3783/3726=98.49%,交付物补提交 `d9866096a`)。
+- **历史遗留缺口**:① 后端 17 存量红(10 类);② langgraph 上游 429/401(B-74/B-142-2)+挂起(B-135-2);③ 根级 16 环境红(B-36,ECONNREFUSED 9082);④ 前端 3 预期 RED;⑤ G9 用例锚点 23.0%;⑥ CI 门禁薄弱(G11,B-152-1/2)。
+- **本次改善**:189 admin 首轮即 5/5(B-153-1 观察第 2 轮 0 偶发,接近销号)。
+- **本次恶化**:langgraph 47/51(**较 R153 −1 绿 +1 红**,intent 2 例回红 + auto_tag 1 例转绿,均上游 401/429 抖动);**pytest 挂起恶化**(前两跑早期 hang、第三跑收尾挂起 EXIT=124,B-135-2 复现并新登记 B-154-1);其余全部零漂移。
+- **声明**:历史结论仅作对照,本轮所有判定均以本轮实测取证为准。
+
+---
+
+## 2. 项目画像(阶段 0)
+
+- **业务定位**:CFC(浠艾福)家庭成长平台——家长/孩子双角色、五维能量(身/心/智/行/富)、健康报告解析、测评订单、饮食推荐、家庭关系、商城。
+- **技术栈**:`cfc-backend`(Spring Boot 2.7.18 + MyBatis-Plus + Java 8,9082)· `cfc-frontend`(uni-app 小程序 Vue2)· `cfc-web`(Vue2 + Element UI,8082)· `cfc-langgraph`(FastAPI + LangGraph + ChromaDB,251:9000)。
+- **关键路径**:登录鉴权(JWT)→ 家庭/成员 → 健康报告上传解析 → 测评/画像 → 饮食推荐 → 商城/订单 → 游戏积分。
+- **测试现状(本轮实测)**:后端 347 类全量可跑通(99.29%,采信 R153 零变更实跑);前端/管理端 Jest 稳定;langgraph 用例执行**受上游 LLM 凭据/配额与 pytest 挂起双重阻塞**;浏览器 E2E 双节点可跑;SRS 需求池零变更。
+- **质量目标**:① 所有用例全部覆盖并通过;② 覆盖全部 SRS 与用户场景(含异常流),SRS/场景变更时同步用例。
+
+---
+
+## 3. 测试覆盖矩阵(20 类三态)
+
+### 功能层次(5 类)
+
+| # | 类型 | 三态 | 证据 |
+|---|------|------|------|
+| 1 | 单元测试 | 已发现 | 后端 2946 例实跑(2925 过,采信 R153);cfc-web 116/116;cfc-frontend 617(602 过) |
+| 2 | 组件测试 | 已发现 | `cfc-frontend/__tests__/pages/*`(vue 挂载/契约断言,如 AC-R1/AC-R2);`cfc-web/src/__tests__/views/*` |
+| 3 | 测试覆盖率 | 待核实 | 后端 `pom.xml` **无 jacoco** → 后端行覆盖率无法本地量化;管理端 jest coverage 可用(历史 10.09/6.12/7.50/9.97) |
+| 4 | 变异测试 | 未发现 | 全仓无 pitest/mutation 配置;本轮**未实测**(白名单外工具) |
+| 5 | 集成测试 | 已发现 | 后端 `src/test/**/integration` 61 类(如 `EnergySystemFlowTest`、`GuideModuleIntegrationTest`);`tests/integration/*.spec.js` 2 套 |
+
+### 功能保障(4 类)
+
+| # | 类型 | 三态 | 证据 |
+|---|------|------|------|
+| 6 | 契约测试 | 已发现 | 后端 `*ContractTest` **107 类**(`DimensionRegistryMapContractTest`、`TeamProfitCronContractTest` 等);`tests/test-cases/*.md` 15 份(357 唯一 TC) |
+| 7 | 接口 API 测试 | 已发现 | `shop-api` 4/4、`health-api` 13/13、`dx-bridge` 2 skip(端点 404);线上匿名鉴权矩阵 5/5 = 401 |
+| 8 | 端到端 E2E | 已发现 | `admin-desktop` 5/5(189 实派,首轮即绿)、`frontend-mobile` 6/6(本机) |
+| 9 | 验收 UAT | 待核实 | 无独立 UAT 记录/签署产物;验收语义由 `tests/test-cases/*.md` 与 SC 场景池承载,**未见用户验收签字证据** |
+
+### 非功能(6 类)
+
+| # | 类型 | 三态 | 证据 |
+|---|------|------|------|
+| 10 | BDD 规格 | 未发现 | 全仓无 `*.feature`(cucumber/specflow 均无) |
+| 11 | 冒烟测试 | 已发现 | 根级 `tests/` Jest 黑盒 23 例(7 过/16 红,B-36 第 48 轮);health 契约 13 例;后端 `*GateTest` 类 |
+| 12 | 回归测试 | 已发现 | 本轮及历轮全量回归(后端 347 类 + 4 套前端/端侧);零漂移比对机制已成文(后端零漂移第 12 次) |
+| 13 | 探索性测试 | 待核实 | 无 chartered 探索性会话记录;本轮巡检(线上端点/节点探活)属探索性质但未成文档化章程 |
+| 14 | 性能测试 | 未发现 | 无 jmx/k6/locust 脚本;本轮仅有「耗时观测」(langgraph 挂起耗时 420s/250s/380s 上限) |
+| 15 | 可靠性测试 | 未发现 | 无故障注入/混沌演练脚本;`/health` 存活探针 200 仅为可用性抽查 |
+| 16 | 安全测试 | 待核实 | 有手工鉴权矩阵(5 端点 401,G8 ✅)与 admin 越权探测(B-142-1),但**无 SAST/DAST/依赖漏洞扫描**工具链(需联网,未授权) |
+| 17 | 兼容性测试 | 未发现 | Playwright 仅 chromium 单引擎、单一视口;无 webkit/firefox/多设备矩阵 |
+| 18 | 可用性测试 | 未发现 | 无真实用户可用性测试记录 |
+| 19 | 无障碍测试 | 未发现 | 无 axe-core 等 a11y 断言(`grep axe` 零命中) |
+| 20 | 流程/度量 | 已发现 | `blockers.md`(B-xxx 台账)· `automation-status.md` · 各轮 report/notice · `TRACEABILITY-MATRIX.md` |
+
+---
+
+## 4. 测试方案(本轮执行范围)
+
+| 项 | 内容 |
+|----|------|
+| 目标 | 全量用例覆盖执行 + SRS/场景覆盖核对 + 双节点派发验证 |
+| 范围 | 后端(采信 R153 全量实跑,零变更)· cfc-frontend Jest · cfc-web Jest · 根级黑盒 · langgraph pytest(251)· 浏览器 E2E(admin@189 + fe/shop/health/dx@本机) |
+| 执行档 | review(离线);联网装依赖、压测、SAST 均**未授权未执行** |
+| 排除项 | 变异测试、性能压测、a11y、兼容多引擎、依赖漏洞扫描(无工具/需联网/需装浏览器)→ 均落「覆盖缺口清单」,不记通过 |
+
+---
+
+## 5. 执行结果(实测数据)
+
+| 套件 | 结果 | 说明 |
+|------|------|------|
+| 后端全量 | **347 类 / 2946 例 / 2925 过 / 16F+1E+4S = 99.29%** | **采信 R153 强制实跑**(39:42,`39717eb07..d9866096a` 测试资产零变更)→ **零回归第 12 次**;347/347 XML |
+| 后端红例 | 10 类 / 17 例 | EnergySystem 6 · DimensionRegistryMap 3 · Orchestration 2 · WechatLogin 2 · MembershipPay 1 · PaymentORD 1 · TeamProfitCron 1 · GuideModule 1E(与 R153 逐类一致) |
+| cfc-frontend | **617 = 602 过 / 3 红 / 12 skip**(57.1s) | 3 红 = AC-R1、AC-R2、RED-A7(**预期 RED**,S-cfc 未实现);零漂移 |
+| cfc-web | **116/116**(39.1s,17 套件) | 零漂移 |
+| 根级黑盒 | **23 = 7 过 / 16 红**(5.6s,2 套件) | 16 红全为 `fetch failed` → 9082 未启动(B-36 第 48 轮零漂移) |
+| langgraph@251 | **51 = 47 过 / 4 红**(133.36s) | 三跑:①420s 断连(早期挂起)②250s 仅 5 dots EXIT=124 ③**51 全量完成 47 过 4 红**但 EXIT=124(**收尾挂起**,B-135-2 复现);4 红 = `test_auto_tag`(short_content/empty_content)+ `test_intent`(classify_analysis/classify_recommend),日志 401 key `****ab12` + 429 AgnesAI → C 环境红(**较 R153 波动 −1 绿 +1 红**:auto_tag content_relevance 转绿、intent 2 例回红) |
+| 浏览器 | **30 = 28 过 / 2 skip** | 189 admin **5/5 首轮即绿**(1.3m)· 本机 fe **6/6**(54.8s)· shop **4/4**(9.1s)· health **13/13**(5.2s)· dx **2 skip**(404) |
+| **合计** | **3783 例 / 3725 过 = 98.47%** | 剔 skip 98.94%;红 40 / 跳 18 |
+
+**线上与节点**:
+
+| 项 | 实测 |
+|----|------|
+| `/admin` `/frontend` | 302(登录墙,符合预期)|站点根 `/` = **404**(B-141-3) |
+| 匿名鉴权矩阵(POST) | mind/fortune · energy/overview · health/plan/list · huawei-health/status · xiaomi-health/status → **5/5 = 401**(**B-69 销号维持第 15 轮**) |
+| admin 越权探测 | `POST /api/admin/families/overview` 匿名 → **200 + code:400**(B-142-1 第 11 轮,未修) |
+| dx 端点 | `/api/dx/health/bridge`、`/api/dx/report/parse` → **404/404**(B-DX-1 第 14 轮) |
+| 251 服务 | `/health` 200 → LLM 链路存活(pytest 内 401+429 为上游凭据/配额;挂起见 B-154-1) |
+| 节点 | 251:4096 = 200、251:9000 = 200、189:4090 = 200、**204:4090 = 000**(B-95 第 23 轮) |
+
+---
+
+## 6. 覆盖缺口清单
+
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|------|------|------|--------------|--------|----------|
+| G-154-1 后端行覆盖率不可量化 | `pom.xml` 无 jacoco | 覆盖率无法进硬门禁,仅靠例数 | 加 `jacoco-maven-plugin`(离线仓库需确认有包) | P1 | 覆盖率报告 ≥ 约定阈值并经 gate 判定 |
+| G-154-2 用例↔代码锚点仅 23.0% | 357 唯一 TC / 82 有代码锚点 | 台账用例无法证明被执行 | 对 0 锚点域(butler/human-butler/deep-dive-*/vendor)优先补锚 | P0 | 锚点率 ≥ 60% |
+| G-154-3 无变异测试 | 无 pitest | 断言强度未知(例数≠有效性) | 对 `service/*` 高频模块试点 pitest | P2 | 变异杀死率 ≥ 60% |
+| G-154-4 无性能/可靠性基线 | 无 jmx/k6、无混沌 | 大促/高并发无容量证据 | k6 脚本覆盖登录/首页/报告上传;故障注入(DB/LLM 断连) | P2 | P95 与错误率达标 + 演练报告 |
+| G-154-5 单引擎单视口 | chromium only | 跨端兼容风险 | 加 webkit/mobile-safari project | P2 | ≥3 引擎矩阵通过 |
+| G-154-6 无 a11y 断言 | 无 axe | 无障碍合规缺失 | `@axe-core/playwright` 对首页/登录/健康页 | P2 | 无 critical 违规 |
+| G-154-7 无 SAST/依赖漏洞扫描 | 仅手工鉴权矩阵 | 供应链与注入风险 | 引入 semgrep/trivy(需联网,未授权) | P1 | 高危 0 |
+| G-154-8 测试上下文调度器常驻 | B-152-3(未修) | 耗时劣化 + 时序不确定 | 测试 profile 关闭 `@EnableScheduling` | P1 | 全量耗时回落 ≤45min 且无 scheduler 日志 |
+| G-154-9 UAT 无签署证据 | 无用例签字 | 验收口径不可追溯 | 场景池 → UAT 清单化并留签署 | P3 | UAT 记录归档 |
+| G-154-10 langgraph 挂起无容错 | B-135-2/B-154-1(未修) | langgraph 门禁不可判定 | 逐文件分跑定位卡点;pytest 加 timeout/retry 规程 | P1 | 51 例稳定 <300s 完成 |
+
+---
+
+## 7. 用例锚点分布(G9 证据)
+
+| 用例文件 | 文件内唯一 TC | 其中被代码锚定 |
+|----------|---------------|----------------|
+| parent.md | 111 | 6 |
+| teacher.md | 43 | 1 |
+| admin.md | 38 | 2 |
+| child.md | 33 | 1 |
+| cross-role-e2e.md | 30 | 1 |
+| README.md | 22 | 2 |
+| guest.md | 17 | **12** |
+| vendor.md | 17 | **0** |
+| health-datasource-bridge.md | 17 | 1 |
+| butler.md | 13 | **0** |
+| signature.md | 11 | **9** |
+| article-tag-filter.md | 10 | **10** |
+| deep-dive-assessment-appointment.md | 10 | **0** |
+| human-butler.md | 8 | **0** |
+| deep-dive-plan-activation.md | 6 | **0** |
+| **合计(全局去重)** | **357** | **82 = 23.0%** |
+
+> 口径:锚点 = 该 TC-ID 字面出现在 `cfc-backend/src/test`、`tests/e2e-live`、`cfc-frontend/__tests__`、`cfc-web/src/__tests__`、`tests/unit|integration` 任一文件中;`tests/e2e/api/generated` 已排除(自动生成,虚高)。B-124「两套口径并存」仍未收敛,本轮采用严格口径(零变更 → 与 R153 一致)。
+
+---
+
+## 8. 五要素问题清单
+
+### #1 B-154-1(P1|测试装置)langgraph pytest 挂起恶化:早期 hang + 收尾挂起
+1. **问题描述**:本轮 251 实派三跑——① 前台直跑 420s 被断(无输出);② `timeout 250` 仅 5 dots 即 EXIT=124(**早期 hang**);③ `timeout 380` 全量 51 例 133.36s 完成(47 过 4 红)但 **EXIT=124(收尾挂起)**。与 B-135-2「收尾挂起」同源并发,挂起点不定(早期/收尾均现)。
+2. **测试 bug 点**:`/tmp/r154_pytest.log`(250s 跑仅 5 行 `.....`)、`/tmp/r154b_pytest.log`(133s summary 后挂起);卡点文件待逐文件分跑定位。
+3. **最优修改方案**:① `pytest.main` 入口加 `pytest-timeout` 每用例超时;② 对 251 派发统一「`timeout N` 自限 + 落盘 + `grep summary` 判读」规程(本轮已用,建议固化脚本);③ 逐文件分跑定位早期 hang 对应的测试文件/协程(疑似 `JavaClient._get_client` coroutine 未 await 的 teardown 泄漏,见运行警告)。
+4. **修改目的**:使 langgraph 51 例执行**可判定**(得到明确通过/失败与 exit code),消除「挂起无结果」导致的门禁盲区。
+5. **闭环**:连续 2 轮 51 例 <300s 完成且 EXIT 非 124;否则将卡点文件派研发。
+
+### #2 B-74 / B-142-2(P0|上游)langgraph 4 红,全部 429 + 401(第 6 轮,波动)
+1. **问题描述**:251 实派 **51 例 / 47 过 / 4 红**;红例 = `test_auto_tag_{short_content,empty_content}` + `test_intent_{classify_analysis,classify_recommend}`;日志 `401 api key ****ab12 invalid` + `429 AgnesAI free users rate limit`;同窗口 `/health` 200/8ms → **服务活、仅上游凭据/配额**。**较 R153 波动**:auto_tag content_relevance 转绿(+1)、intent 2 例回红(−2)、净 −1。
+2. **测试 bug 点**:`tests/test_auto_tag.py`、`tests/test_intent.py`(断言依赖 LLM 返回分类);`app/agents/intent_classifier.py:62`(异常 → 默认 `chat` 兜底,把 429 伪装成分类错误)。
+3. **最优修改方案**:① 运维轮换/扩容 `****ab12` key 与 AgnesAI 额度;② 服务侧对上游 429/401 统一返回 **503 + 结构化 code**,不映射 500;③ 用例按 `pytest.mark.env`(或 retry/backoff)把环境红与逻辑红分流。
+4. **修改目的**:恢复 langgraph 硬门禁(G7)可信度,避免上游抖动被读成产品回归。
+5. **闭环**:连续 2 轮 langgraph 全绿(并保留 exit code 证据)。
+
+### #3 B-153-1(P3|观察项,第 2 轮 0 偶发)189 admin U05 登录前置偶发——未复现
+1. **问题描述**:R153 首轮 4/5(U05 `account-roles` 非 200)→ 复验 5/5;**本轮首轮即 5/5 全绿**(1.3m,`rolesStatus2` 200),该偶发未再出现。
+2. **测试 bug 点**:`tests/e2e-live/admin-live.spec.js:188`(R153 偶发证据;本轮无)。
+3. **最优修改方案**:维持观察项(登录前置加重试代码可做可不做),**连续 2 轮 0 偶发销号**(当前 1/2)。
+4. **修改目的**:确认偶发为登录态/滑块环境因素而非产品回归。
+5. **闭环**:R155 若仍首轮 5/5 → 销号;若再偶发 → 落重试修代码。
+
+### #4 B-152-2(P0|CI 硬门禁必然失败)CI 排除清单漏掉 3 个当前红类(第 3 轮未修)
+1. **问题描述**:`.gitlab-ci.yml:61` 的 `BACKEND_OBSERVED_CLASSES`(33 类)未包含 `UserServiceWechatLoginTest`、`UserServiceWechatLoginContractTest`、`TeamProfitCronContractTest` → `backend-blocking-junit` 必红。
+2. **测试 bug 点**:R153 surefire 中三类 `Failures: 1`;对照 `.gitlab-ci.yml:61` 清单无此三项。
+3. **最优修改方案**:把 3 类加入 `BACKEND_OBSERVED_CLASSES`;同时按 #5 收敛清单。
+4. **修改目的**:恢复「硬门禁红即拦、绿即放」的语义。
+5. **闭环**:CI `backend-blocking-junit` 一次运行 `success`。
+
+### #5 B-152-1(P1|CI 门禁覆盖面被缩小)排除清单 33 类中 26 类已转绿(第 3 轮未修)
+1. **问题描述**:清单自「第 69 轮 33 红类」冻结,其中 26 类已全绿仍被排除在 blocking 之外 → 回归不拦。
+2. **测试 bug 点**:`.gitlab-ci.yml:61`。
+3. **最优修改方案**:清单收敛为当前 10 个红类;每轮由测试负责人产出「红类集合」供 CI 变量更新。
+4. **修改目的**:让硬门禁覆盖「全量 − 10 类」≈ 97%,回归拦截率最大化。
+5. **闭环**:blocking job 覆盖类数 ≥ 337,且连续 2 轮无新增红。
+
+### #6 B-152-3(P1|测试装置)`@EnableScheduling` 在测试上下文常驻(第 3 轮未修)
+1. **问题描述**:`CfcApplication` 带 `@EnableScheduling` 常驻,R153 实测调度日志 4,334/31,758 行(13.6%)与全量耗时 39:42 强相关(R152 55:56/28.6%)。
+2. **测试 bug 点**:`cfc-backend/.../CfcApplication.java:12`;`src/test/resources/` 目录不存在。
+3. **最优修改方案**:测试 profile 关闭调度(`application-test.yml` + `@ConditionalOnProperty`),慢类缩小切片。
+4. **修改目的**:消除非确定性后台写入,全量耗时稳定 ≤45min。
+5. **闭环**:scheduler 日志 0 行、耗时 ≤45min、17 红集合不变。
+
+### #7 B-142-1(P1|安全)`/api/admin/**` 鉴权门缺失(第 11 轮)
+1. **问题描述**:匿名 `POST /api/admin/families/overview` → **HTTP 200** + `{"code":400}`;对照组 5 端点全 401 → 拦截器对 admin 前缀无统一门。
+2. **测试 bug 点**:`JwtInterceptor`(`/api/admin/` 未纳入鉴权判定);线上实证如 §5。
+3. **最优修改方案**:把 `/api/admin/**` 纳入 `JwtInterceptor` 强制校验并校验 `role`。
+4. **修改目的**:消除匿名可达的管理端数据面(越权信息泄露)。
+5. **闭环**:匿名 POST 该端点返回 401/403;回归用例固化到 health 契约套件。
+
+### #8 B-145-1(P1|Schema)`nutrition_age_dosage` 建表恒失败(第 8 轮)
+1. **问题描述**:`schema.sql:5343` 建表体含 `INDEX idx_product (product_id)`,但列定义无 `product_id` → DDL 恒失败。
+2. **测试 bug 点**:`cfc-backend/src/main/resources/schema.sql:5343`。
+3. **最优修改方案**:删索引行或补列 + 迁移。
+4. **修改目的**:让按年龄分组的剂量建议在运行期可用。
+5. **闭环**:启动日志无 `SQLSyntaxErrorException`;表存在。
+
+### #9 B-36(P3|环境)根级黑盒 16 红(第 48 轮零漂移)
+1. **问题描述**:`tests/integration/*.spec.js` 16 例全 `fetch failed`(ECONNREFUSED 至 `127.0.0.1:9082`)——本地未启动后端。
+2. **测试 bug 点**:`tests/integration/mini-games-api.spec.js`、`tests/integration/plan-chain.spec.js`。
+3. **最优修改方案**:改用 `process.env.E2E_BASE_URL || http://cfc.iwintrue.com` 走线上,或加 `beforeAll` 探活 → `test.skip`。
+4. **修改目的**:让根级套件的红数具备信号价值。
+5. **闭环**:根级套件红数 = 0(或按环境 skip 且不产红)。
+
+---
+
+## 9. 门禁结论
+
+| 门禁 | 指标 | 结果 |
+|------|------|------|
+| G1 用例通过率 | 98.47%(剔 skip 98.94%) | ✅ |
+| G2 后端全绿 | 17 红(10 类,零漂移第 12 次) | ❌ |
+| G3 前端全绿 | 3 红(预期 RED) | ⚠️ |
+| G4 管理端全绿 | 116/116 | ✅ |
+| G5 编译/产物完整性 | 采信 R153(353 源 0 错、347/347 XML) | ✅ |
+| G6 浏览器 E2E | 28/28(+2 skip) | ✅ |
+| G7 langgraph 全绿 | 47/51(4 红 429/401 + 挂起) | ❌ |
+| G8 鉴权矩阵 | 5/5 = 401 | ✅ |
+| G9 用例锚点率 | 23.0%(82/357) | ❌ |
+| G10 双节点派发 | 189 ✅ + 251 ✅ | ✅ |
+| G11 CI 门禁有效 | blocking 清单漏 3 红类 → 必红;26 绿类被排除(B-152-1/2 第 3 轮未修) | ❌ |
+| G12 SRS 合规 | 窗口零变更、未擅改需求 | ✅ |
+
+**结论:不通过。** 硬门禁未达成 4 项(G2 / G7 / G9 / G11)。
+较 R153 同为「不通过」且**指标微降**(98.49% → 98.47%):langgraph 上游抖动(48→47 过)+ pytest 挂起恶化(B-154-1)为唯一负向,其余全零漂移;G11 依赖研发侧 CI 清单修复(B-152-1/2 第 3 轮未闭合)。
+
+**复评条件(全部满足可转「通过」)**:① 后端 17 存量红清零或经契约裁决转预期 RED 并登记;② langgraph 连续 2 轮全绿(含挂起修复);③ CI 清单按 #4/#5 修正后 blocking job 绿;④ 用例锚点率 ≥60%;⑤ B-152-3 落地(调度器不常驻、全量 ≤45min)。
+
+---
+
+## 10. 变更、提交与通知
+
+| 项 | 内容 |
+|----|------|
+| 变更判定 | **有变化**:langgraph 48→**47 过**(红 3→4,上游 401/429 抖动);全量 98.49%→**98.47%**(−0.02pp);新增 B-154-1(pytest 挂起恶化);B-153-1 第 2 轮 0 偶发 → **提交 + 推送 + 通知研发** |
+| 补提交 | R153 交付物(此前仅 staged)→ `1cb8cd5a9` → rebase 推送 `d9866096a`(0/0 同步) |
+| 提交范围 | 本报告、`automation-run-2026-11-11-R154.md`、`notice-2026-11-11-R154-研发通知.md`、`blockers.md`(追加 R154 段)、`automation-status.md`(附录 R154) |
+| 推送分支 | `origin/cfclub`(rebase 后推) |
+| 研发通知 | Agent Mail `GetMe` → 仍 `not_bound`(连接器 connected、邮箱未开通,按纪律不重试)→ 以 `notice-2026-11-11-R154-研发通知.md` + `blockers.md` + 推送为通知载体 |
+
+---
+
+## 附录 A:本轮命令(可复现)
+
+```bash
+# 环境探针
+/d/jdk1.8.0_25/bin/java -version; JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -v; df -h /d
+# 后端(本轮采信 R153 强制实跑,零变更)
+cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test   # R153: 39:42
+# Jest
+cd cfc-frontend && npx jest --ci --silent     # 617 = 602/3/12(57.1s)
+cd cfc-web && npx jest --ci --silent          # 116/116(39.1s)
+cd tests && npx jest --ci --silent            # 23 = 7/16(5.6s,2 套件)
+# 浏览器(必须在 tests/ 内跑)
+cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --workers=1  # 6/6
+cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --workers=1          # 4/4
+cd tests && npx playwright test -c playwright.config.health.js --workers=1                           # 13/13
+cd tests && npx playwright test -c playwright.config.live.js --project=dx-bridge --workers=1         # 2 skip
+node _r150_189.cjs                                        # 189 admin-desktop(首轮即 5/5,1.3m)
+node _r154_251_probe.cjs run '<pytest 命令>; echo EXIT=$?'  # 251 langgraph(timeout 自限 + 落盘)
+# 线上鉴权矩阵(必须 POST)
+for p in /api/mind/fortune /api/energy/overview /api/health/plan/list /api/huawei-health/status /api/xiaomi-health/status; do curl -s -o /dev/null -w "$p %{http_code}\n" -X POST -H 'Content-Type: application/json' -d '{}' http://cfc.iwintrue.com$p; done
+```
+
+## 附录 B:口径声明
+
+- 后端红数口径:采信 R153 强制实跑(`39717eb07..d9866096a` 测试资产零变更,`git diff --name-only` 空)→ 347 类 / 2946 例 / 2925 过 / 16F+1E+4S = 99.29%,**零漂移第 12 次**。
+- 后端基线纯度:`ArticleTagsContractTest.java` 仍为未跟踪文件(历轮同口径),HEAD 纯度为 **346 类 / 2935 例**。
+- langgraph 口径:`--ignore=tests/qna --ignore=tests/test_chat.py`(B-141-1 排除项),51 例;**必须 `.venv/bin/python`**;节点 HEAD `d9866096a` = 本机(已同步)。本轮三跑:420s 断连 / 250s 5 dots EXIT=124 / 380s 全量完成但收尾挂起 EXIT=124 → 采用第三跑结果 **47 过 / 4 红 / 133.36s**,挂起如实标注(B-154-1/B-135-2)。
+- 浏览器口径:28 过 + dx 2 skip = 30;189 与本机 spec blob `4703d73fb` 一致 → 跨节点结论可比。
+- 189 口径:本轮首轮即 5/5(无偶发),B-153-1 观察第 2 轮。
+- G9 仍为严格口径(排除 `tests/e2e/api/generated`),B-124 两套口径并存未收敛。

+ 62 - 0
docs/tdd/test/automation-run-2026-11-11-R154.md

@@ -0,0 +1,62 @@
+# 自动化执行记录 · 第 154 轮(2026-11-11 21:28–22:20 GMT+8)
+
+> 执行档 review(离线):未联网装依赖、未启停服务、未改生产代码;本轮零代码改动(纯复验轮)。
+> 基线 `d9866096a`(= `origin/cfclub`,跑前跑后一致);窗口 `39717eb07..d9866096a` 仅为 R153 报告补提交 + 1 个 auto bump,零功能源码。
+
+## 1. 时间线
+
+| 时刻 | 动作 | 结果 |
+|------|------|------|
+| 21:28 | 记忆召回(automation memory 读至 R153 段)+ R153 补提交推送 | R153 交付物已 staged 未提交 → 补提交 `1cb8cd5a9` → rebase 后推送 `d9866096a`(0/0 同步) |
+| 21:30 | 环境/节点探活 | JDK 1.8.0_25 ✓、Maven 3.6.1 ✓、D: 93G(69%);`/admin` 302、`/frontend` 302、`/` 404;251:4096=200 / 251:9000=200(health) / 189:4090=200 / **204:4090=000** |
+| 21:41 | 251 langgraph kick(setsid nohup 落盘) | **kick 未生效**(/tmp/r154_pytest.log 不存),改前台 shell 直跑 |
+| 21:44 | 189 admin E2E 派发(后台) | **5/5 全绿**(1.3m,EXIT=0),U05 首轮即绿(B-153-1 观察第 2 轮 0 偶发) |
+| 21:45 | 本机浏览器 fe / shop / health / dx | 6/6、4/4、13/13、2 skip |
+| 21:47 | Jest ×3(前端/管理端/根级) | 617=602/3/12;116/116;23=7/16(5.6s) |
+| 21:50 | SRS 闸门扫描 | 窗口 `39717eb07..HEAD` 测试资产/SRS/specs 零变更(G12 合规) |
+| 21:52 | langgraph 前台直跑(无 timeout) | **420s 超时被断**(B-135-2 挂起复现) |
+| 21:59 | langgraph 复跑(timeout 250s 落盘) | **EXIT=124**,仅 5 dots 后挂起(早期 hang,非收尾) |
+| 22:06 | langgraph 三跑(timeout 380s 落盘) | **51 例 / 47 过 / 4 红 / 133.36s**(EXIT=124 = 收尾挂起);红 = auto_tag 2(short_content/empty_content)+ intent 2(classify_analysis/classify_recommend) |
+| 22:15 | 匿名鉴权矩阵 + admin 越权 | 5/5 = 401;admin/overview = 200 + code:400 |
+| 22:20 | 报告 + 通知 + 台账 | 见 §4 |
+
+## 2. 分派结果
+
+| 节点 | 通道 | 命令要点 | 结果 |
+|------|------|----------|------|
+| 189:4090 | opencode `POST /api/shell`(PowerShell 5.1,`;` 分隔) | `cd C:\code\cfc; git rev-parse --short HEAD; git hash-object tests\e2e-live\admin-live.spec.js; cd tests; npx playwright test -c playwright.config.live.js --project=admin-desktop --workers=1` | **5/5,EXIT=0**(1.3m);HEAD `3c3d4b0a5`、blob `4703d73fb` 与本机一致;U05 首轮即绿 |
+| 251:4096 | opencode shell 直连(前台,timeout 落盘) | `cd /sc-data/cfc/cfc-langgraph && timeout 380 .venv/bin/python -m pytest -q --ignore=tests/qna --ignore=tests/test_chat.py -p no:cacheprovider > /tmp/r154b_pytest.log 2>&1` | **51 例 / 47 过 / 4 红 / 133.36s**;EXIT=124(收尾挂起,B-135-2 复现);节点 HEAD `d9866096a` = 本机(已同步) |
+
+## 3. 关键实测数字(同 R153 口径)
+
+- 后端:**采信 R153 强制实跑**(`39717eb07..d9866096a` 零测试资产变更):347 类 / 2946 例 / 2925 过 / 16F+1E+4S = 99.29%(39:42)→ **零漂移第 12 次**。
+- 全量:3783 例 / 3725 过 = **98.47%**(剔 skip 98.94%,红 40 / 跳 18)。
+
+## 4. 产出文件
+
+| 文件 | 类型 |
+|------|------|
+| `docs/tdd/orchestration/report-test-2026-11-11-R154.md` | 主报告(模板 / 20 类矩阵 / 缺口 / 五要素 / 门禁) |
+| `docs/tdd/test/automation-run-2026-11-11-R154.md` | 本文件 |
+| `docs/tdd/notice-2026-11-11-R154-研发通知.md` | 研发交接通知 |
+| `docs/tdd/test/blockers.md` | 追加 R154 段(更新存量) |
+| `docs/tdd/test/automation-status.md` | 附录 R154 |
+
+## 5. 本轮教训(新增)
+
+1. **251 kick 模式不可靠升级为事实**:`setsid nohup ... &` 经 opencode `/api/shell` 派发后子进程未存活(R153 kick 同样未落盘,R153 结果实为前台直跑所得)。**修法:一律前台 shell 直跑 + 服务端 `timeout N` 自限 + 落盘文件**,不再用 nohup 分离。
+2. **pytest 挂起形态变化**:本轮前两跑分别 420s 断连、250s 仅 5 dots(EXIT=124)→ 从「收尾挂起」(B-135-2)变为**早期 hang**,需按「恢复后逐文件分跑定位卡点文件」处置(登记 B-154-1)。
+3. **B-153-1 首轮零复现**:189 admin 本次首轮即 5/5,U05 未再偶发 → 观察计数 1/2,还差一轮可销号。
+4. **Maven 工程根**:`d:/cfc` 无 `pom.xml`,必须在 `cd cfc-backend` 后跑 `mvn`(历轮口径,本轮采信未复跑)。
+
+## 6. 与 R153 对比
+
+| 指标 | R154 | R153 | 变化 |
+|------|------|------|------|
+| 后端 | 采信 R153 全量实跑(2946/2925/17 红) | 2946/2925/17 红,39:42 | 零漂移第 12 次 |
+| langgraph | 51 / 47 过 / 4 红 / 133.36s | 48/51(3 红 429/401) | **−1 绿 +1 红**(intent 2 例回红 / auto_tag content_relevance 转绿,均上游 401/429) |
+| 前端 | 617 = 602/3/12(57.1s) | 617 = 602/3/12(36.6s) | 零漂移 |
+| 管理端 | 116/116(39.1s) | 116/116(61.8s) | 零漂移 |
+| 根级 | 23 = 7/16(5.6s) | 23 = 7/16(11.5s) | 零漂移第 48 轮 |
+| 浏览器 | 28/28 + 2 skip | 28/28 + 2 skip | 零漂移(189 首轮即绿) |
+| **合计** | **3783 例 / 3725 过 = 98.47%**(剔 skip 98.94%) | 3783/3726 = 98.49% | **−0.02pp(langgraph 上游抖动)** |

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

@@ -1353,3 +1353,23 @@
 | 节点 | 189:4090 ✅ / 251:4096 ✅ / 251:9000 ✅ / 204:4090 ✗ | **G10 双节点通过**(B-95 第 22 轮) |
 | 节点 | 189:4090 ✅ / 251:4096 ✅ / 251:9000 ✅ / 204:4090 ✗ | **G10 双节点通过**(B-95 第 22 轮) |
 | CI | `.gitlab-ci.yml:61` 排除清单漏 3 红类、26 绿类未解禁(B-152-1/2 第 2 轮未修) | **G11 ❌** |
 | CI | `.gitlab-ci.yml:61` 排除清单漏 3 红类、26 绿类未解禁(B-152-1/2 第 2 轮未修) | **G11 ❌** |
 | 门禁 | ❌ **不通过** | G1/G4/G5/G6/G8/G10/G12 ✅;G2/G7/G9/G11 ❌;G3 ⚠️ |
 | 门禁 | ❌ **不通过** | G1/G4/G5/G6/G8/G10/G12 ✅;G2/G7/G9/G11 ❌;G3 ⚠️ |
+
+## 附录 R154(2026-11-11 22:25)
+
+| 套件 | 实测 | 备注 |
+|------|------|------|
+| 后端全量 | **347 类 / 2946 例 / 2925 过 / 16F+1E+4S = 99.29%**(采信 R153 实跑 39:42) | 窗口零测试资产变更 → **零漂移第 12 次**(R153 强制实跑) |
+| 后端红类 | 10 类 / 17 例 | EnergySystem 6 / DimensionRegistryMap 3 / Orchestration 2 / WechatLogin 2 / MembershipPay 1 / PaymentORD 1 / TeamProfitCron 1 / GuideModule 1E |
+| 基线纯度 | 347 类 = HEAD 346 类 + 未跟踪 `ArticleTagsContractTest.java` | 历轮同口径 |
+| 前端 Jest | **617:602 过 / 3 红 / 12 跳**(57.1s) | 3 红仍为预期 RED(AC-R1/AC-R2/RED-A7);零漂移 |
+| 管理端 | 116/116(17 套件,39.1s) | 零漂移 |
+| 根级黑盒 | 23:7 过 / 16 红(5.6s,2 套件) | B-36 第 48 轮 |
+| langgraph@251 | **51 例 / 47 过 / 4 红 / 133.36s** | 4 红 = auto_tag 2(short_content/empty_content)+ intent 2(classify_analysis/classify_recommend);日志 401 key `****ab12` + 429 AgnesAI → C 环境红;**EXIT=124 收尾挂起(B-154-1 新增)**;较 R153 波动 −1 绿;节点 HEAD = 本机 |
+| 浏览器 | **28/28 + 2 skip** | 189 admin **5/5 首轮即绿**(1.3m,B-153-1 观察第 2 轮 0 偶发)+ 本机 fe 6 / shop 4 / health 13;dx 2 skip(404) |
+| 全量 | **3783 例 / 3725 过 = 98.47%**(剔 skip 98.94%) | 红 40 / 跳 18;−0.02pp |
+| 新增用例数 | **0** | SRS 窗口零变更(G12 合规) |
+| TC 锚点 | 357 唯一 TC → **82 = 23.0%**(严格口径) | 分布见报告 §7;未改善 |
+| 线上鉴权 | 5/5 匿名 POST → 401 | B-69 销号维持第 15 轮;`/api/admin/families/overview` 匿名 200 + code:400(B-142-1 第 11 轮) |
+| 节点 | 189:4090 ✅ / 251:4096 ✅ / 251:9000 ✅ / 204:4090 ✗ | **G10 双节点通过**(B-95 第 23 轮) |
+| CI | `.gitlab-ci.yml:61` 排除清单漏 3 红类、26 绿类未解禁(B-152-1/2 第 3 轮未修) | **G11 ❌** |
+| 门禁 | ❌ **不通过** | G1/G4/G5/G6/G8/G10/G12 ✅;G2/G7/G9/G11 ❌;G3 ⚠️ |

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

@@ -833,3 +833,34 @@
 > **全量 3783 / 3726 过 = 98.49%**(剔 skip 98.96%;红 39 / 跳 18)。
 > **全量 3783 / 3726 过 = 98.49%**(剔 skip 98.96%;红 39 / 跳 18)。
 > **结论**:**不通过** —— G1 ✅ 98.49%、G4 ✅、G5 ✅、G6 ✅ 28/28、G8 ✅ 5/5、**G10 ✅ 双节点**、G12 ✅;❌ G2 17 红、G7 3 红(429/401)、G9 23.0%、**G11 CI 必红(B-152-2 第 2 轮未修)**;⚠️ G3 3 预期 RED。
 > **结论**:**不通过** —— G1 ✅ 98.49%、G4 ✅、G5 ✅、G6 ✅ 28/28、G8 ✅ 5/5、**G10 ✅ 双节点**、G12 ✅;❌ G2 17 红、G7 3 红(429/401)、G9 23.0%、**G11 CI 必红(B-152-2 第 2 轮未修)**;⚠️ G3 3 预期 RED。
 > **变化点**:langgraph 46→48 过(红 5→3);全量 98.44%→**98.49%**(+0.05pp);新增观察项 B-153-1(189 U05 偶发复验绿)→ 已推送 + 通知研发。
 > **变化点**:langgraph 46→48 过(红 5→3);全量 98.44%→**98.49%**(+0.05pp);新增观察项 B-153-1(189 U05 偶发复验绿)→ 已推送 + 通知研发。
+
+---
+
+## R154 段(2026-11-11 22:25,新增/更新)
+
+| 编号 | 关联键/对象 | 类型 | 描述 | 经办 | 登记时间 | 状态 |
+|---|---|---|---|---|---|---|
+| **B-154-1-New(P1)** | langgraph pytest 挂起恶化(早期 hang + 收尾挂起) | 研发(测试装置) | **新增**。本轮三跑:① 前台直跑 420s 断连;② `timeout 250` 仅 5 dots EXIT=124(**早期 hang**);③ `timeout 380` 全量 51 例 133.36s 完成(47 过 4 红)但 **EXIT=124 收尾挂起**。警告含 `coroutine 'JavaClient._get_client' was never awaited`(teardown 协程泄漏)。与 B-135-2 同源并发。修法:pytest-timeout 每用例超时 + teardown 协程泄漏修复 + 251 派发统一 timeout/落盘规程。闭环:连续 2 轮 51 例 <300s 且 EXIT≠124。 | 测试(R154 实派) | 2026-11-11 22:25 | 待处理(P1) |
+| **B-74 / B-142-2-Update(第 6 轮,波动)** | 251 LLM 上游 429 + 401 | 运维/AI(P0) | **波动**。**51 例 / 47 过 / 4 红 / 133.36s**;红例 `test_auto_tag_{short_content,empty_content}` + `test_intent_{classify_analysis,classify_recommend}`;日志 `401 api key ****ab12 invalid` + `429 AgnesAI free users rate limit`;同窗口 `/health` 200 → 服务活、仅上游凭据/配额。较 R153:auto_tag content_relevance 转绿(+1)、intent 2 例回红(−2)、净 −1。**连续 2 轮绿才销号(观察 0/2)**。 | 测试(R154 实派) | 2026-11-11 22:25 | 待处理(P0) |
+| **B-153-1-Update(第 2 轮 0 偶发)** | 189 admin TC-A-U05 登录前置偶发 | 测试(观察项) | **未复现**。本轮首轮即 **5/5 全绿**(1.3m,EXIT=0),U05 `account-roles` 200。观察计数 1/2,**连续 2 轮 0 偶发销号**(R155 若仍首轮绿则销)。 | 测试(R154 实派) | 2026-11-11 22:25 | 观察中 |
+| **B-152-2-Update(第 3 轮未修)** | CI 排除清单漏 3 红类 | 研发(P0 CI) | **延续**。`.gitlab-ci.yml:61` 仍漏 `UserServiceWechatLoginTest`/`UserServiceWechatLoginContractTest`/`TeamProfitCronContractTest` → `backend-blocking-junit` 必红。 | 测试(R154 复核) | 2026-11-11 22:25 | 待处理(P0) |
+| **B-152-1-Update(第 3 轮未修)** | CI 排除清单陈旧 26 绿类 | 研发(P1 CI) | **延续**。清单 33 类中 26 类已转绿仍未解禁。 | 测试(R154 复核) | 2026-11-11 22:25 | 待处理 |
+| **B-152-3-Update(第 3 轮未修)** | `@EnableScheduling` 测试期常驻 | 研发(P1) | **延续**。R153 实测调度日志 13.6% 与全量 39:42 强相关;本轮后端采信 R153 未复跑,影响面不变。 | 测试(R154 复核) | 2026-11-11 22:25 | 待处理 |
+| **B-134-4-Update(第 15 轮)** | intent_classifier 兜底伪装 | 研发/AI(P1) | **延续**。`app/agents/intent_classifier.py:62` 异常 → 默认 `chat`。本轮 429 时 intent 2 例断言失败(classify_analysis/classify_recommend)。 | 测试(R154 实派) | 2026-11-11 22:25 | 待处理 |
+| **B-142-1-Update(第 11 轮)** | `/api/admin/**` 鉴权门缺失 | 研发(P1 安全) | **延续(11 轮未修)**。匿名 `POST /api/admin/families/overview` → HTTP 200 + `{"code":400}`;5 对照端点全 401。 | 测试(R154 巡检) | 2026-11-11 22:25 | 待处理 |
+| **B-145-1-Update(第 8 轮)** | `nutrition_age_dosage` 建表 SQL 无效 | 研发(P1 Schema) | **延续(8 轮未修)**。`schema.sql:5343` 索引行 `product_id` 无对应列 → DDL 恒失败。 | 测试(R154 复核) | 2026-11-11 22:25 | 待处理 |
+| **B-69-Update(第 15 轮销号维持)** | mind/fortune 匿名 200 | 研发(P1) | **维持销号**。匿名 POST 5 端点(mind/fortune、energy/overview、health/plan/list、huawei-health/status、xiaomi-health/status)**5/5 = 401**。 | 测试(R154 巡检) | 2026-11-11 22:25 | 已闭环 |
+| **B-36-Update(第 48 轮零漂移)** | 根级黑盒门控 | 测试(P3) | **零漂移**。23 例 7 过 / 16 红,全 `fetch failed`(9082 未启动)。 | 测试(R154 实测) | 2026-11-11 22:25 | 待处理(环境型) |
+| **B-95-Update(第 23 轮)** | `204:4090` 失联 | 运维(P2) | **延续**。204:4090 = 000;189/251 均 200。 | 运维 | 2026-11-11 22:25 | 待处理 |
+| **B-DX-1-Update(第 14 轮)** | dx-bridge 端点 404 | 部署(P2) | **延续**。dx 2 例 skip(不假绿)。 | 部署/运维 | 2026-11-11 22:25 | 待处理 |
+| **B-138-3-Update(第 10 轮)** | 后端超慢测试类 | 研发(P3 效率) | **维持**。R153 全量 39:42,scheduler 13.6%;本轮采信未复跑。 | 测试(R154 复核) | 2026-11-11 22:25 | 待处理 |
+| **B-141-3-Update** | 站点根 `/` 异常 | 运维(P3) | **维持观察**。`/` = 404、`/admin` = 302、`/frontend` = 302。 | 测试(R154 巡检) | 2026-11-11 22:25 | 观察中 |
+| **B-148-1-Update(第 5 轮未复现)** | 网关瞬抖 502 | 运维(P3) | **未复现**。health 套件 13/13,无 502。 | 测试(R154 巡检) | 2026-11-11 22:25 | 观察中 |
+| **B-141-1(延续)** | qna 收集期缺陷 | 研发(P1) | **延续(排除项)**。pytest 口径 `--ignore=tests/qna --ignore=tests/test_chat.py`。 | 测试(R154 实派) | 2026-11-11 22:25 | 待处理 |
+
+> **R154 口径**:后端**采信 R153 强制实跑**(窗口 `39717eb07..d9866096a` 零测试资产变更)。
+> 后端 **347 类 / 2946 例 / 2925 过 / 16F+1E+4S = 99.29%**(39:42,347/347 XML;零回归第 12 次)。
+> 前端 **617 = 602 过 / 3 红 / 12 跳**;管理端 **116/116**;根级 **23 = 7/16**;**langgraph@251 51 = 47/4(133.36s,EXIT=124 收尾挂起 B-154-1)**;浏览器 **28/28 + 2 skip**(189 admin 首轮即 5/5 + 本机 fe 6/shop 4/health 13/dx 2 skip)。
+> **全量 3783 / 3725 过 = 98.47%**(剔 skip 98.94%;红 40 / 跳 18)。
+> **结论**:**不通过** —— G1 ✅ 98.47%、G4 ✅、G5 ✅、G6 ✅ 28/28、G8 ✅ 5/5、**G10 ✅ 双节点**、G12 ✅;❌ G2 17 红、G7 4 红(429/401 + 挂起)、G9 23.0%、**G11 CI 必红(B-152-2 第 3 轮未修)**;⚠️ G3 3 预期 RED。
+> **变化点**:langgraph 48→47 过(红 3→4,上游抖动);全量 98.49%→**98.47%**(−0.02pp);新增 B-154-1(pytest 挂起恶化);B-153-1 第 2 轮 0 偶发 → 推送 + 通知研发。