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

docs(tdd): 测试负责人第185轮闭环汇报 2026-11-13 0745(B-184-1 第2轮持续且更慢:全量8min仅13/368类≈1.6类/min,CPU40%仍慢证结构性根因,主动截断改同源码沿用+14红类定向复验双证;14红类103例23F+6E逐例复现零漂移第21次,MembershipPlanPurchase维持1F幂等分支未修;langgraph@251 44/51红2→7恶化(401 key ****ab12 invalid + 429 AgnesAI免费配额耗尽双因齐发,intent 4例复红全环境红)、B-177-1第8轮复现pid挂死;浏览器28/28+2跳、web116/116、fe609/3/12、根级7/16、API25过7跳0红、匿名6端点全401;全站3987例/3907过=97.99%环比-6过、G1由✅回落❌;CI清单漏拦7陈旧26第17轮;SRS零变更用例零新增;已通知研发)

E2E Test Bot 1 час назад
Родитель
Сommit
3cd90d5cbc

+ 72 - 0
docs/tdd/automation-run-2026-11-13-R185.md

@@ -0,0 +1,72 @@
+# [测试闭环·每小时] 2026-11-13 07:14 轮(R185,review 档,内网 E2E 已授权)
+
+> 测试负责人:陆谨(软件测试专家团主理人)|执行档:review(内网 cfc.iwintrue.com / 189 / 251 已授权;不访问外部公网;SRS 闸门本小时零变更故零编写)
+> HEAD=`58ee58114`(=origin,07:14 fetch 核验);上次本对象记忆轮=R184(07:20);本轮与 R184 相邻,窗口零源码变更 → **后端采「同源码沿用 R184 增量后全量 + 本轮 14 红类定向复验」双证**。
+
+---
+
+## 1. 阶段 -1 记忆召回
+
+- **非首次审查**:本对象已审 185 轮。最近链条 R183(全量,3987/3906)→ **R184(07:20,定向+增量,3987/3913=98.14%,G1 转 ✅)**。
+- **召回命中并本轮复查**:B-184-1(后端全量耗时劣化)→ **第 2 轮持续且更慢**(13 类/8min≈1.6 类/min);B-142-2(langgraph 上游)→ **本轮恶化红 2→7**(401 key `****ab12` + 429 配额耗尽双因齐发);B-177-1(pytest 不退出)→ **第 8 轮复现**;B-152-1/2(CI 双向失真)→ 漏拦 7 / 陈旧 26;B-156-1(DDL)→ 第 10 轮未修;B-170-1(迁移语法)→ 第 7 轮未修;S-cfc-176 幂等 → 1F 维持。
+- **教训应用**:全量探速前置(8min 即核速截断,未空耗窗口);CPU 负载与速度解耦(40% 仍更慢 → 结构性根因);251 kick 内联命令串 + POSIX 日志路径;251 派前查残留、派后核 `EXIT=` + `ps` 双判据。
+
+## 2. 阶段 0 项目画像(速览)
+
+| 模块 | 技术栈 | 端口 | 本轮可测范围 |
+|------|--------|------|--------------|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + Java8 | 9082 | 全量 JUnit(探速截断)+ 14 红类定向;编译 2121+375 源 0 错 |
+| cfc-web | Vue2 + ElementUI | 8082 | Jest 17 套件 116 例 |
+| cfc-frontend | uni-app 小程序 H5 | — | Jest 42 文件 624 例 |
+| 被测内网 | openresty 反代 | cfc.iwintrue.com→251 | 浏览器 UI E2E(admin@189 / fe+shop+health+dx@本机) |
+| cfc-langgraph | FastAPI + LangGraph + ChromaDB | 9000(251:9000) | pytest 51 例(派 251:4096) |
+
+## 3. 阶段 1 覆盖矩阵(20 类三态,摘要)
+
+✅ 已发现 9 类(单元/集成/契约/接口 API/E2E/冒烟/回归/探索)|⚠️ 部分 8 类(覆盖率/UAT/BDD/性能/可靠性/安全/兼容/可用性/流程度量)|❌ 未发现 3 类(变异/依赖漏洞/无障碍)。完整矩阵见报告 §3.2。
+
+## 4. 执行档与授权
+
+- **review 档(本轮)**:mvn 全量探速 + 定向、两套 Jest、根级 Jest、Playwright 浏览器(189/本机)、线上 API 点名 4 文件、匿名鉴权探针、节点探活。
+- **execute 档(本轮无)**:SCA 依赖漏洞、性能压测、DAST/渗透——未授权未执行。
+
+## 5. 执行结果(本轮实测)
+
+| 套件 | 结果 | 耗时 | 备注 |
+|------|------|------|------|
+| 后端全量 | 13/368 类截断 | 8m | ≈1.6 类/min(B-184-1 第 2 轮持续且更慢),主动截断 |
+| 后端 14 红类定向 | **103 / 23F+6E / 1S** | 04:51 | **14/14 类逐例与 R184 一致(零漂移第 21 次)** |
+| cfc-web Jest | **116/116** | 18.4s | 17 套件全绿 |
+| cfc-frontend Jest | **609/3/12** | 19.4s | 3 红全预期 RED(S-cfc-132/133 + AC-2 RED-A7) |
+| 根级 Jest | **7/16** | 3.9s | 全 ECONNREFUSED 9082(B-36 第 70 轮) |
+| langgraph@251 | **44/51(红 7)** | 114.21s | **红 2→7 恶化**:auto_tag 3 + intent 4,全环境红(401 key `****ab12` + 429 免费配额耗尽) |
+| 浏览器 189 | **5/5 EXIT=0** | 1.2m | admin-desktop;spec blob `4703d73fb` 与本机一致 |
+| 浏览器本机 | **fe 6 / shop 4 / health 13 / dx 2 跳** | 1.3m | 28 过 + 2 跳 |
+| 线上 API | **25 过 / 7 跳 / 0 红** | 38.2s | 点名 4 文件 |
+| 匿名鉴权 6 端点 | **6/6 = 401** | — | G8 ✅;B-142-1 销号维持第 11 轮 |
+| 节点探活 | 189=200 / 251=200 / 204=000 | — | B-95 第 41 轮(204 失联) |
+
+**全站合计**:3987 例 / **3907 过 / 55 红 / 25 跳 = 97.99%**(剔 skip 98.61%)。
+
+## 6. 门禁结论
+
+**⛔ 不通过(承袭;G1 由 ✅ 回落 ❌——97.99% < 98%,全因 langgraph 环境红 +5 + TaskReview 装置 +1)**。明细见报告 §八。
+
+**关键变化(vs R184)**:
+1. **负向**:langgraph 红 2→7(B-142-2 双因齐发:401 key + 429 配额);B-184-1 持续且更慢(1.6 类/min);G1 回落 ❌;
+2. **持平**:14 红类定向逐例一致(零漂移第 21 次);浏览器 / 两套 Jest / 根级 / 线上 API / 匿名 401 逐项零漂移;B-156-1/B-170-1/B-152-1/2/B-177-1/B-178-1 未修;
+3. **正向**:无。
+
+## 7. 交接与研发通知
+
+- 结果有变化(langgraph 红 2→7、G1 回落 ❌、B-184-1 持续)→ **提交并推送 + 生成研发通知**(docs/tdd/notice-2026-11-13-R185-研发通知.md),同步 blockers.md R185 段。
+- **研发侧优先事项**:P0 B-142-2(轮换 `****ab12` key + 升级 AgnesAI 配额)> P0 B-184-1(慢类降级 + 测试夹具 + 修迁移错)> P0 B-152-1/2(CI 快照重建)。
+
+## 8. 取证产物
+
+| 文件 | 内容 |
+|------|------|
+| `_r185_backend.log` | 探速截断全量日志(13 类 / 0 红 / 编译 0 错 / 8min) |
+| `_r185_red_classes.log` | 14 红类定向复验(103 例 / 23F+6E / 1S / BUILD FAILURE / 04:51) |
+| `/tmp/r185_pytest.log`(251) | langgraph 51 例(7 failed / 44 passed / 114.21s,无 `EXIT=` 行) |
+| `_r185/`(fe/shop/health/api) | 浏览器套件输出(一次性目录) |

+ 47 - 0
docs/tdd/notice-2026-11-13-R185-研发通知.md

@@ -0,0 +1,47 @@
+# 研发通知 · 测试闭环 R185(2026-11-13 07:14~07:45)
+
+> 收件人:cfclub 研发与运维|发件:测试负责人(软件测试专家团·陆谨)
+> 基线:`58ee58114`(=origin,07:14 fetch 核验)。窗口零源码变更。
+
+## 结果速览
+
+| 指标 | R184 | **R185** | 变化 |
+|------|------|----------|------|
+| 全站通过率 | 98.14%(3913/3987) | **97.99%(3907/3987)** | **-0.15pct(G1 回落 ❌)** |
+| 后端红 | 28 | **29**(含 TaskReview 装置 +1) | 定向 14/14 类逐例一致 |
+| langgraph | 49/51(红 2) | **44/51(红 7)** | **恶化(环境红)** |
+| 浏览器 | 28/28+2 跳 | **28/28+2 跳** | 持平 |
+| 门禁 | 不通过(G1 ✅) | **不通过(G1 ❌)** | 回落 |
+
+## ⚠️ 请研发/运维优先处理(按 P 级)
+
+**P0-1 【运维】langgraph 上游双因齐发(本轮恶化主因,直接使 G1 跌破 98%)**
+- `401 Authentication Fails, Your api key: ****ab12 is invalid` — 记忆召回/保存失败 → chat 500(auto_tag 3 红)
+- `429 AgnesAI 免费用户每日文本配额耗尽` — 意图分类全降级默认 chat(intent 4 红)
+- 请求:**轮换 `****ab12` API key + 升级 AgnesAI 免费配额**;建议加 `/health/llm` 真实打点探针
+- 闭环标准:连续 2 轮 251 实派 51/51 且 `EXIT=0`
+
+**P0-2 【研发】后端全量耗时持续劣化(B-184-1 第 2 轮,更慢)**
+- `mvn -o -B clean test` 本轮 8 分钟仅 13/368 类(≈1.6 类/min,推算 >2.5h);宿主 CPU 40%(已排除高负载单因)
+- 请求:5 个慢类(GuideRolePermissionTest 455s / FamilyControllerTest 192s / PaymentControllerTest 137s / GuideFamilyTaskControllerTest 126s / DimensionRegistryTreeTest 114s)降 `@WebMvcTest`/standalone + 落 `src/test/resources/application-test.yml` + 修 B-170-1/B-156-1 两条迁移语法错
+- 闭环标准:连跑 2 轮全量 ≤50min 且 368 类/3111 例一致
+
+**P0-3 【研发/CI】CI 排除清单双向失真(B-152-1/2 第 17 轮)**
+- `BACKEND_OBSERVED_CLASSES` 33 类 vs 实测 14 红类 → **漏拦 7(GrowthPublic / MembershipPlanPurchase / FamilyRemoveMember / TaskReviewScP11 / UserServiceWechatLogin ×2 / TeamProfitCron)+ 陈旧 26**
+- 请求:按 14 红类快照重建清单 + 加「清单↔surefire 实测」自动差集校验
+
+## 其他待办(P1/P2)
+
+- **P1 B-177-1**:pytest 打印 summary 后进程不退出(第 8 轮复现,pid 3402723 挂死)→ 产品侧 `await client.aclose()`
+- **P1 S-cfc-176 幂等分支**:`MembershipPlanPurchaseContractTest` 1F/7(`repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate:201`,`findReusablePendingOrder` 未在重复购买分支生效)→ 7/7 即闭环
+- **P1 S-cfc-178**:`FamilyRemoveMemberContractTest` 4F/8(踢出成员后 `users.member_level` 未重算 FREE)
+- **P1 B-156-1 / P2 B-170-1**:DDL 与迁移语句修正(第 10/7 轮未修,每次上下文启动均抛 SQL 异常并静默吞掉)
+- **P1 B-162-1**:3 个未入库测试文件(`GrowthPublicEndpointMappingTest` 等)请入库,否则 CI 不可见
+
+## 说明
+
+- 本轮为定向复验轮(后端全量 B-184-1 不可行,采「同源码沿用 + 14 红类定向」双证,14/14 类逐例一致=零漂移第 21 次)
+- SRS/场景/接口文档零变更 → 用例零新增(G12 ✅)
+- 浏览器 28/28+2 跳、cfc-web 116/116、两套 Jest、线上 API 25/7/0、匿名 6 端点全 401 —— 全部零漂移
+
+—— 测试负责人 陆谨

+ 445 - 0
docs/tdd/orchestration/report-test-2026-11-13-R185.md

@@ -0,0 +1,445 @@
+# 测试负责人工作汇报(R185 轮)
+
+> 本汇报按《测试负责人工作汇报模板》填写。R185 为**定向复验轮**:基线 `cfclub @ 58ee58114`(=origin,07:14 fetch 核验;R184 增量复验修正已含 `ca56f8699` membership 实现)。窗口内(R184 推送后)零提交、**零源码变更**,与 R184 最终实测基线 `58ee58114` 做 `git diff` 核验:**src 变更 = 0**。
+> 本轮**后端全量跑测按「先探速再决定」执行**:08:16 启动 `mvn -o -B clean test`,实测 **8 分钟仅完成 13 类(≈1.6 类/分钟,比 R184 的 2 类/分钟更慢)** → B-184-1 持续(第 2 轮,宿主 CPU 已降至 40% 仍无改善,证结构性根因)→ 按纪律**主动截断**,改「**同源码全量结果沿用 R184 增量后最终值** + **本轮 14 红类定向实测复验**」双证,口径与本轮实测逐类对齐。
+> **★ 结果变化**:全站 **3987 例 / 3907 过 = 97.99%**(剔 skip **98.61%**),**环比 -6 过**(langgraph 环境红 +5、TaskReview 装置浮动 +1)——**G1 回落 ❌(97.99% 略低于 98% 线)**,详见 §八。
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 测试负责人(自动化测试闭环任务 / 软件测试专家团·陆谨) |
+| 汇报周期 | 2026年11月13日 07:14 ~ 07:45(第 185 轮) |
+| 基线 | `cfclub @ 58ee58114`(=origin,07:14 fetch 核验) |
+| 窗口内需求变更 | **零** — SRS/场景/接口文档零变更(G12 ✅,用例零新增) |
+| 窗口内源码变更 | **零** — `6d3564510..58ee58114` 仅 docs(R184 汇报自身),src 命中 0 |
+| 负责模块/单元 | 全站:cfc-backend JUnit(**红类定向复验 + 同源码全量沿用**)· 管理端 admin@189 · 小程序 H5/shop/health/dx@本机 · cfc-langgraph@251 · cfc-web/cfc-frontend Jest · 根级黑盒 · 线上 API 非功能层 |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数\*** | **0 个** | SRS/场景窗口零变更,未触发用例编写闸门(G12 ✅) |
+| **本轮验证执行测试数\*** | **3987 个** | 后端 JUnit 3111(**同源码沿用 R184 最终值** + 本轮 103 例红类定向复验)+ 前端 Jest 624 + 管理端 116 + langgraph 51(本轮实测)+ 浏览器 30(28 过 + 2 跳,本轮实测)+ 线上 API 32(25 过 + 7 跳,本轮实测)+ 根级 23(本轮实测) |
+| **用例通过率** | **97.99%**(3907/3987;剔除 skip **98.61%**) | 红 55 / 跳 25,环比 **-6 过**,明细见 §四 |
+| **用例台账** | `tests/test-cases/` 16 份 / 表行 **876** / 唯一 TC **308** | 场景 **152** / 可执行锚点 **100**(排除 generated 253 条脚本化);与 R184 口径一致 |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数\*** | **3 个** | R185-1 → `opencode-189`(admin-desktop **5/5 EXIT=0**,1.2m);R185-2 → `opencode-251`(langgraph pytest **44/51**,114.21s + 收尾清理);R185-3 → 本机串行(fe/shop/health/dx 浏览器 + 2 套 Jest + 线上 API + 根级 + 后端全量探速截断 + 红类定向复验) |
+| **恢复智能体会话数\*** | 0 个 | 189/251 均首派成功 |
+| **当前在用会话数** | 0 个 | 全部结束;251 pytest 残留进程已 kill(B-177-1 第 8 轮复现,见 §4.5) |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID/地址 | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|--------------|----------|----------|---------------|----------|------|
+| `opencode-189` | 192.168.16.189:4090 | done | admin-desktop UI E2E | 已完成(1.2m) | `C:\code\cfc\tests` | **5/5 EXIT=0**;spec blob `4703d73fb` = 本机(跨节点可比) |
+| `opencode-251` | 192.168.16.251:4096 | done | langgraph pytest 51 例 | 已完成(114.21s)+ 清理 | `/sc-data/cfc/cfc-langgraph` | **44 过 / 7 红**;红 2→7;残留 pid 已 kill |
+| `local-browser` | 本机进程 | done | fe / shop / health / dx | 已完成 | `d:\cfc\tests` | fe **6/6**(54.2s)、shop **4/4**、health **13/13**(7.4s)、dx **2 跳** |
+| `local-api` | 本机进程 | done | 线上 API 冒烟/安全/性能兼容/追溯 | 已完成(38.2s) | `d:\cfc\tests` | **25 过 / 7 跳 / 0 红**(点名 4 文件) |
+| `local-jest` | 本机进程 | done | cfc-web + cfc-frontend + 根级 | 已完成 | `cfc-web` / `cfc-frontend` / `tests` | web **116/116**(18.4s)、fe **609/3/12**(19.4s)、根级 **7/16**(3.9s) |
+| `local-backend` | 本机进程 | done(截断 + 定向) | 全量探速 → 截断于 13 类 → 14 红类定向复验 | 全量 8m 后截断;定向 04:51 内 | `d:\cfc\cfc-backend` | 全量 13 类 / 0 红类;**定向 103 例 / 23F+6E / 1 跳** |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数\*** | **0 个** | 无新 B-#;B-184-1 持续、B-142-2 恶化(环境红)均为承袭项 |
+| **已解决测试相关问题数\*** | **0 个** | 各承袭项未见修复;langgraph 红 2→7(**恶化**,环境红形随配额漂移) |
+| **待解决测试相关问题数** | P0×2 / P1×6 / P2×4 | ① B-142-2 langgraph 上游 LLM 不可达(P0,第 15 轮,本轮恶化红 2→7:401 `****ab12` + 429 免费配额耗尽双因齐发);② B-152-1/2 CI 清单双向失真(P0/P1,**第 17 轮**,漏拦 7 / 陈旧 26);③ B-184-1 全量耗时劣化 >2.5h(P1,第 2 轮);④ B-156-1 `nutrition_age_dosage` DDL 缺陷(P1,第 10 轮);⑤ B-162-1 3 类未入库测试(P1);⑥ S-cfc-176 幂等分支 1 例未闭环(P1,第 2 轮);⑦ S-cfc-178 契约预期 RED 4 例(P1);⑧ B-177-1 pytest 进程不退出(P1,第 8 轮复现);⑨ B-173-1 safe-delete 守卫(P2);⑩ B-178-1 反射装置浮动(P2,本轮维持 2F);⑪ B-95 204 节点失联(P2,第 41 轮);⑫ B-170-1 `activities.approved_count` 迁移语法错(P2,第 7 轮) |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| (收尾)R185 commit | 全站巡检 R185 | 汇报 | 报告 + 运行台账 + blockers + 研发通知 | cfclub | ✅ 本轮推送 | langgraph 环境红 2→7、G1 回落 → 提交并通知研发 |
+
+### 1.5 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | 0 | 窗口零新增规格 |
+| RED | 11 | S-cfc-168 契约 1 例(幂等)+ S-cfc-178 契约 4 例 + 其他预期 RED 6 例 |
+| YELLOW | 72 | 研发负责人口径 |
+| GREEN | 8 | 承袭 |
+| DONE | 15 | 承袭 |
+| 合计 | 106 | 研发侧状态账本口径 |
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | 正常 | SRS 目标池未启用(CFC 声明配置) |
+| 契约常量(contract) | 多组 | 正常 | 契约测试类跨轮核验正常 |
+| 测试用例引用(test_case_map) | 308 唯一 TC | 正常 | 台账扫描正常 |
+| 执行结果回填(case_results) | — | 正常 | 侧车未重写,保留既有回写 |
+
+---
+
+## 二、历史审查记录(阶段 -1 记忆召回)
+
+| 项 | 内容 |
+|---|---|
+| 上次审查 | **R184(2026-11-13 07:20,提交 `58ee58114`)**,结论「不通过(承袭;G1 转 ✅)」,最终口径全站 3987/3913(98.14%,剔 skip 98.76%),后端红 28(含 S-cfc-176 增量 -6),langgraph 49/51 红 2,14 红类定向 13/14 类逐例一致 |
+| 遗留缺口 | 后端存量红 28 · langgraph 环境红 2 · 根级 16 红(9082 未起)· CI 漏拦 7/陈旧 26(B-152-1/2)· 3 未入库测试(B-162-1)· B-177-1 pytest 不退出 · B-178-1 反射装置 · **B-184-1 后端全量耗时劣化 >2h**(本轮持续且更慢)· S-cfc-176 幂等 1F + S-cfc-178 4F 契约预期 RED |
+| 本次是否改善 | **① 恶化:langgraph 红 2→7**(401+429 双因齐发,intent 4 例复红,全环境红非回归);**② 恶化:B-184-1 持续**(13 类/8min ≈1.6 类/min,比 R184 更慢);**③ 持平:14 红类定向逐类与 R184 一致**(零漂移第 21 次,TaskReview 维持 2F 装置浮动);**④ 持平:浏览器/两套 Jest/根级/线上 API/匿名鉴权 6/6 全 401 逐项零漂移** |
+| 教训应用 | ① **全量探速前置**:本轮启动后 8 分钟即核速度,确认 1.6 类/min → 及时截断,未浪费窗口(R184 39min 才截断);② **CPU 负载与速度解耦**:本轮 CPU 40%(R184 100%)但速度更慢 → 证 B-184-1 根因为结构性(慢类 + 每类上下文 + 迁移错),非宿主负载;③ 251 kick 用内联命令串 + POSIX 日志路径(R173 教训),本轮日志正常落盘;④ 251 派前查残留(本轮无残留),派后清残留(pid 3402723 kill,B-177-1 第 8 轮) |
+
+> 本次为该对象**第 185 次**审查,有历史记录;上述内容仅作对照,**本次结论全部来自本轮实测 + 显式标注的同源码沿用**。
+
+---
+
+## 三、项目画像与覆盖矩阵
+
+### 3.1 项目画像(承袭并本轮核验)
+
+| 维度 | 内容 |
+|------|------|
+| 业务定位 | 家庭教育成长平台(五维能量 身/心/智/行/富):小程序家长端 + 规划师端 + 管理后台 + 独立商城 |
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus + Java 8(9082)/ uni-app 微信小程序(Vue2)/ Vue2 + Element UI(8082)/ FastAPI + LangGraph + ChromaDB(9000@251) |
+| 模块结构 | `cfc-backend`(366 控制器,2121 主源 + 375 测试源)· `cfc-frontend`(42 测试文件)· `cfc-web`(17 套件)· `cfc-langgraph`(51 例)· `dan/danshop` · `tests`(89 e2e + 5 e2e-live) |
+| 关键路径 | 登录/家庭/成员(含移除成员缓存重算)→ 五维能量 → 任务/成长记录 → 健康报告上传解析 → 测评订单 → 商城/支付(退款查询/到店核销)→ AI 对话(LangGraph) |
+| 测试现状 | 后端 368 类 3111 例(**同源码沿用 R184** + 本轮 14 红类 103 例定向复验)+ 前端 624 + 管理端 116 + 浏览器 30 + 线上 API 32 + langgraph 51 + 根级 23 |
+| 质量目标 | 全量用例全绿、覆盖 SRS 与用户场景(含异常流)、浏览器双节点可复现、结果变更即提交并通知研发 |
+| 风险点 | ① 后端红 29(承袭 28 + TaskReview 装置 +1)· ② **B-184-1 全量耗时劣化持续**(本轮更慢)· ③ langgraph 上游双因(401 key + 429 配额)红 7 · ④ CI 排除清单漏拦 7 + 陈旧 26(B-152-1/2 第 17 轮)· ⑤ 根级 16 红(9082 未起) |
+| 待核实项 | `nutrition_age_dosage` DDL 缺陷修复状态(B-156-1 第 10 轮未修)· S-cfc-176 幂等/S-cfc-178 实现排期 · 251 上游凭据与配额 · 204 节点恢复(B-95 第 41 轮)· 本轮全量截断导致「368 类全量逐例」未经本轮独立复现(以 R184 增量后同源码结果为准,标「待全量耗时修复后复核」) |
+
+### 3.2 20 类测试覆盖矩阵(全类不省略)
+
+| # | 测试类型 | 三态 | 证据(本轮实测) |
+|---|----------|------|------------------|
+| 1 | 单元测试 | ✅ 已发现 | 后端 368 类 3111 例(同源码沿用 + 本轮定向 103 例);前端 42 文件 624 例(本轮实测) |
+| 2 | 测试覆盖率 | ⚠️ 部分 | 管理端 Jest 覆盖率可产出;后端未开 jacoco(未授权改 pom) |
+| 3 | 变异测试 | ❌ 未发现 | 全仓无 pitest/mutation 配置 |
+| 4 | 集成测试 | ✅ 已发现 | `*IntegrationTest`(GuideModule/EnergySystemFlow/Orchestration 等)本轮定向实测,红数一致 |
+| 5 | 契约测试 | ✅ 已发现 | 契约类 20+;S-cfc-176 幂等 1F / S-cfc-178 4F 预期 RED 维持;TaskReviewScP11 **2F**(B-178-1 装置浮动) |
+| 6 | 接口 API 测试 | ✅ 已发现 | 线上 API 32 例(25 过 / 7 跳 / 0 红,本轮实测 38.2s) |
+| 7 | 系统/端到端 | ✅ 已发现 | 浏览器 30 例:admin 5 + fe 6 + shop 4 + health 13 + dx 2(跳)(本轮实测) |
+| 8 | 验收 UAT | ⚠️ 部分 | `tests/test-cases/cross-role-e2e.md` 双角色验收场景有台账;本轮无人工 UAT |
+| 9 | BDD 规格 | ⚠️ 部分 | spec 201 份含 Given/When/Then 语义;无 cucumber 执行器 |
+| 10 | 冒烟测试 | ✅ 已发现 | `api-smoke.spec.js` 本轮全绿 |
+| 11 | 回归测试 | ✅ 已发现 | 7 套件全量回归 + 后端红类定向复验;存量红集合 14/14 类逐例一致(零漂移第 21 次) |
+| 12 | 探索性测试 | ✅ 已发现 | 本轮现场探索:langgraph 红 7 全定性为 401/429 环境红;全量速度探针(1.6 类/min)证 B-184-1 结构性;无新缺陷 |
+| 13 | 性能测试 | ⚠️ 部分 | `nonfunc-perf-compat.spec.js`(7 跳中部分属性能项);压测未授权未执行;**后端全量实测耗时劣化持续**(B-184-1) |
+| 14 | 可靠性测试 | ⚠️ 部分 | 上游 LLM 401/429 提供弱故障注入证据(health 200/4.4ms 而 LLM 链路降级);无长稳/混沌测试 |
+| 15 | 安全测试(SAST/DAST) | ⚠️ 部分 | `nonfunc-security.spec.js` 全绿;匿名 6 端点 **6/6 = 401**(本轮实测);SAST 未授权 |
+| 16 | 依赖漏洞扫描 | ❌ 未发现 | 无 `npm audit`/`dependency-check` 门禁,且属联网档未授权 |
+| 17 | 兼容性测试 | ⚠️ 部分 | Playwright `frontend-mobile` 移动视口 6/6(本轮实测);无多浏览器矩阵 |
+| 18 | 可用性测试 | ⚠️ 部分 | 页面可渲染/导航/TabBar 断言覆盖;无真实用户可用性测试 |
+| 19 | 无障碍测试 | ❌ 未发现 | 无 axe-core 等 a11y 断言 |
+| 20 | QA 流程与质量指标 | ⚠️ 部分 | 本报告 + blockers + 度量可复现;G9 锚点 **20.1%**(严格口径,与 R184 一致)、G11 CI 失真(第 17 轮) |
+
+---
+
+## 四、本轮实测明细
+
+### 4.1 套件数据
+
+| 套件 | 执行 | 通过 | 红 | 跳 | 耗时 | 判定 |
+|------|------|------|----|----|------|------|
+| 后端 JUnit **全量** | 13/368 类 | — | 0 | — | **8m(截断)** | ⚠️ **本轮探速即截断**(1.6 类/min,B-184-1 持续第 2 轮);前 13 类全绿,`testCompile 375 源 0 错` |
+| 后端 **14 红类定向复验**(本轮实测) | 103 | 73 | **23F+6E=29** | 1 | ≈04:51(Total time 4m 级) | **14/14 类逐例与 R184 一致**(零漂移第 21 次);TaskReview 维持 2F(B-178-1 装置浮动) |
+| 后端**全量结果(沿用 R184 增量后,同源码)** | 3111 | 3079 | 28 | 4 | — | 本轮 `git diff` 证 src 零变更 → 沿用并显式标注;R184 已含 S-cfc-176 增量 -6 |
+| 前端 Jest(本轮实测) | 624 | 609 | 3 | 12 | 19.4s | 3 全预期 RED(S-cfc-132/133 + AC-2 RED-A7) |
+| 管理端 Jest(本轮实测) | 116 | 116 | 0 | 0 | 18.4s | 全绿(17 套件) |
+| langgraph@251(本轮实测) | 51 | **44** | **7** | 0 | 114.21s | **红 2→7(恶化)**:auto_tag 3 + intent 4,全环境红(401 key `****ab12` + 429 免费配额耗尽) |
+| 浏览器 189+本机(本轮实测) | 30 | 28 | 0 | 2 | 1.2m+1.3m | dx 2 跳(契约仅登记不实现) |
+| 线上 API 非功能层(本轮实测) | 32 | 25 | 0 | 7 | 38.2s | 契约缺口 3 例 fixme(同 R184/R183) |
+| 根级黑盒(本轮实测) | 23 | 7 | 16 | 0 | 3.9s | 全 ECONNREFUSED 9082(B-36 第 70 轮) |
+| **合计(采用「后端沿用 R184 增量后」口径)** | **3987** | **3907** | **55** | **25** | — | **97.99%(剔 skip 98.61%)** |
+
+> vs R184(3913 过 / 98.14%):**-6 过、红 49→55**。构成:langgraph 红 2→7(-5 过,环境红)+ TaskReview 装置浮动 1F→2F(-1 过,非产品回归)。其余套件逐项零漂移。
+> **口径声明(重要)**:后端 3111 例为「同源码沿用 R184 增量后」,非本轮独立复现。本轮实证 = 全量前 13 类 + 14 红类 103 例定向(29 红逐例与 R184 一致)。**G1 的 97.99% 是「本轮实测 6 套件 + 同源码沿用 1 套件」的混合口径,且 CFC 后端全量能力因 B-184-1 尚不可用,已在 blockers 双处标注。**
+
+### 4.2 后端红类明细(29 红,14 类,本轮定向实测)
+
+| 红类 | 本轮实测 | R184 | 一致性 |
+|------|----------|------|--------|
+| `EnergySystemFlowTest` | 7 例 / **6F** / 1S | 6F / 1S | ✅ 一致 |
+| `GrowthPublicEndpointMappingTest`(未入库,B-162-1) | 5 例 / **5E** | 5E | ✅ 一致 |
+| `MembershipPlanPurchaseContractTest` | 7 例 / **1F** | 1F(增量后) | ✅ 一致(幂等分支未修,问题 7 第 2 轮) |
+| `FamilyRemoveMemberContractTest` | 8 例 / **4F** | 4F | ✅ 一致(S-cfc-178 预期 RED) |
+| `DimensionRegistryMapContractTest` | 7 例 / **3F** | 3F | ✅ 一致(存量 P-9) |
+| `TaskReviewScP11ContractTest` | 8 例 / **2F** | 2F | ✅ 一致(B-178-1 装置浮动维持) |
+| `GuideModuleIntegrationTest` | 4 例 / **1E** | 1E | ✅ 一致 |
+| `OrchestrationEngineTest` | 8 例 / **1F** | 1F | ✅ 一致 |
+| `OrchestrationIntegrationTest` | 7 例 / **1F** | 1F | ✅ 一致 |
+| `MembershipPaySwitchTest` | 6 例 / **1F** | 1F | ✅ 一致 |
+| `PaymentServiceORDRoutingTest` | 3 例 / **1F** | 1F | ✅ 一致 |
+| `UserServiceWechatLoginTest` | 5 例 / **1F** | 1F | ✅ 一致 |
+| `UserServiceWechatLoginContractTest` | 6 例 / **1F** | 1F | ✅ 一致 |
+| `TeamProfitCronContractTest` | 22 例 / **1F** | 1F | ✅ 一致 |
+| **合计** | **103 例 / 23F+6E / 1S = 29 红** | 29 红 | ✅ **14/14 类逐例一致(零漂移第 21 次)** |
+
+> `BUILD FAILURE`(预期,有红例);`Total time 04:51`(同量级);`testCompile 375 源 0 错`。
+> **口径**:28 红为「R184 增量后承袭值(TaskReview 按 1F)」;本轮定向实测 29 红含 TaskReview 2F(+1 装置浮动),故全站红 55 = 后端 29 + 根级 16 + langgraph 7 + 前端 3,已在 §八 G2 如实标注。
+
+### 4.3 本轮全量探速截断取证(B-184-1 第 2 轮证据链)
+
+| 证据 | 值 |
+|------|-----|
+| 编译 | 主源 2121 / 测试源 375,**0 编译错** |
+| 完成类数 | **13 / 368**(`Tests run:` 计数,全部 config 包小类) |
+| 已用时间 | **8 分钟**(07:16 启动 → 07:26 截断),≈ **1.6 类/分钟** |
+| 宿主负载 | CPU **40%**(R184 为 100%)——**速度未随负载下降改善**,证根因为结构性 |
+| 单类 | 前 13 类均 <1s(config 小类);慢类(GuideRolePermission 455s 等)尚未轮到 |
+| 推算 | 若维持 1.6 类/分钟 → 全量 ≈ **230 分钟(>2.5h)**,比 R184 推算的 184min 更慢 |
+| 处置 | 主动 kill(pid 18124/14148),改「同源码沿用 + 红类定向复验」,**不把截断当全量结论** |
+| 结论 | **B-184-1 持续第 2 轮且未见缓解**(结构性:慢类 @SpringBootTest 重上下文 + 缺 application-test.yml 重跑迁移 + B-170-1/B-156-1 迁移错);CPU 40% 仍 1.6 类/min 排除了「R184 高负载致慢」的单因解释 |
+
+### 4.4 langgraph 红例(7,较 R184 恶化 5 例)
+
+| 例 | 归因 |
+|----|------|
+| `test_auto_tag.py::test_auto_tag_valid_format` | chat 端点 500;日志 `401 Authentication Fails, Your api key: ****ab12 is invalid`(召回记忆/保存记忆失败)+ `429 AgnesAI free rate limit` |
+| `test_auto_tag.py::test_auto_tag_short_content` | 同上(401 + 429) |
+| `test_auto_tag.py::test_auto_tag_empty_content` | 同上(429 RateLimitError 6.87s/8.43s) |
+| `test_intent.py::test_classify_analysis` | `intent_classifier.py:62 意图分类失败: 429 rate limit` → 默认 chat → `assert CHAT == ANALYSIS` 失败 |
+| `test_intent.py::test_classify_recommend` | 同上(429 → 默认 chat) |
+| `test_intent.py::test_classify_mind` | 同上(429 → 默认 chat) |
+| `test_intent.py::test_classify_health` | 同上(429 → 默认 chat) |
+
+- **双因齐发(较 R184 单因 ConnectError 更广)**:① 记忆召回/保存 `401 key ****ab12 invalid` → chat 500(auto_tag 3 红);② **意图分类 `429 AgnesAI 免费用户每日文本配额耗尽`**(request id 时间戳 2026-11-12 23:18 UTC = 本日 07:18 CST)→ intent 全降级默认 chat(intent 4 红);
+- 节点 HEAD `4bf5117b0`(langgraph 目录零源码差异,窗口零提交);`/health` **200/4.4ms**(服务进程活)→ **判环境红(C 类)**,非代码回归;
+- **红例形随配额/凭据漂移**(R184 为 ConnectError、R183 为 429/401)→ 印证「不要沿用上轮红例归因」;
+- `intent` 4 例曾连续 2 轮绿(R183/R184),本轮复红 → **B-142-2 观察由 7/13 回落**(配额耗尽窗口性,非持续)。
+
+### 4.5 B-177-1 第 8 轮复现(pytest 进程不退出)
+
+- summary 已打印 `7 failed, 44 passed in 114.21s`,但 `bash -c`(pid 3402720)与 `.venv/bin/python -m pytest`(pid 3402723)**存活未退出** → 日志无 `EXIT=` 行;
+- 已 `kill -9` 清理,清理后 251 `/health` **200/4.4ms** 正常;`ps | grep pytest` = 0;
+- **第 8 轮复现**(R177 首发、R184 第 7 轮、本轮第 8 轮),佐证「被测进程挂死」而非 shell 引号/MSYS 路径问题。
+
+### 4.6 匿名鉴权探针(G8,本轮实测 6/6)
+
+| 端点 | HTTP | body.code | 判定 |
+|------|------|-----------|------|
+| `POST /api/mind/fortune/data` | 401 | 401 | ✅ |
+| `POST /api/energy/data/current` | 401 | 401 | ✅ |
+| `POST /api/health/plan/generate` | 401 | 401 | ✅ |
+| `POST /api/growth/record/list` | 401 | 401 | ✅ |
+| `POST /api/admin/families/overview` | 401 | 401 | ✅ |
+| `POST /api/huawei-health/status` | 401 | 401 | ✅ |
+
+> B-142-1(曾长期「HTTP 200 + code:400」)**销号维持第 11 轮**。
+
+### 4.7 线上与节点探活
+
+| 目标 | 结果 | 判定 |
+|------|------|------|
+| `GET /admin` | **302**(→登录) | ✅ |
+| `GET /frontend` | **302**(→登录) | ✅ |
+| `GET /` | **404** | ⚠️ B-141-3(与 R184 一致) |
+| `251:4096` | **200** | ✅ G10 |
+| `189:4090` | **200** | ✅ G10 |
+| `204:4090` | **000** | ⚠️ B-95 第 41 轮 |
+| 189 spec blob | `4703d73fb` | ✅ = 本机(跨节点可比) |
+
+---
+
+## 五、五要素问题清单
+
+### 问题 1:B-184-1(P1,第 2 轮持续)后端全量耗时劣化,全量巡检不可行
+
+1. **问题描述**:同源码下 R184 39min 仅 76 类(≈2 类/min);本轮 **8min 仅 13 类(≈1.6 类/min)**,推算全量 ≈230min(>2.5h),比 R184 更慢。本轮宿主 CPU 仅 **40%**(R184 100%),速度不升反降 → **排除单因高负载**,证结构性根因。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/controller/GuideRolePermissionTest.java`(455.5s)、`.../controller/FamilyControllerTest.java`(192.3s)、`.../controller/PaymentControllerTest.java`(136.8s)、`.../controller/GuideFamilyTaskControllerTest.java`(125.9s)、`.../controller/DimensionRegistryTreeTest.java`(114.3s);公共装置侧:`src/test/resources` 缺 `application-test.yml`,每类 `@SpringBootTest` 重建上下文并重跑 `DatabaseInitializer` 全量迁移。
+3. **最优修改方案**:① 慢类降 `@WebMvcTest`/standalone MockMvc(5 类均只测 controller 层);② 落 `src/test/resources/application-test.yml`(H2 + 小连接池)抑制上下文重建与迁移;③ 修 B-170-1/B-156-1 两条迁移语法错;④ 慢类加 `@Timeout` + surefire `forkedProcessTimeoutInSeconds`。
+4. **修改目的**:恢复全量回归 ≤50min 窗口能力,避免每轮「截断 + 沿用」的取证降级。
+5. **能否闭环**:能。复测:修复后连跑 2 轮 `mvn -o -B clean test` 总时长 ≤50min 且类/例数一致。
+
+### 问题 2:B-152-1/2(P0/P1,第 17 轮)CI 排除清单双向失真
+
+1. **问题描述**:`.gitlab-ci.yml` `BACKEND_OBSERVED_CLASSES` 共 **33 类**,与本轮实测 14 红类双向差集:**漏拦 7 类**(GrowthPublicEndpointMappingTest、MembershipPlanPurchaseContractTest、FamilyRemoveMemberContractTest、TaskReviewScP11ContractTest、UserServiceWechatLoginTest、UserServiceWechatLoginContractTest、TeamProfitCronContractTest)、**陈旧 26 类**(已连续多轮全绿仍被排除)→ `backend-blocking-junit` 必然失败,硬门禁覆盖面被人为缩小 26 类。
+2. **测试 bug 点**:`.gitlab-ci.yml:61` `BACKEND_OBSERVED_CLASSES` 字符串(与实测快照脱节,第 17 轮未修)。
+3. **最优修改方案**:以本轮 14 红类为权威快照重建清单(删 26 陈旧 + 加 7 漏拦),CI 增加「清单 ↔ surefire 实测红类」自动差集校验任务。
+4. **修改目的**:恢复 CI 门禁可信度(G11),杜绝双向虚化。
+5. **能否闭环**:能。复测:重建后漏拦 0 + 陈旧 0 且 `backend-blocking-junit` 与实测红类一致。
+
+### 问题 3:B-142-2(P0,第 15 轮,本轮恶化红 2→7)langgraph 上游 LLM 不可达(双因)
+
+1. **问题描述**:251 节点 `/health` 200(4.4ms),但 **① 记忆召回/保存 401 key `****ab12` invalid → chat 500;② 意图分类 429 AgnesAI 免费用户每日文本配额耗尽 → 默认 chat**。pytest **44 过 / 7 红**(R184 为 49/2)。红由 2 恶化至 7(intent 4 例复红 + auto_tag 3 全红),**全环境红**。
+2. **测试 bug 点**:`cfc-langgraph/tests/test_auto_tag.py::test_auto_tag_{valid_format,short_content,empty_content}`、`tests/test_intent.py::test_classify_{analysis,recommend,mind,health}`。
+3. **最优修改方案**:① 运维**轮换 `****ab12` key**(长期 401)+ **升级 AgnesAI 配额**(每日免费额度不足);② 加 `/health/llm` 真实打点上探;③ 对 LLM 依赖用例引入「上游不可达 → skip + `ENV_RED` 标记」,把环境故障与用例红分离。
+4. **修改目的**:消除 AI 五能力整域环境红;让「环境红」与「代码红」在报告层可分离;解除 429/401 对通过率的拖累。
+5. **能否闭环**:能。复测:连续 2 轮 251 实派 51/51 且 `EXIT=0`。
+
+### 问题 4:B-177-1(P1,第 8 轮复现)pytest 打印 summary 后进程不退出
+
+1. **问题描述**:`7 failed, 44 passed in 114.21s` 已打印,但 pid 3402723 存活未退出,`echo EXIT=$rc` 永不执行 → 日志无 `EXIT=` 行。
+2. **测试 bug 点**:`cfc-langgraph` pytest 收尾(线索:`RuntimeWarning: coroutine 'JavaClient._get_client' was never awaited`);派发器 `docs/tdd/tools/dispatch_251_pytest.cjs:49`。
+3. **最优修改方案**:① 产品侧 shutdown 钩子 `await client.aclose()` / `httpx.AsyncClient` `async with`;② 派发器 kick 串加 `timeout -k 10 900` + 单独落盘 `EXIT=124`;③ CI 以「summary 行存在 + 进程已退出」双条件判定。
+4. **修改目的**:使 langgraph 套件可被 CI 自动执行而不挂死,退出码成可信信号。
+5. **能否闭环**:能。复测:kick 后 `ps` 无残留且日志含 `EXIT=0`。
+
+### 问题 5:S-cfc-176 幂等复用分支未生效(P1,第 2 轮,唯一剩余会员购买红例)
+
+1. **问题描述**:`ca56f8699` 实现 `membership.plan.purchase` 后契约 7 例 6 例转绿,剩 `repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate` 仍红:同 plan 重复购买时用例期望**复用既有 pending 订单、不再 insert 新单**,实际 `paymentOrderMapper.insert(...)` 仍被调用(`NeverWantedButInvoked`)。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipPlanPurchaseContractTest.java:201`(`repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate`)。
+3. **最优修改方案**:在 `MembershipService.createOrder`(或 `purchasePlan` 入口)先按 `(familyId, planId, status=PENDING)` 调 `findReusablePendingOrder`,命中则直接返回该订单 DTO 并跳过 `paymentOrderMapper.insert`;仅未命中时新建。注意与 `toOrderDTO` 字段口径一致。
+4. **修改目的**:消除「重复点击购买 → 多张 pending 单 → 重复扣款/对账困难」资损面。
+5. **能否闭环**:能。复测:`mvn -o -B test -Dtest=MembershipPlanPurchaseContractTest` **7/7 全绿**即销号。
+
+### 问题 6:B-156-1(P1,第 10 轮)`nutrition_age_dosage` DDL 与实体三重不一致
+
+1. **问题描述**:`schema.sql:5345-5357` 建表含 `INDEX idx_product (product_id)` 但**无 `product_id` 列** → 每轮上下文启动抛 `SQLSyntaxErrorException: Key column 'product_id' doesn't exist`,`DatabaseInitializer` catch 后仍打「数据表检查完成」→ **表从未创建成功**;实体 `NutritionAgeDosage.java:33-34` 另有 `updateTime` 而 DDL 无 `update_time` 列。
+2. **测试 bug 点**:`cfc-backend/src/main/resources/schema.sql:5345`;当前无任何用例断言该表存在(覆盖缺口)。
+3. **最优修改方案**:① DDL 补 `product_id BIGINT NOT NULL`(或删 `idx_product`);② 补 `update_time DATETIME ...`;③ 补「关键业务表存在性契约测试」。
+4. **修改目的**:消除「DDL 恒失败但无人知晓」静默缺陷面。
+5. **能否闭环**:能。复测:全量日志无 `Key column 'product_id' doesn't exist` + 新增表存在性契约全绿。
+
+### 问题 7:B-170-1(P2,第 7 轮)`activities.approved_count` 迁移语句语法非法
+
+1. **问题描述**:`DatabaseInitializer.java:2261` 的 `UPDATE activities a SET a.approved_count = (SELECT … WHERE r.activity_id = a.id …)` 在 MySQL 非法(`SET a.col` 带别名 + 派生表引用被更新表别名)→ 本轮 `Unknown column 'a.id' in 'where clause'`,该列唯一写入点即此语句 → 持久化列恒 0。
+2. **测试 bug 点**:`cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java:2261`。
+3. **最优修改方案**:改写为 `UPDATE activities SET approved_count = (SELECT COUNT(*) FROM activity_registrations r WHERE r.activity_id = activities.id AND r.status='approved')`,补「审批后计数一致」集成断言。
+4. **修改目的**:消除持久化列恒 0 一致性缺陷。
+5. **能否闭环**:能。复测:日志无 `Unknown column 'a.id'` + 新增断言全绿。
+
+---
+
+## 六、覆盖缺口清单(8 项)
+
+| # | 缺口 | 类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|------|------|------|------|--------------|--------|----------|
+| 1 | 后端全量本轮未跑完 | G1/G2 | 13/368 类探速即截断,改用同源码沿用 | 「368 类逐例」未经本轮独立复现 | 先解 B-184-1 再全量 | **P0** | 耗时 ≤50min 后连跑 2 轮全量 |
+| 2 | langgraph 上游不可达(双因) | G7 | 红 2→7(401 key + 429 配额) | AI 五能力无法验收 | 轮换凭据 + 升级配额 + `/health/llm` 探针 | P0 | B-142-2 连续 2 轮 51/51 |
+| 3 | CI 清单双向失真 | G11 | 漏拦 7 / 陈旧 26(第 17 轮) | 门禁必红且覆盖虚化 | 14 红类快照重建 + 自动差集校验 | P0 | 漏拦 0 + 陈旧 0 |
+| 4 | 契约预期 RED(S-cfc-176 幂等 1 + S-cfc-178 4) | G2/G3 | 1 + 4 维持 | 会员购买幂等分支 / 移除成员缓存重算仍空窗 | 研发补齐后定向复跑 | P1 | 7/7 + 4/4 转绿 |
+| 5 | pytest 进程不退出 | G7/CI | 第 8 轮复现 | CI 挂死 | `await client.aclose()` + `timeout -k` | P1 | 残留 0 + `EXIT=0` |
+| 6 | 根级黑盒环境红 | G2 | 16 红全 ECONNREFUSED 9082 | 黑盒盲区 | 指向线上或本地起 9082 | P2 | 非 5xx 全绿 |
+| 7 | 关键表存在性无断言 | G2 | B-156-1 表从未建成却无人拦 | 静默 schema 缺陷 | `information_schema` 表存在性契约 | P1 | 新增用例全绿 |
+| 8 | 变异/依赖漏洞/SAST | G16 | 无工具/未授权 | 漏洞面未知 | CI 离线缓存 NVD + pitest | P1 | 工具链落地 |
+
+---
+
+## 七、执行档与授权(双档)
+
+- **review 档(本轮执行)**:离线白名单命令——`mvn -o -B clean test`(探速截断)+ 14 红类 `-Dtest=` 定向、两套 Jest、Playwright 浏览器(内网 cfc.iwintrue.com,189/本机已授权)、线上 API 点名 4 文件、匿名鉴权探针、节点探活。
+- **execute 档(本轮无)**:SCA 依赖漏洞扫描、性能压测、DAST/渗透——**未授权未执行**,降级为「测试设计 + 缺口诊断」,不写成已测。
+- **SRS/需求档(本轮零命中)**:specs 201 / test-cases 16 / user-scenarios 11 / `API_REFERENCE.md` 窗口零变更 → 用例零新增(G12 ✅)。
+
+### 7.1 度量口径(B-124/B-32 仍未闭环,双口径并列,与 R184 一致)
+
+| 指标 | 本轮值 | 口径说明 |
+|------|--------|----------|
+| 用例台账 | 表行 **876** / 唯一 TC **308** | `tests/test-cases/*.md` 表格行 vs `TC-<域>-<...>-<NN>` 去重 |
+| 用户场景 | 唯一 **SC 152** | `docs/superpowers/specs/*.md` 显式编号 |
+| 场景→用例映射 | **88 / 152 = 57.9%** | 台账中显式引用 SC 编号 |
+| 可执行锚点 | **100** | 排除 `tests/e2e/api/generated`(253 条脚本化虚高) |
+| 双向命中 / 孤儿 / 空转 | **62 / 38 / 246** | 台账∩锚点 / 有执行无台账 / 有台账无锚点 |
+| **G9 可执行锚点覆盖率** | **20.1%**(62/308) | 严格口径;宽口径(含 generated)277/315 不作门禁 |
+
+---
+
+## 八、门禁结论(Verdict)
+
+**结论:⛔ 不通过(承袭;G1 由 ✅ 回落 ❌——langgraph 环境红恶化使通过率跌破 98% 线)**
+
+| 门禁 | 结果 | 依据 |
+|------|------|------|
+| G1 通过率 | **❌** | **97.99%**(3907/3987;剔 skip **98.61%**)< 98%(差 0.01pct,全因 langgraph 环境红 +5 + TaskReview 装置 +1);注:后端为「同源码沿用 + 定向复验」混合口径 |
+| G2 红例 | ❌ | **55**(后端 29 + 根级 16 + langgraph 7 + 前端 3 预期 RED) |
+| G3 前端 | ⚠️ | 624 口径(609/3/12),3 红全预期 RED(S-cfc-132/133 + AC-2 RED-A7) |
+| G4 管理端 | ✅ | 116/116(17 套件,18.4s) |
+| G5 编译/完整性 | ✅ | 主源 2121 + 测试源 375 **0 编译错**;定向复验 `BUILD FAILURE` 为预期 |
+| G6 浏览器 | ✅ | **28/28 + 2 跳**(189 admin 5/5 EXIT=0;本机 fe 6 / shop 4 / health 13;dx 2 跳) |
+| G7 langgraph | ❌ | **44/51 = 86.3%**(红 7,全环境) |
+| G8 鉴权 | ✅ | 匿名 6 端点 **6/6 = 401** |
+| G9 覆盖锚点 | ❌ | **20.1%**(62/308 严格口径) |
+| G10 双节点 | ✅ | 251(51 例)+ 189(5/5,spec blob `4703d73fb` 与本机一致) |
+| G11 CI 门禁 | ❌ | 漏拦 **7** / 陈旧 **26**(第 17 轮) |
+| G12 SRS 合规 | ✅ | 窗口零变更(R184 已含 §4.50.1 核对),用例零新增 |
+| G13 零漂移 | ⚠️ | **14/14 红类逐例一致**(零漂移第 21 次);TaskReview 维持 2F(B-178-1 装置浮动,非产品回归) |
+| G14 场景映射 | ❌ | **57.9%**(88/152) |
+| G16 安全工具链 | ❌ | 无 SCA/SAST(未授权未执行) |
+
+**变化摘要(vs R184)**:
+1. **负向(本轮主要变化)**:**langgraph 红 2→7**(401 key `****ab12` + 429 AgnesAI 免费配额耗尽双因齐发,intent 4 例复红)→ 通过率 **98.14%→97.99%(-0.15pct)**、**G1 由 ✅ 回落 ❌**;**B-184-1 持续且更慢**(39min/76类→8min/13类,≈1.6 类/min)。
+2. **持平**:14 红类定向**逐例一致(零漂移第 21 次)**;浏览器/两套 Jest/根级/线上 API/匿名 6 端点 401 逐项零漂移;B-156-1、B-170-1、B-152-1/2、B-177-1、B-178-1 仍**未修**(第 10 / 7 / 17 / 8 / 5 轮);S-cfc-176 幂等 1F、S-cfc-178 4F 维持。
+3. **正向**:无(本轮无新闭环项;189 admin 5/5 首轮即绿第 7 轮维持、匿名 401 维持第 11 轮)。
+
+**复评转「通过」条件**:
+1. **B-184-1 修复** → 全量 ≤50min 且连跑 2 轮 368 类/3111 例一致;
+2. **B-142-2 运维处置**(轮换 `****ab12` + 升级 AgnesAI 配额)→ langgraph 连续 2 轮 51/51 + B-177-1 `EXIT=0`;
+3. S-cfc-176 幂等分支补齐 → `MembershipPlanPurchaseContractTest` 7/7 绿;
+4. S-cfc-178 实现 → `FamilyRemoveMemberContractTest` 4/4 绿;
+5. CI 以 14 红类快照重建双向差集(B-152-1/2)→ 漏拦 0 + 陈旧 0;
+6. 根级黑盒改指向(B-36)+ 授权执行 SCA/压测/SAST 且零高危。
+
+---
+
+## 九、下轮前置
+
+**测试侧**
+1. 优先复核 B-184-1:若研发未改慢类/夹具,下轮改用「**按包切片全量(-Dtest 分组)+ 汇总**」策略,保证每轮拿到全量逐例结论,不再截断;同时把「探速截断」阈值写死(≥1.5 类/min 即截断,避免空耗窗口);
+2. 跟踪 S-cfc-176 幂等 / S-cfc-178 实现进度,落地即定向复跑;
+3. 251 派发前先查残留、派后必须核 `EXIT=` 行 + `ps` 残留双判据(B-177-1 第 8 轮教训);
+4. 下轮若 langgraph 红仍随配额漂移,在报告中单列「环境红漂移带」不与代码红混算。
+
+**研发侧(按 P 级排序)**
+1. **P0 B-142-2**:**轮换 `****ab12` key + 升级 AgnesAI 免费配额**(本轮双因齐发,比此前任何一轮更广,已阻碍 G1 达标);
+2. **P0 B-184-1**:5 个慢类降 `@WebMvcTest`/standalone + `application-test.yml` 夹具 + 修 B-170-1/B-156-1 迁移语法错;
+3. **P0 B-152-1/2**:CI `BACKEND_OBSERVED_CLASSES` 按 14 红类快照重建(漏拦 7 + 陈旧 26);
+4. **P1 B-177-1**:pytest 收尾 `await client.aclose()`;
+5. **P1 B-156-1 / B-170-1**:DDL 与迁移语句修正;
+6. **P1 B-162-1**:3 个未入库测试文件(`GrowthPublicEndpointMappingTest` 等)入库,否则 CI 不可见。
+
+---
+
+## 附录 A:本轮命令
+
+```bash
+# 基线
+git fetch origin cfclub                       # -> 58ee58114(=origin,07:14 核验)
+git diff --name-only 6d3564510..HEAD | grep -vE '^(docs/|cfc-web/)'   # 空 => 零源码变更
+
+# 环境探针(SOP 前置)
+/d/jdk1.8.0_25/bin/java -version && /d/maven/apache-maven-3.6.1/bin/mvn -v
+# 节点:189:4090=200 / 251:4096=200 / 204:4090=000;线上 admin/frontend=302、/404;CPU 40%
+
+# 后端全量(探速即截断于 13/368 类,8min,≈1.6 类/min)
+cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 mvn -o -B clean test > ../_r185_backend.log 2>&1
+# (8min 后 kill pid 18124/14148 截断)
+
+# 后端 14 红类定向复验(103 例 / 23F+6E / 1S / 04:51,14/14 类逐例一致)
+mvn -o -B test -DfailIfNoTests=false -Dtest='EnergySystemFlowTest,GrowthPublicEndpointMappingTest,MembershipPlanPurchaseContractTest,FamilyRemoveMemberContractTest,DimensionRegistryMapContractTest,TaskReviewScP11ContractTest,GuideModuleIntegrationTest,OrchestrationEngineTest,OrchestrationIntegrationTest,MembershipPaySwitchTest,PaymentServiceORDRoutingTest,UserServiceWechatLoginTest,UserServiceWechatLoginContractTest,TeamProfitCronContractTest'
+
+# Jest
+cd cfc-web && npx jest --silent            # 116/116(18.4s)
+cd cfc-frontend && npx jest --silent       # 624: 609/3/12(19.4s)
+cd tests && npx jest --silent              # 23: 7/16(3.9s)
+
+# 浏览器(每节点单任务,串行;统一 --output 一次性目录规避 safe-delete 守卫)
+cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --workers=1 --output=../_r185/fe     # 6/6
+cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --project=dx-bridge --workers=1 --output=../_r185/shop  # 4 + 2 跳
+cd tests && npx playwright test -c playwright.config.health.js --workers=1 --output=../_r185/health                         # 13/13
+node docs/tdd/tools/dispatch_189_admin.cjs                                                          # 189: 5/5 EXIT=0
+
+# langgraph@251(kick 内联命令串 + 远端 POSIX 日志路径)
+node _r185_251_lg.cjs kick && node _r185_251_lg.cjs read    # 44 过 / 7 红 / 114.21s;无 EXIT 行 → kill 残留 pid 3402723
+
+# 线上 API(点名 4 文件,避免 990 例误跑)
+cd tests && npx playwright test -c playwright.config.api.js --workers=1 --output=../_r185/api \
+  e2e/api/api-smoke.spec.js e2e/api/nonfunc-security.spec.js \
+  e2e/api/nonfunc-perf-compat.spec.js e2e/api/traceability-p94-p95-c26.spec.js   # 25 过 / 7 跳 / 0 红
+
+# 匿名鉴权 6 端点(全 401)
+```
+
+## 附录 B:本轮取证产物
+
+| 文件 | 内容 |
+|------|------|
+| `_r185_backend.log` | 探速截断全量日志(13 类 / 0 红 / 编译 0 错 / 8min) |
+| `_r185_red_classes.log` | 14 红类定向复验(103 例 / 23F+6E / 1S / BUILD FAILURE / 04:51) |
+| `/tmp/r185_pytest.log`(251) | langgraph 51 例(7 failed / 44 passed / 114.21s,无 `EXIT=` 行) |
+| `_r185/`(fe/shop/health/api) | 浏览器套件输出(一次性目录,规避 safe-delete 守卫) |

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

@@ -1258,3 +1258,24 @@
 | **B-173-1/2(承袭)** | safe-delete / API 990 | 测试/CI | B-173-1 本轮全部 Playwright 套件以独立 config/outputDir 规避,**零触发**;B-173-2 沿用点名 4 文件(25 过 / 7 跳 / 0 红),未误跑 990 例。 | 测试(R184 实测) | 2026-11-13 07:20 | 规避中 |
 | **B-124/B-32(度量口径)** | 锚点/场景口径跨轮不可比 | 测试(P2) | **仍未闭环**。本轮改用显式双口径并在报告 §7.1 固化:台账表行 **876** / 唯一 TC **308** / 场景 **152** / 真实锚点 **100**(排除 generated 253)/ 双向命中 **62 = 20.1%** / 孤儿 38 / 空转 246。历史「13.4%(115/861)」「72.1%(155/215)」与本轮口径不可直接相减。 | 测试 | 2026-11-13 07:20 | 待处理 |
 | **R184 门禁** | 全量 3987 / **3913**(增量后) | 测试 | **不通过(承袭;但 G1 由 ❌ 转 ✅)**。✅**G1 98.14%**(3913/3987,剔 skip 98.76%,增量复验 +6 例后达标,混合口径待全量复核)/G4 116-116/G5 编译 0 错(2121+375)/G6 28-28+2 跳/**G8 6/6 401**/G10 双节点(189 5/5 + 251 51 例)/G12(主窗零变更 + `API_REFERENCE §4.50.1` 已核对、用例零新增);⚠️G3 609-624(3 预期 RED)/G13 13-14 红类逐例一致(TaskReview 1F→2F 装置浮动);❌G2 **49 红**(后端 28 + 根级 16 + lg 2 + fe 3)/G7 49-51(96.1%)/G9 **20.1%**(62/308)/G11 漏拦 7 陈旧 26/G14 57.9%(88/152)/G16 无 SCA。**变化** = 会员购买契约 7F→1F(+6 过)+ langgraph 48→49 → 通过率 97.97%→**98.14%**(+0.17pct),**G1 转 ✅**;**负向** = B-184-1 全量耗时劣化 >2h 致本轮降级为「截断 + 沿用」。 | 测试(R184 闭环) | 2026-11-13 07:20 | 已记录 |
+
+## R185 段(2026-11-13 07:45,新增)
+
+| **B-184-1(第 2 轮,持续且更慢)** | 后端全量耗时劣化 | 研发/测试(P1) | **持续**。本轮 `mvn -o -B clean test` 探速 **8 分钟仅 13/368 类(≈1.6 类/min,推算 >2.5h)**,较 R184 的 2 类/min **更慢**;**宿主 CPU 本轮仅 40%(R184 100%),速度不升反降 → 排除「高负载单因」,证结构性根因**(慢类 `@SpringBootTest` 重上下文 + 缺 `application-test.yml` 重跑迁移 + B-170-1/B-156-1 迁移错)。**后果:全量巡检持续不可行,每轮被迫「截断 + 沿用」。** 建议:慢类降 `@WebMvcTest`/standalone + 落 `application-test.yml` + 修两条迁移错 + surefire `forkedProcessTimeoutInSeconds`。 | 研发/测试 | 2026-11-13 07:45 | 待处理 |
+| **B-142-2(第 15 轮,恶化)** | langgraph 上游 LLM 不可达(双因齐发) | 运维/研发(P0) | **恶化(红 2→7)**。51 例 **44 过 / 7 红 / 114.21s**。红 = auto_tag 3(`valid_format`/`short_content`/`empty_content`,chat 服务端 **401 `****ab12` invalid**→500)+ **intent 4(`classify_analysis`/`recommend`/`mind`/`health`,intent_classifier **429 AgnesAI 免费用户每日文本配额耗尽**→默认 chat)**。`/health` 200/4.4ms 服务活 → 环境红非回归。**429/401 双因齐发为本对象最广一轮;R184 单因(ConnectError)、R183 单因(429/401)漂移印证「红例形随配额」**。观察回落(7/13→配额窗口耗尽)。**急需运维轮换 `****ab12` key + 升级 AgnesAI 配额。** | 运维/研发 | 2026-11-13 07:45 | 待处理(P0) |
+| **B-177-1(第 8 轮,复现)** | 251 pytest 打印 summary 后进程不退出 | 研发/测试(P1) | **复现**。`7 failed, 44 passed in 114.21s` 已打印,但 pid 3402720/3402723 存活未退出 → 无 `EXIT=` 行;已 `kill -9` 清理,清理后 `/health` 200/4.4ms。**第 8 轮佐证「被测进程挂死」非 shell 引号/MSYS 路径问题。** 修法:产品侧 `await client.aclose()` + 派发器 `timeout -k 10 900`。 | 研发/测试 | 2026-11-13 07:45 | 待处理 |
+| **B-178-1(第 5 轮,维持 2F)** | TaskReviewScP11 反射装置浮动 | 测试(P2) | **维持 2F**。`TaskReviewScP11ContractTest` 8 例本轮 **2F**(`permission_handler_mustDeclareReviewerIdentity` + `permission_crossFamilyReview_mustBeRejected`;与 R184 完全相同)。区间 1F~2F 无规则波动,判装置稳定性缺陷(反射注入时序),非产品回归。 | 测试 | 2026-11-13 07:45 | 待处理 |
+| **S-cfc-176(部分闭环,1/7 幂等分支未生效)** | membership.plan.purchase | 研发(TDD/P1) | **维持 1F 第 2 轮**。定向复验实测 `MembershipPlanPurchaseContractTest` **1F/7**,唯一红 `repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate:201`(`NeverWantedButInvoked: paymentOrderMapper.insert`)→ 同 plan 重复购买未复用 pending 单。`findReusablePendingOrder` 已实现但该分支未生效。 | 研发 | 2026-11-13 07:45 | 待处理 |
+| **S-cfc-178(第 4 次入全量,维持 RED)** | family.familyMembers.removeMember 缓存重算 | 研发(TDD/P1) | **维持 4F**(`FamilyRemoveMemberContractTest` 8 例 / 4F),踢出成员后 `users.member_level` 未重算为 FREE。 | 研发 | 2026-11-13 07:45 | 待处理 |
+| **B-156-1(第 10 轮,未修)** | `nutrition_age_dosage` DDL 三重不一致 | 研发(P1) | **未修**。`schema.sql:5345-5357` 仍含 `INDEX idx_product (product_id)` 而无列;本轮全量启动日志仍见 `Key column 'product_id' doesn't exist`。**表从未创建成功**。 | 研发 | 2026-11-13 07:45 | 待处理 |
+| **B-170-1(第 7 轮,未修)** | `activities.approved_count` 迁移语法非法 | 研发(P2) | **未修**。`DatabaseInitializer.java:2261` 仍带别名更新 + 派生表引用被更新表 → `Unknown column 'a.id'`,持久化列恒 0。 | 研发 | 2026-11-13 07:45 | 待处理 |
+| **B-152-1/2(第 17 轮,承袭)** | CI `BACKEND_OBSERVED_CLASSES` 双向失真 | CI(P0/P1) | **延续**。本轮实测权威快照 = **14 红类** vs CI 清单 **33 类** → **漏拦 7 类**(GrowthPublic / MembershipPlanPurchase / FamilyRemoveMember / TaskReviewScP11 / UserServiceWechatLogin ×2 / TeamProfitCron)+ **陈旧 26 类** —— 与本轮完全一致,第 17 轮未修。 | 研发/CI | 2026-11-13 07:45 | 待处理 |
+| **B-162-1(第 12 轮,承袭)** | 3 个测试类未入库却被编译执行 | 治理(P1) | **延续**。`GrowthPublicEndpointMappingTest`(本轮 5E)等 3 文件仍 `??`;`testCompile 375 源`。 | 研发/测试 | 2026-11-13 07:45 | 待处理 |
+| **B-153-1/B-167-1(销号维持第 20 轮)** | 189 admin 偶发/502 | 测试(观察项) | **维持销号**。189 admin **5/5 EXIT=0**(1.2m),spec blob `4703d73fb` 与本机一致 → 跨节点结论可比。 | 测试(R185 实派) | 2026-11-13 07:45 | 已闭(观察维持) |
+| **B-142-1(销号维持第 16 轮)** | 匿名端点鉴权 | 研发(已闭环) | **维持销号**。6 端点 **6/6 = 401**(mind/fortune/data、energy/data/current、health/plan/generate、growth/record/list、admin/families/overview、huawei-health/status)。 | 测试(R185 实测) | 2026-11-13 07:45 | 已闭(观察维持) |
+| **B-36(第 70 轮零漂移)** | 根级黑盒 23 例 16 红 | 测试(P2 环境) | **零漂移**。`cd tests && npx jest --silent` → **7 过 / 16 红**(3.9s),全 `ECONNREFUSED 9082`(9082 未监听)。 | 测试 | 2026-11-13 07:45 | 待处理 |
+| **B-95(第 41 轮)** | `192.168.16.204:4090` 失联 | 运维(P2) | **延续**。204:4090 = **000**;189:4090=200、251:4096=200(本轮均实派成功)。 | 运维 | 2026-11-13 07:45 | 待处理 |
+| **B-DX-1(第 28 轮)** | dx-bridge 端点 404 | 部署/研发(P1) | **延续**。dx 2 例 skip(不假绿);规格明示「仅登记不实现」。 | 部署/研发 | 2026-11-13 07:45 | 待处理 |
+| **B-173-1/2(承袭)** | safe-delete / API 990 | 测试/CI | B-173-1 本轮全部 Playwright 套件以 `--output=_r185/<unit>` 一次性目录规避,**零触发**;B-173-2 沿用点名 4 文件(25 过 / 7 跳 / 0 红)。 | 测试(R185 实测) | 2026-11-13 07:45 | 规避中 |
+| **B-124/B-32(度量口径)** | 锚点/场景口径跨轮不可比 | 测试(P2) | **仍未闭环**。沿用报告 §7.1 显式双口径:台账 876 / TC 308 / 场景 152 / 真实锚点 100 / 双向命中 62 = **20.1%**(与 R184 一致)。 | 测试 | 2026-11-13 07:45 | 待处理 |
+| **R185 门禁** | 全量 3987 / **3907** | 测试 | **不通过(承袭;G1 由 ✅ 回落 ❌)**。✅G4 116-116/G5 编译 0 错(2121+375)/G6 28-28+2 跳/G8 6/6 401/G10 双节点(189 5/5 + 251 51 例)/G12 SRS 零变更;⚠️G3 609-624(3 预期 RED)/G13 **14/14 红类逐例一致(零漂移第 21 次)**、TaskReview 2F 装置浮动;❌**G1 97.99%**(剔 skip 98.61%,差 0.01pct)/G2 **55 红**(后端 29 + 根级 16 + langgraph 7 + fe 3)/G7 44-51(86.3%)/G9 20.1%(62/308)/G11 漏拦 7 陈旧 26/G14 57.9%(88/152)/G16 无 SCA。**变化** = langgraph 红 2→7(401+429 双因,环境红)+ TaskReview 装置 +1 → 通过率 98.14%→**97.99%(-0.15pct)**、**G1 回落 ❌**;B-184-1 持续且更慢(1.6 类/min);其余零漂移。 | 测试(R185 闭环) | 2026-11-13 07:45 | 已记录 |