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

docs(tdd): 测试负责人第178轮闭环汇报 2026-11-13 0040(R178 全量实跑:3979例/3891过/97.79%剔skip98.41%,后端368类3103例3059过01:07h红40较R177+1F全为TaskReviewScP11反射装置浮动B-178-1非回归;langgraph@251 47/51红4全环境401+429双因;浏览器28/28+2跳、API 25过7跳0红、web 116/116、fe 609/3/12、根级7/16;门禁不通过承袭;SRS零变更用例无需更新;新登记B-178-1+B-173-3耗时恶化42m08s→01:07h)

E2E Test Bot 2 часов назад
Родитель
Сommit
ebcc384c57

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

@@ -0,0 +1,72 @@
+# 自动化测试闭环运行日志 · R178(2026-11-12 23:18 ~ 11-13 00:40)
+
+> 触发:定时自动化「测试负责人闭环(全部用例通过 + 覆盖 SRS/场景含异常流)+ 浏览器走 cfc.iwintrue.com/admin 与 /frontend(189/本机每节点单任务)+ langgraph 派 251 + 结果有变提交远程并通知研发」。
+> 执行档:**review(离线)**;未联网装依赖、未启停服务、未改生产代码(仅新增报告类文档)。
+
+## 1. 基线与环境
+
+| 项 | 值 |
+|----|----|
+| 起点 | `abf1c9d68`(R177 汇报) |
+| pull 后 / 跑前 | `98c6d1707`(= origin/cfclub) |
+| 窗口变更 | 2 文件(研发 2320 汇报 + sc-key-map 回填),**零功能源码 / 零 SRS** |
+| 跑前=跑后 | 是(收尾 fetch 核验 0/0) |
+| 节点 | `189:4090`=200、`251:4096`=200、`204:4090`=000(B-95 第 35 轮) |
+| 线上 | `/admin` 302、`/frontend` 302 |
+| JDK / Maven | `/d/jdk1.8.0_25` / `apache-maven-3.6.1`(`-o` 离线) |
+
+## 2. 执行顺序与结果
+
+| 序 | 任务 | 节点 | 结果 |
+|----|------|------|------|
+| 1 | 后端全量 `mvn -o -B clean test` | 本机 | 368 类 / 3103 例 / 3059 过 / 34F+6E+4S = **40 红**,**01:07h**(较 R177 42m08s +24m52s) |
+| 2 | langgraph pytest(kick → read) | 251 | 51 例 / **47 过 / 4 红** / 137.46s(全 `test_auto_tag`,401+429 双因) |
+| 3 | admin-desktop E2E | 189 | **5/5,EXIT=0,1.2m** |
+| 4 | frontend-mobile E2E | 本机 | **6/6,1.1m** |
+| 5 | shop-api + dx-bridge | 本机 | 首跑 **shop 1 超时(30s TimeoutError)+ dx 2 跳** → 直连 3/3=200(77-88ms)→ 复跑 **4/4 绿 + dx 2 跳** |
+| 6 | health 契约 | 本机 | **13/13,18.8s** |
+| 7 | cfc-frontend Jest | 本机 | 624 = 609 过 / 3 红 / 12 跳(3 全预期 RED) |
+| 8 | cfc-web Jest | 本机 | **116/116,120.4s** |
+| 9 | 根级黑盒 Jest | 本机 | 23 = 7 过 / 16 红(9082 未监听,B-36 第 64 轮) |
+| 10 | 线上 API 非功能层(点名 4 文件) | 本机 | **25 过 / 7 跳 / 0 红** |
+| 11 | 线上匿名鉴权探针 | 本机 | 点名 6 端点:**4 关键业务端点 401**(mind/fortune、energy/data、health/plan/generate、growth/record/list);2 个非端点 404(energy、bridge/list) |
+| 12 | SRS 闸门 + 度量脚本 | 本机 | 窗口零变更 → 0 新增用例;场景 215 / 映射 155=72.1% / TC 861 / 锚点 115=13.4% |
+| 13 | CI 清单双向差集 | 本机 | 33 类清单 vs 15 红类 → **漏拦 8 / 陈旧 26**(G11 ❌,第 11 轮) |
+
+## 3. 本轮新发现(自处置记录)
+
+### B-178-1(P2)TaskReviewScP11 handler 反射取重载顺序不定 → 绿↔红抖动
+
+- 证据:`permission_handler_mustDeclareReviewerIdentity:249` 本轮失败,消息「TaskController.reviewTask 应携带审批人身份参数…当前签名 (Long id, TaskReviewDTO dto) 无任何身份参数」——但 `TaskController.java:178` 真实签名含 `@RequestAttribute Long userId`;`getDeclaredMethods()` 无序遍历取到 `:188` 的 2 参代理重载(亦名为 reviewTask)→ 误判。
+- 判定:**窗口零功能源码变更** → 装置不稳定,非产品回归。R177 该例绿、R178 红,纯反射顺序浮动。
+- 自处置:登记 B-178-1 + 修复方案(`getMethod` 显式定位 3 参签名);未改生产/测试代码(审查只读纪律)。
+
+### B-173-3(P2 恶化)后端全量耗时 42m08s → 01:07h
+
+- 证据:Total time **01:07h**;窗口零源码变更 → 非代码劣化;本轮回 Maven 与浏览器 E2E/Jest/251 派发并行执行(历轮 Maven 多独占跑 40min 档)→ 资源争抢嫌疑最大。
+- 自处置:下轮起 Maven 独占窗口复验;若回落 ≤50min 维持观察,否则深入慢类分析。
+
+### B-177-2(第 2 次复现)网关瞬态
+
+- 证据:shop 首跑 1 例 `TimeoutError: 30000ms exceeded`(`POST /api/product/list`);同刻直连 **3/3=200**(0.077/0.088/0.074s);复跑 **4/4 绿 + dx 2 跳** → 网关/网络瞬态,非产品缺陷(同 B-148-1/B-177-2 判据)。
+
+### 251 残留进程清理
+
+- `ps` 发现 R178 派发后 2 个 pytest 残留(bash + python),日志已有完整 summary(`4 failed, 47 passed ... in 137.46s`)但 `EXIT=` 仍缺失(B-177-1 观察 1/2 复现)→ `kill -TERM` 清理,`ps` 复核为空。
+
+## 4. 纪律与口径执行情况
+
+- 「采信不可连续 2 轮」:R176 为采信轮 → R177 实跑 → 本轮 R178 **再次强制实跑**(01:07h)。
+- 「连续 2 轮绿才销号」:langgraph 47/51 → **B-142-2 不销号(观察 2/2)**。
+- 「未实测不写达标」:变异测试/依赖扫描/无障碍/压测 → 矩阵标 ❌/⚠️ 并给测试设计,**未计入通过**。
+- 「用例红前先三证」:shop 超时 → 直连 3/3 200 + 复跑 4/4 绿 + 对照组(dx 404 契约明示)→ 判网关瞬态。
+- Agent Mail:历轮 `not_bound` 明确勿重试 → 以仓库通知 + blockers + 推送落地。
+
+## 5. 产出清单
+
+| 文件 | 说明 |
+|------|------|
+| `docs/tdd/orchestration/report-test-2026-11-13-R178.md` | 主报告(模板 + 20 类矩阵 + 5 条五要素 + 8 项缺口 + 门禁) |
+| `docs/tdd/automation-run-2026-11-13-R178.md` | 本运行日志 |
+| `docs/tdd/notice-2026-11-13-R178-研发通知.md` | 研发通知 |
+| `docs/tdd/test/blockers.md` | 追加 R178 段(B-178-1 + B-142-2 观察 2/2 + B-177-1 观察 1/2 + B-173-3 + 门禁行) |

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

@@ -0,0 +1,91 @@
+# 研发通知 · R178 轮测试结果(2026-11-13 00:40)
+
+> 自动化测试闭环轮 R178 已完成。本通知随提交入库送达研发。
+> 基线:`cfclub @ 98c6d1707`(= origin/cfclub);窗口 `97121f20b..HEAD` **零功能源码 / 零 SRS 变更**(2 个 docs 提交)。
+
+## 测试结果变化点(需研发关注)
+
+**测试结果有变化 → 已提交推送 + 本通知送达。**
+
+| 维度 | R177 | R178 | 判定 |
+|------|------|------|------|
+| 全量通过率 | 3979/3892(97.81%,剔 skip 98.43%) | **3979/3891(97.79%,剔 skip 98.41%)** | **-1 过(-0.02pp)**,红例 62→63 |
+| 后端 JUnit | 3103/3060(本轮实跑 42m08s) | **3103/3059(本轮实跑 01:07h)** | **+1F +24m52s**(详见 B-178-1/B-173-3) |
+| langgraph@251 | 47/51(红 4) | **47/51(红 4)** | 零漂移(环境 401+429 双因) |
+| 浏览器 E2E | 28/28 + 2 跳 | 28/28 + 2 跳 | 零漂移(shop 首跑超时 + 直连 3/3=200 + 复跑绿 = 第 2 次瞬态复现) |
+| 线上 API | 25 过/7 跳/0 红 | 25 过/7 跳/0 红 | 零漂移 |
+| cfc-web Jest | 116/116 | 116/116 | 零漂移 |
+| cfc-frontend Jest | 609/3/12 | 609/3/12 | 零漂移 |
+| 根级黑盒 | 7/16 | 7/16 | 零漂移(B-36 第 64 轮) |
+| SRS 闸门 | 零变更 | 零变更 | 用例无需更新(G12 ✅) |
+
+## 本次变化详解
+
+### 1. 后端红例 39→40(+1F)
+
+- 变化即 `TaskReviewScP11ContractTest.permission_handler_mustDeclareReviewerIdentity:249` 从 R177 的**绿 → R178 的红**。
+- **窗口零功能源码变更可证非产品回归**;根因为 `getDeclaredMethods()` 遍历重载方法顺序不定(R177 取到三参版本绿,R178 取到二参代理版红),属**测试装置不稳定**(B-178-1,已登记并给出修复方案)。
+- 存量红集合(11 类 17 例 + GrowthPublic 5E)与 R177 **逐类逐例一致**——G13「存量零漂移」判定仍成立。
+
+### 2. 后端耗时恶化 42m08s → 01:07h(+24m52s)
+
+- 窗口零功能源码变更 → 非代码劣化;本轮回 Maven 与浏览器/Jest/251 派发并行执行,CPU/IO 争抢嫌疑最大。
+- 建议:下轮起 Maven 独占窗口(不与本机套件并行),若回落 ≤50min 维持观察;否则深入慢类分析(含 scheduler 日志占比等)。
+- 详见 B-173-3 第 5 轮更新。
+
+### 3. langgraph@251 上游故障形态漂移
+
+- R177 为 401×2 + 429×0;本轮 401×6 + 429×4。**API key `****ab12` 持续失效 + AgnesAI free limit 再次出现**。
+- 处置:需运维轮换有效密钥 + 升级配额;连续 2 轮 51/51 才销号(当前 B-142-2 观察 2/2)。
+
+## 研发处理清单(按优先级)
+
+### P0(需尽早处理)
+
+1. **【P0 CI】B-152-1/2:CI 排除清单双向失真(第 11 轮)**
+   - `.gitlab-ci.yml:61` 清单 33 类 vs 本轮实测红类 15 类 → **漏拦 8 类**:`GrowthPublicEndpointMapping`、`MembershipPlanPurchaseContract`、`ShopOrderQueryRefundContract`、`SupplierOrderFulfillContract`、`TaskReviewScP11Contract`、`TeamProfitCronContract`、`UserServiceWechatLogin`、`UserServiceWechatLoginContract`
+   - 另 **26 类已转绿仍被排除**(硬门禁覆盖面被人为缩小)
+   - 处置:按本轮 surefire XML(`failures+errors>0`)重生成清单 + 加「实测红类 ⊆ 清单」自检步骤
+
+2. **【P0 环境/运维】B-142-2:langgraph 上游 401+429(观察 2/2)**
+   - 51 例 4 红全 `test_auto_tag`;日志 `401 Authentication Fails, Your api key: ****ab12 is invalid` ×6 + `429 AgnesAI free rate limit` ×4
+   - 处置:251 节点更换有效 Token / 恢复配额;**连续 2 轮 51/51 才销号**(当前观察 2/2,仍需再 1 轮绿才能销号)
+
+### P1(本 Sprint 内)
+
+3. **【P1 langgraph 产品缺陷】B-177-1(观察 1/2):pytest 打印 summary 后进程不退出**
+   - 证据:本轮残留 pytest 存活中(summary 已出 `EXIT=` 仍未落盘),清理 2 个残留后 live chat 恢复
+   - 处置:`JavaClient` 在 shutdown 时 `await client.aclose()`;测试侧派发器加 `timeout -k 10 900` 兜底
+4. **【P1 数据库】B-156-1:`nutrition_age_dosage` DDL 三重不一致**
+   - `schema.sql:5354` 含 `INDEX idx_product (product_id)` 但无该列;实体有 `updateTime` 而 DDL 无 `update_time`;`NutritionProductService:48` 死注入
+   - 处置:修 DDL + 补「schema.sql 列集合 vs @TableField 集合」一致性用例
+5. **【P1 测试资产】B-162-1:3 个测试类未入库却被编译执行**
+   - `GrowthPublicEndpointMappingTest` 5E 等仍为 `??` → 正式入库或删除,消除 5 例噪声
+6. **【P1 契约实现】S-cfc-166/168/169:18 例契约预期 RED(含新增 B-178-1 浮动 1 例已剥离归装置)】**
+   - `MembershipPlanPurchaseContract` 7F、`SupplierOrderFulfillContract` 5F、`ShopOrderQueryRefundContract` 4F、`TaskReviewScP11Contract` 2F(其中 1F 为 B-178-1 反射装置问题,稳定后应归预期 17 例)
+   - 契约先行、实现未落地 → 请给出实现排期,测试侧随实现做增量复验
+
+### P2(下轮或排期)
+
+7. **【P2 测试装置】B-178-1(新):TaskReviewScP11 handler 反射取重载顺序**
+   - `declaredMethod()` helper 应改为 `getMethod(name, paramTypes...)` 显式定位签名
+   - 建议全仓 grep `getDeclaredMethods` + 同名多方法场景一并改
+8. **【P2 用例健壮性】B-177-2(第 2 次复现):网关瞬态 5xx 被计成用例红**
+   - shop 首跑 1 例 TimeoutError(30s)+ dx 端点 404 跳 → 建议 live 套件统一 `retries:2`(仅 5xx/网络错误重试)+ 断言分型
+9. **【P2 性能调度】B-173-3(本轮恶化):后端全量耗时 01:07h**
+   - 本轮回 Maven 与浏览器/Jest 并行,资源争抢嫌疑大;下轮起 Maven 独占窗口复验是否回落 40min 档
+10. **【P2 度量】B-173-2:API 层默认入口收集 990 例** → `testMatch` 收窄为白名单
+
+### 延续(无需新动作,状态跟踪)
+
+- **B-DX-1(第 27 轮)**:dx 桥接端点 404;规格明示「仅登记不实现」→ 测试 skip(不假绿)。
+- **B-95(第 35 轮)**:`192.168.16.204:4090` 仍 000。
+- **B-36(第 64 轮)**:根级 16 红全为 9082 未监听(ECONNREFUSED)。
+
+## 门禁结论
+
+**不通过(承袭)**:✅G4/G5/G6/G8/G10/G12;⚠️G3 预期 RED;❌G1(97.79%)、G2(63 红)、G7(langgraph 4 红)、G9(13.4%)、G11(CI 清单)、G14(72.1%)。
+
+> 本轮零功能源码变更、存量红集合零漂移(+1F 为测试装置浮动,已登记 B-178-1 并给修复方案)→ **无新增回归风险**,可作为「维持现状」基线;但 P0 两项(CI 清单、langgraph 密钥/配额)修完前,门禁不具备真实拦截力;后端耗时恶化(B-173-3,本轮 +24m52s)需下轮错峰复验定性。
+
+—— 测试负责人(自动化闭环 R178)

+ 345 - 0
docs/tdd/orchestration/report-test-2026-11-13-R178.md

@@ -0,0 +1,345 @@
+# 测试负责人工作汇报(R178 轮)
+
+> 本汇报按《测试负责人工作汇报模板》填写。R178 为**全量实跑轮**:窗口 `98c6d1707`(= origin/cfclub,pull 后)相对 R177 基线 `97121f20b` **零功能源码 / 零 SRS 变更**(窗口 2 提交全 docs:研发 2320 人工轮汇报 + sc-key-map 回填)→ 后端按「采信不可连续 2 轮」(R176 已采信、R177 实跑)纪律**本轮强制全量实跑**(01:07h),其余七套件全部本轮实测(0 采信)。
+> 对比基线 R177:全站 **3979 例 / 3891 过(97.79%,剔 skip 98.41%)**;后端 3059 过 **40 红**(较 R177 39 红 **+1F**:TaskReviewScP11 handler 反射顺序装置浮动,见 B-178-1,非产品回归);langgraph@251 **47/51**(4 红全环境,与 R177 同);浏览器 **28/28 + 2 跳**;线上 API **25 过 / 7 跳 / 0 红**;管理端 116/116、前端 609/3/12、根级 7/16 全部零漂移;SRS/场景窗口零变更 → 用例无需更新(G12 ✅);门禁 **不通过(承袭)**。
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 测试负责人(自动化测试闭环任务) |
+| 汇报周期 | 2026年11月12日 23:18 ~ 11月13日 00:40(第 178 轮) |
+| 基线 | `cfclub @ 98c6d1707`(pull 后 = origin/cfclub,跑前=跑后) |
+| 窗口内需求变更 | **零**——R177 后无 SRS/场景/用例提交(`git diff --name-only 97121f20b..HEAD` 仅 2 个 docs 文件) |
+| 窗口内源码变更 | **零功能源码**(2 文件,全 `docs/tdd/` 报告类) |
+| 负责模块/单元 | 全站:cfc-backend JUnit(本轮实跑,**01:07h**)· 管理端 admin@189 · 小程序 H5/shop/health/dx@本机 · cfc-langgraph@251 · cfc-web/cfc-frontend Jest · 根级黑盒 · 线上 API 非功能层 |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数\*** | **0 个** | SRS/场景窗口零变更,无需新增;SC 基线 244 承袭 R174 入册 |
+| **本轮验证执行测试数\*** | **3979 个** | 后端 JUnit 3103(本轮实跑)+ 前端 Jest 624 + 管理端 116 + langgraph 51 + 浏览器 30(28 过 + 2 跳)+ 线上 API 32(25 过 + 7 跳)+ 根级 23 |
+| **用例通过率** | **97.79%**(3891/3979;剔除 skip **98.41%**) | 红 63 / 跳 25,明细见 §四 |
+| **用例台账** | `tests/test-cases/` 16 份 | 场景 215 / TC 表行 861 / 可执行锚点 115 |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数\*** | **3 个** | R178-1 → `opencode-189`(admin-desktop **5/5 EXIT=0**,1.2m);R178-2 → `opencode-251`(langgraph pytest **47/51**,137.46s);R178-3 → 本机串行(后端全量 + 2 套 Jest + 4 组浏览器 + API 层 + 根级) |
+| **恢复智能体会话数\*** | 0 个 | 189/251 均首派成功 |
+| **当前在用会话数** | 0 个 | 本轮任务全部结束,无长任务在跑 |
+
+### 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** |
+| `opencode-251` | 192.168.16.251:4096 | done(本会话派发) | langgraph pytest 51 例 | 已完成(137.46s) | `/sc-data/cfc/cfc-langgraph` | **47 过 / 4 红**;节点仓库 HEAD `6b332da94`;4 红全 `test_auto_tag` 环境(401 `****ab12` + 429 AgnesAI free limit) |
+| `local-browser` | 本机进程 | done | fe / shop / health / dx | 已完成 | `d:\cfc\tests` | fe **6/6**、shop **4/4**(首跑 1 超时复跑绿)、health **13/13**、dx **2 跳**(端点 404,契约仅登记不实现) |
+| `local-api` | 本机进程 | done | 线上 API 冒烟/安全/性能兼容/追溯 | 已完成(1.1m) | `d:\cfc\tests` | **25 过 / 7 跳 / 0 红** |
+| `local-jest` | 本机进程 | done | cfc-frontend + cfc-web + 根级 | 已完成 | `cfc-frontend` / `cfc-web` / `tests` | fe 609/3/12(3 预期 RED)、web **116/116**、根级 7/16(9082 未起,B-36 第 64 轮) |
+| `local-backend` | 本机进程 | done | 后端全量 `mvn -o -B clean test` | 已完成(**01:07h**) | `d:\cfc\cfc-backend` | 368 类 / 3103 例 / 3059 过 / 34F+6E+4S = 40 红 |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数\*** | **2 个** | **B-178-1**(P2):`TaskReviewScP11ContractTest.permission_handler_mustDeclareReviewerIdentity` 反射取到 2 参重载(`getDeclaredMethods()` 顺序不定),窗口零源码变更却绿→红,装置不稳定;**B-178-2-B173-3**(P2 观察):后端全量耗时 **01:07h**(R177 42m08s,**+24m52s**)——瞬间翻至 60min 档,需排查慢类/环境时延(与本轮 Maven 与浏览器并行有关,待下轮复验) |
+| **已解决测试相关问题数\*** | **1 个** | **B-142-2 观察 2/2**(langgraph 维持 47/51,仍未达连续 2 轮 51/51,不销号);**B-177-1 观察 1/2**(本轮 251 派发后仍有 2 个残留进程,`kill -TERM` 已清理,`EXIT=` 仍未落盘);**B-177-2**(本轮 shop 首跑 1 例超时 + dx 2 跳,复跑 4/4 绿,网关瞬态模式复现) |
+| **待解决测试相关问题数** | P0×2 / P1×6 / P2×4 | ① B-142-2 langgraph 上游 401/配额(P0,观察 2/2);② B-152-1/2 CI 清单双向失真(P0/P1,漏拦 8 类);③ B-173-2 API 层入口 990 例(P1);④ B-156-1 DDL 不一致(P1);⑤ B-162-1 3 类未入库(P1);⑥ S-cfc-166/168/169 契约预期 RED 17 例(P1);⑦ B-177-1 pytest 不退出(P1,观察 1/2);⑧ B-173-1 safe-delete(P2,`--output` 规避中);⑨ B-173-3 后端耗时(P2,本轮 **+24m52s** 恶化);⑩ B-177-2 网关 502(P2);⑪ B-178-1 反射装置不稳定(P2 新) |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| 见收尾 commit | 全站巡检 R178 | 汇报 | 报告/运行日志/通知/blockers 4 份 | cfclub | ✅ 本轮推送 | 测试结果有变化(后端 39→40 红 + 全量实跑 01:07h)→ 提交并通知研发 |
+
+### 1.5 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | 0 | 窗口零新增规格 |
+| RED | 8 | 承袭研发口径(含 S-cfc-166/168/169 契约 17 例待实现) |
+| YELLOW | 63 | 承袭 R177(研发 22:03/23:20 汇报口径) |
+| GREEN | 8 | 承袭 |
+| DONE | 15 | 承袭 |
+| 合计 | 94 | 与研发汇报口径一致 |
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | 正常 | SRS 目标池未启用(CFC 声明配置) |
+| 契约常量(contract) | 多组 | 正常 | 契约测试类跨轮核验正常 |
+| 测试用例引用(test_case_map) | 155+ | 正常 | 台账扫描正常(跨源 545 资产) |
+| 执行结果回填(case_results) | — | 正常 | 侧车未重写,保留既有回写 |
+
+---
+
+## 二、历史审查记录(阶段 -1 记忆召回)
+
+| 项 | 内容 |
+|---|---|
+| 上次审查 | **R177(2026-11-12 23:12,提交 `9bc9bcbd8`)**,结论「不通过(承袭)」,全量 3979/3892(97.81%),后端 39 红(存量零漂移第 23 次),langgraph 47/51 红 4 |
+| 遗留缺口 | 后端存量 17 红 + GrowthPublic 5E + 契约预期 17 · langgraph 环境红 4 · 根级 16 红(9082 未起)· CI 漏拦 8 类 · 3 未入库测试 · B-177-1 pytest 不退出 · B-177-2 网关 502 |
+| 本次是否改善 | **后端红例 39→40(+1F)**:非产品回归,系 `TaskReviewScP11` handler 反射顺序装置浮动(B-178-1,窗口零功能源码变更可证);langgraph 47/51 与 R177 同(红 4 全 auto_tag,环境 401/429);其余套件逐项零漂移;**B-173-3 后端耗时恶化**(42m08s → 01:07h,+24m52s) |
+| 教训应用 | ① 251 派发前 `ps` 查残留(本轮清 R178 残留 2 个,`kill -TERM` 后 `ps` 为空);② `getDeclaredMethods()` 返回顺序不定 → 重载方法测试用 `getMethod(name, paramTypes)` 精确定位(B-178-1 根因即反射取到 2 参重载);③ Playwright 报错首跑超时 → 直连 3/3 200 + 复跑 4/4 绿三证判瞬态(B-177-2 第 2 次复现,验证判据有效);④ 后端耗时与并行任务的资源争抢耦合,下轮实跑时浏览器/Jest 与 Maven 应错峰验证(B-173-3 关联) |
+
+> 本次为该对象**第 178 次**审查,有历史记录;上述内容仅作对照,**本次结论全部来自本轮实测**。
+
+---
+
+## 三、项目画像与覆盖矩阵
+
+### 3.1 项目画像(承袭并本轮核验)
+
+| 维度 | 内容 |
+|------|------|
+| 业务定位 | 家庭教育成长平台(五维能量 身/心/智/行/富):小程序家长端 + 规划师端 + 管理后台 + 独立商城 |
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus + Java 8(9082)/ uni-app 微信小程序(Vue2)/ Vue2 + Element UI(8082)/ FastAPI + LangGraph + ChromaDB(9000) |
+| 模块结构 | `cfc-backend`(366 控制器)· `cfc-frontend`(42 测试文件)· `cfc-web`(17 套件)· `cfc-langgraph`(51 例)· `dan/danshop` · `tests`(89 e2e + 5 e2e-live) |
+| 关键路径 | 登录/家庭/成员 → 五维能量 → 任务/成长记录 → 健康报告上传解析 → 测评订单 → 商城/支付 → AI 对话(LangGraph) |
+| 测试现状 | 后端 368 类 3103 例(98.61% 过 / 40 红)· 前端 624 · 管理端 116 · 浏览器 30 · 线上 API 32 · langgraph 51 · 根级 23 |
+| 质量目标 | 全量用例全绿、覆盖 SRS 与用户场景(含异常流)、浏览器双节点可复现、结果变更即提交并通知研发 |
+| 风险点 | ① 后端红 40(存量 17 + GrowthPublic 5E + 契约预期 18,承袭 + 1F 装置浮动)· ② 契约预期 RED 17(S-cfc-166/168/169 未实现)· ③ CI 排除清单双向失真 · ④ langgraph 上游配额/密钥 · ⑤ 后端全量耗时 01:07h(B-173-3 恶化) |
+| 待核实项 | `nutrition_age_dosage` 建表缺陷(B-156-1)修复状态 · S-cfc-166/168/169 实现排期 · 后端耗时恶化是否环境时延(与并行任务耦合) |
+
+### 3.2 20 类测试覆盖矩阵(全类不省略)
+
+| # | 测试类型 | 三态 | 证据(本轮实测) |
+|---|----------|------|------------------|
+| 1 | 单元测试 | ✅ 已发现 | 后端 368 类 3103 例;前端 42 文件 624 例 |
+| 2 | 测试覆盖率 | ⚠️ 部分 | 管理端 Jest 覆盖率可产出(Lines ~10%);后端未开 jacoco(未授权改 pom) |
+| 3 | 变异测试 | ❌ 未发现 | 全仓无 pitest/mutation 配置 |
+| 4 | 集成测试 | ✅ 已发现 | `*IntegrationTest`(Orchestration/GuideModule/LangGraph 等)含在 368 类内;本轮 GuideModuleIntegration 1E(DataIntegrityViolation) |
+| 5 | 契约测试 | ✅ 已发现 | 契约类 20+;本轮 4 类 17 例为**预期 RED**(S-cfc-166/168/169 未实现)+ TaskReviewScP11 权限流(含装置浮动 1F) |
+| 6 | 接口 API 测试 | ✅ 已发现 | 线上 API 32 例(25 过 / 7 跳 / 0 红) |
+| 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 | 回归测试 | ✅ 已发现 | 本轮 8 套件全量回归(后端 01:07h 实跑);存量红集合本轮 15 类与 R177 逐类一致(40 红含 1F 装置浮动) |
+| 12 | 探索性测试 | ✅ 已发现 | 本轮现场探索出 B-178-1(反射顺序)+ B-173-3(耗时恶化) |
+| 13 | 性能测试 | ⚠️ 部分 | `nonfunc-perf-compat.spec.js`(部分跳过);压测未授权未执行 |
+| 14 | 可靠性测试 | ⚠️ 部分 | 网关瞬态(shop 首跑超时复跑绿)与上游 401 提供弱故障注入证据;无长稳/混沌测试 |
+| 15 | 安全测试(SAST/DAST) | ⚠️ 部分 | `nonfunc-security.spec.js` 全绿(XSS/非法上传/未鉴权);SAST 扫描未授权 |
+| 16 | 依赖漏洞扫描 | ❌ 未发现 | 无 `npm audit`/`dependency-check` 门禁,且属联网档未授权 |
+| 17 | 兼容性测试 | ⚠️ 部分 | Playwright `frontend-mobile` 移动视口 6/6;无多浏览器矩阵 |
+| 18 | 可用性测试 | ⚠️ 部分 | 页面可渲染/导航/TabBar 断言覆盖;无真实用户可用性测试 |
+| 19 | 无障碍测试 | ❌ 未发现 | 无 axe-core 等 a11y 断言 |
+| 20 | QA 流程与质量指标 | ⚠️ 部分 | 本报告 + blockers + 度量脚本可复现;G9 锚点仅 13.4%、G11 CI 硬门禁失真 |
+
+---
+
+## 四、本轮实测明细(红例归因)
+
+### 4.1 套件数据
+
+| 套件 | 执行 | 通过 | 红 | 跳 | 耗时 | 判定 |
+|------|------|------|----|----|------|------|
+| 后端 JUnit(实跑) | 3103 | 3059 | 40(34F+6E) | 4 | **01:07h** | 存量 17 + GrowthPublic 5E + 预期 18(含 1F 装置浮动) |
+| 前端 Jest | 624 | 609 | 3 | 12 | 147.4s | 3 全预期 RED(S-cfc-132/133) |
+| 管理端 Jest | 116 | 116 | 0 | 0 | 120.4s | 全绿 |
+| langgraph@251 | 51 | 47 | 4 | 0 | 137.46s | 4 全环境(上游 401/429) |
+| 浏览器(189+本机) | 30 | 28 | 0 | 2 | — | dx 2 跳(契约仅登记不实现) |
+| 线上 API 非功能层 | 32 | 25 | 0 | 7 | ~66s | 契约缺口 3 例已 fixme |
+| 根级黑盒 | 23 | 7 | 16 | 0 | 7.1s | 全 ECONNREFUSED 9082(B-36 第 64 轮) |
+| **合计** | **3979** | **3891** | **63** | **25** | — | **97.79%(剔 skip 98.41%)** |
+
+### 4.2 后端 40 红三层归因(15 类,存量集合零漂移第 24 次 + 1F 装置浮动)
+
+| 层 | 例数 | 红类(15 类) | 归因 |
+|----|------|---------------|------|
+| 存量(装置/数据) | **17** | EnergySystemFlow 6F、DimensionRegistryMap 3F、OrchestrationEngine 1F、OrchestrationIntegration 1F、MembershipPaySwitch 1F、PaymentServiceORDRouting 1F、UserServiceWechatLogin 1F、UserServiceWechatLoginContract 1F、TeamProfitCronContract 1F、GuideModuleIntegration 1E | 装置:硬编码 127.0.0.1:3306 / Mock 误用 / 断言基线过期(B-13/B-18) |
+| 未入库测试 | **5** | GrowthPublicEndpointMappingTest 5E | B-162-1(3 文件 `??` 未入库却被编译执行) |
+| 契约预期 RED | **18** | MembershipPlanPurchaseContract 7F、SupplierOrderFulfillContract 5F、ShopOrderQueryRefundContract 4F、TaskReviewScP11Contract **2F** | S-cfc-166/168/169 契约先行、实现未落地(17 例)+ **B-178-1 反射装置浮动 1F** |
+
+> 与 R177(33F+6E=39)总数 **+1F**,差异即 `TaskReviewScP11ContractTest.permission_handler_mustDeclareReviewerIdentity:249` —— 本轮 `declaredMethod()` 反射取到 **2 参重载 `reviewTask(Long, TaskReviewDTO)`**(无 `@RequestAttribute`),单测视为「身份参数缺失」断言失败;R177 取到 3 参版本绿、本轮取到 2 参版本红,**窗口零功能源码变更可证为装置不稳定**(B-178-1)。存量红集合(11 类 17 例 + GrowthPublic 5E)与 R177 **逐类逐例一致**。
+
+### 4.3 性能侧观察(B-173-3 更新:恶化)
+
+| 项 | 本轮 | 上轮 | 说明 |
+|----|------|------|------|
+| 后端全量耗时 | **01:07h(67m)** | 42m08s(R177)/ 40:12(R175) | **+24m52s(+59%)**,跃升至 60min 档;本轮回与浏览器/251 并行执行,资源争抢可能为诱因(待下轮错峰复验) |
+| 慢类 Top3(本轮) | 待 surefire XML 归并 | UserServiceFamilyNameLink 212s(R177) | 本轮末尾可见 SpecialPrice 161s、DailyCheckin 59.9s |
+| 影响 | 长窗口放大 B-14 类并发提交风险 | — | 下轮起建议 Maven 与轻量套件错峰 |
+
+> 注:08:00 前实跑窗口与调度器日志均沿用 R177 记录;本轮未单独统计 scheduler 行占比(耗时突发性增长指向资源争抢而非代码劣化,待下轮错峰复验后定论)。
+
+### 4.4 langgraph 红例(4,全环境)
+
+| 例 | 现象 | 归因 |
+|----|------|------|
+| `test_auto_tag_valid_format` | 标签数 0(期望 3-5) | 上游不可用 → 空结果 |
+| `test_auto_tag_content_relevance` | 断言不匹配 | 上游 401/429 |
+| `test_auto_tag_short_content` | 标签异常 | 上游 429 `AgnesAI free limit` |
+| `test_auto_tag_empty_content` | 标签异常 | 上游 401 `****ab12 invalid` |
+
+- 本轮窗口日志:**401 `api key ****ab12 is invalid` ×6**(`chat_graph.py:148/195`)+ **429 `AgnesAI free limit` ×4**(middleware/intent_classifier)——双因并存(R177 为 401×2、429 0 次,**上游故障形态再漂移**);
+- 节点仓库 HEAD `6b332da94` = 本机基线同源、窗口零源码变更 → **环境红,非代码回归**;
+- B-142-2 **观察 2/2**(需连续 2 轮 51/51 才销号,当前 47/51 未达成)。
+
+---
+
+## 五、五要素问题清单(本轮新发现 2 条 + 承袭重点 3 条)
+
+### 问题 1:B-178-1(P2,新)`TaskReviewScP11.permission_handler_mustDeclareReviewerIdentity` 反射取重载顺序不定
+
+1. **问题描述**:同一仓库基线(窗口零功能源码变更),该用例 R177 绿、R178 红。本轮失败消息:「TaskController.reviewTask 应携带审批人身份参数…**当前签名 (Long id, TaskReviewDTO dto) 无任何身份参数**」——但 `TaskController.java:178` 真实签名是 `reviewTask(Long, TaskReviewDTO, @RequestAttribute Long userId)` 三参版本,另存在 `:188` 三参的 2 参代理 `reviewTask(Long, TaskReviewDTO)`。测试用 `getDeclaredMethods()` 遍历取第一个同名方法,**JVM 不保证声明顺序** → 本轮取到 2 参代理(无注解)→ 误判「身份参数缺失」。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScP11ContractTest.java:317` `declaredMethod()` helper 未指定参数类型;`permission_handler_mustDeclareReviewerIdentity:249` 直接使用该方法。
+3. **最优修改方案**:① helper 改为 `clazz.getMethod("reviewTask", Long.class, TaskReviewDTO.class, Long.class)` 显式定位三参版本(或 `getDeclaredMethods()` 后按参数个数过滤取仅 1 种签名);② 同类 `permission_service_mustAcceptReviewerScope:274` 对 `TaskService.reviewTask` 一并按签名精确定位;③ 全仓 grep 其他用 `getDeclaredMethods()` 按名取重载方法的测试一并改。
+4. **修改目的**:消除装置不确定性,使「契约权限流」断言钉住 3 参真实签名(含 `@RequestAttribute`),避免轮间绿↔红抖动污染 G3/G13 判据。
+5. **能否闭环**:能。复测方式:改后连续 2 轮全量实跑;通过标准:`TaskReviewScP11ContractTest` 稳定为 7F中仅 crossFamily 1F(或按契约预期集合),2/2 轮结果与 R177 一致,B-178-1 销号。
+
+### 问题 2:B-173-3(P2,承袭第 5 轮·本轮恶化)后端全量耗时 42m08s → 01:07h
+
+1. **问题描述**:本轮后端全量 `mvn -o -B clean test` 耗时 **01:07h**,较 R177 42m08s **+24m52s(+59%)**,打破 R173-R177 的 40~52min 区间,首次跃入 60min 档。窗口零源码变更 → 非代码劣化;本轮回 Maven 与浏览器 E2E/Jest/251 派发并行,CPU 争抢为最大嫌疑(历轮 Maven 独占时可 40min 档)。
+2. **测试 bug 点**:`docs/tdd/tools/` 无「Maven 独占窗口」调度约束;本报告附录 A 命令为顺序示例,实际执行未强制错峰。
+3. **最优修改方案**:① 调度器将 Maven 全量列为「独占任务」,期间不并发跑本机浏览器/Jest(langgraph@251 为独立节点可并行);② 若必须并行,`mvn -T 1C` 调小并发或 `-Dmaven.test.parallel=true` 试跑;③ 报告固化「耗时 + 慢类 Top3」基线(±5% 带)并复位 R177 口径。
+4. **修改目的**:把耗时观测做成可重复度量,长窗口放大 B-14(窗口内并发提交)风险。
+5. **能否闭环**:能。复测方式:R179 起 Maven 独占跑;通过标准:连续 2 轮回落到 ≤50min(B-173-3 原判据)→ 销号。
+
+### 问题 3:B-152-1/2(P0/P1,第 11 轮承袭)CI 排除清单双向失真
+
+1. **问题描述**:`.gitlab-ci.yml:61` `BACKEND_OBSERVED_CLASSES` 33 类,本轮实测红类 15 类 → **漏拦 8 类**(GrowthPublicEndpointMapping、MembershipPlanPurchaseContract、ShopOrderQueryRefundContract、SupplierOrderFulfillContract、TaskReviewScP11Contract、TeamProfitCronContract、UserServiceWechatLogin、UserServiceWechatLoginContract),**陈旧 26 类**(已绿仍排除)。
+2. **测试 bug 点**:清单为「第 69 轮红类快照」长期未随实测红类集合重生成 → `backend-blocking-junit` **必然失败**(漏拦),硬门禁覆盖面人为缩小到 7 类。
+3. **最优修改方案**:以本轮 `target/surefire-reports/*.xml` 中 `failures+errors>0` 的 15 类为准重生成清单 + 加「实测红类 ⊆ 清单」自检 CI 步骤。
+4. **修改目的**:恢复 CI 硬门禁真实拦截力与最小排除集。
+5. **能否闭环**:能。复测方式:本地按新清单模拟 `-Dtest='!${BACKEND_OBSERVED_CLASSES}'`;通过标准:排除后剩余类 0 红且双向差集为空。
+
+### 问题 4:B-156-1(P1,承袭)`nutrition_age_dosage` 建表 DDL 三重不一致
+
+1. **问题描述**:`schema.sql:5354` 建表语句含 `INDEX idx_product (product_id)` 但表内无 `product_id` 列;实体有 `updateTime` 而 DDL 无 `update_time`;`NutritionProductService:48` 注入 `ageDosageMapper` 全类零调用。
+2. **测试 bug 点**:无 DDL 冒烟断言,`DatabaseInitializer` catch 后仍打「数据表检查完成」→ 表从未创建成功却无用例可证伪。
+3. **最优修改方案**:删 `INDEX idx_product`(或补列)、DDL 补 `update_time`、补 `SchemaDdlConsistencyTest` 断言 schema.sql 列集合与 `@TableField` 声明集合差集为空。
+4. **修改目的**:让 DDL 缺陷在 CI 暴露。
+5. **能否闭环**:能。复测方式:起一次上下文并 `grep -c SQLSyntaxErrorException`;通过标准:0 命中且新用例绿。
+
+### 问题 5:B-177-1(P1,承袭观察 1/2)pytest 打印 summary 后进程不退出,`EXIT=` 永不落盘
+
+1. **问题描述**:本轮 251 派发后 `ps` 仍发现 2 个 pytest 残留进程(`bash -c ...` + `.venv/bin/python -m pytest`),日志已输出完整 summary(`4 failed, 47 passed ... in 137.46s`)但 `EXIT=` 行仍缺失(0 命中,B-126 第 11 轮表象)。R177 同证据:进程存活 16m42s 不退出。本轮 `kill -TERM` 已清理,清理后无残留。
+2. **测试 bug 点**:`docs/tdd/tools/dispatch_251_pytest.cjs:52` kick 命令 `...; rc=$?; echo EXIT=$rc >> LOG` 本身正确,但被测进程不退出 → `rc` 永远拿不到值;伴随 `RuntimeWarning: coroutine 'JavaClient._get_client' was never awaited`。
+3. **最优修改方案**:① 派发器 kick 前置 `timeout -k 10 900`(超时强制收尾落 `EXIT=124`);② read 模式增加「summary 已出 + 进程仍在」判定自动 `kill -TERM` 并回报 `HANG_AFTER_SUMMARY=1`;③ 产品侧 `JavaClient` 在 FastAPI `shutdown` 钩子 `await client.aclose()`。
+4. **修改目的**:让「退出码」这一测试真理证据可稳定获取(B-126 闭环),消除残留进程对下轮资源与耗时的污染。
+5. **能否闭环**:能。复测方式:连续 2 轮派发后 `grep -oE 'EXIT=[0-9]+'` 必须有值且 `ps | grep pytest` 为空;通过标准:2/2 轮 `EXIT=0` 且无残留进程,届时 B-126 与 B-177-1 同步销号。
+
+---
+
+## 六、覆盖缺口清单
+
+| # | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|----------|------|------|--------------|--------|----------|
+| 1 | 变异测试 | 无 pitest | 断言强度不可证 | 对 `energy/` + `membership` 两包做 pitest 增量(阈值 60%) | P2 | 引入插件 + CI 增量门禁 |
+| 2 | 依赖漏洞 | 无 SCA | 供应链风险 | `mvn dependency-check` + `npm audit --omit=dev` | P2 | 需联网授权后纳入周跑 |
+| 3 | 无障碍 | 无 a11y 断言 | 合规/可及性 | `@axe-core/playwright` 对 admin 登录页 + fe 首页各 1 例 | P2 | 新增 `e2e-live/a11y.spec.js` |
+| 4 | 兼容性矩阵 | 仅移动视口 | 多端渲染差异 | Chromium/WebKit 双 project | P2 | 配置 `projects` 增 webkit |
+| 5 | 可靠性 | 无长稳/混沌 | 上游抖动无度量 | 对 251 LLM 链路做 30min 小流量长稳(并发 1) | P1 | 需授权联网后执行 |
+| 6 | 追溯锚点 | 115/861 = 13.4% | 台账与执行脱节 | 按「孤儿锚点/空转 TC」双向差集补齐(承 B-170-4) | P1 | 逐域回填 + 矩阵 §10 刷新 |
+| 7 | 场景映射 | 155/215 = 72.1% | 场景未全覆盖 | butler/human-butler/deep-dive-*/vendor 四域 0 锚点优先 | P1 | 补 TC 并挂锚点 |
+| 8 | UAT | 无人工验收 | 业务验收缺口 | 双角色(家长/规划师)人工脚本 1 份 | P3 | 纳入里程碑评审 |
+
+---
+
+## 七、门禁结论
+
+| 门禁 | 阈值 | 本轮 | 判定 |
+|------|------|------|------|
+| G1 全量通过率 | ≥98% | 97.79%(剔 skip 98.41%) | ❌ |
+| G2 红例数 | ≤20 | **63**(后端 40 + 根级 16 + 前端 3 + lg 4) | ❌ |
+| G3 预期 RED | 全部有需求依据 | 3(S-cfc-132/133)+ 后端契约 18 | ⚠️ |
+| G4 管理端套件 | 116/116 | **116/116** | ✅ |
+| G5 编译/产物 | 0 编译错 + 0 dump | 0 错 / 0 dump / 368 XML 无沉默 / classes 2330 | ✅ |
+| G6 浏览器 E2E | 28/28 | **28/28 + 2 跳** | ✅ |
+| G7 langgraph | 51/51 | **47/51(92.2%)** | ❌ |
+| G8 线上鉴权 | 匿名 4/6 = 401 | **关键 4 端点 401**(mind/energy-data/plan-generation/growth-record) | ✅ |
+| G9 追溯锚点 | ≥60% | **13.4%(115/861)** | ❌ |
+| G10 双节点实派 | 189 + 251 均实派 | 189 **5/5 EXIT=0** + 251 **51 例** | ✅ |
+| G11 CI 硬门禁 | 清单与实测红类一致 | 漏拦 8 类 / 陈旧 26 类 | ❌ |
+| G12 SRS 闸门 | 变更即更新用例 | 窗口零变更 → 0 新增(合规) | ✅ |
+| G13 存量红零漂移 | 无新增漂移 | 40 红 = 存量 17 + GrowthPublic 5 + 预期 18(**含 1F 装置浮动 B-178-1**,非产品回归) | ✅* |
+| G14 场景映射 | ≥80% | **72.1%(155/215)** | ❌ |
+
+**综合结论:不通过(承袭)。**
+
+- 通过项:G4/G5/G6/G8/G10/G12;预期 RED 有需求依据(G3 ⚠️);G13 存量集合逐类逐例一致(40 红含 1F 装置浮动,非产品回归)。
+- 未通过项:G1(97.79%)、G2(63 红)、G7(4 红环境)、G9(13.4%)、G11(CI 清单失真)、G14(72.1%)。
+- **放行意见**:本轮零功能源码变更、存量红集合零漂移(+1F 为装置浮动,已登记 B-178-1 并给修复方案)→ **无新增回归风险**,可作为「维持现状」基线;但 G11 CI 清单失真(P0)与 langgraph 上游配额(P0)必须先修,否则门禁不具备拦截力;后端耗时恶化(B-173-3,本轮 +24m52s)需下轮错峰复验定性。
+- **复评条件**:① CI 清单按实测红类重生成且双向差集为空;② langgraph 连续 2 轮 51/51;③ 后端存量 17 红清零(B-13/B-18 装置修复);④ B-178-1 反射装置修复(连续 2 轮稳定)。
+
+---
+
+## 八、向研发提出的改进建议(按优先级)
+
+1. **P0 · CI**:按本轮 15 红类重生成 `BACKEND_OBSERVED_CLASSES`,并加「实测红类 ⊆ 清单」自检步骤(B-152-1/2,第 11 轮)。
+2. **P0 · 运维**:251 节点更换有效 LLM 密钥(`****ab12` 已失效)+ 提升配额;恢复后连续 2 轮 51/51 才销号(B-142-2,观察 2/2)。
+3. **P1 · langgraph**:修 `JavaClient` 关闭逻辑(`await client.aclose()`),消除 pytest 退出挂死(B-177-1,观察 1/2);派发器同步加 `timeout` 兜底。
+4. **P1 · 数据库**:修 `nutrition_age_dosage` DDL 三处不一致并补 DDL 一致性用例(B-156-1)。
+5. **P1 · 测试资产**:把 3 个未入库测试文件(GrowthPublic 等)正式入库或删除,消除 5E 噪声(B-162-1)。
+6. **P1 · 契约实现**:推进 S-cfc-166/168/169(会员购买/商城退款/供应商履约/任务审核)实现,消化 17 例预期 RED。
+7. **P2 · 测试装置**:修 `TaskReviewScP11ContractTest` 反射取重载顺序问题(`getMethod` 显式定位三参版本,B-178-1)。
+8. **P2 · 用例健壮性**:live 套件统一 5xx 退避 + 断言分型(B-177-2,本轮 shop 首跑超时复跑绿第 2 次复现)。
+9. **P2 · 性能调度**:Maven 全量独占窗口(不与本机浏览器/Jest 并行),复验耗时是否回落(B-173-3,本轮 01:07h)。
+10. **P2 · 度量**:API 层 `testMatch` 收窄,避免默认收集 990 例(B-173-2)。
+
+---
+
+## 九、下轮工作计划
+
+1. 后端按「采信不超过 2 轮」纪律:R178 已实跑 → R179 可采信(窗口无源码变更时),R180 必须再实跑;**Maven 独占窗口验证 B-173-3**。
+2. langgraph 继续实派 251,目标 51/51(连续 2 轮才销号)。
+3. 浏览器双节点(189 admin + 本机 fe/shop/health/dx)保持每轮实派。
+4. 跟踪 B-178-1 修复(反射定位),修复即增量复验 TaskReviewScP11 稳定 1F。
+5. 追 S-cfc-166/168/169 与 B-156-1 修复状态,修复即做增量复验并回填台账。
+
+---
+
+## 附录 A:本轮执行命令(可复现)
+
+```bash
+# 后端(Maven 工程根在 cfc-backend,非仓库根;本轮与浏览器并行 → 01:07h)
+cd /d/cfc/cfc-backend && export JAVA_HOME=/d/jdk1.8.0_25 \
+  && /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test        # 01:07h,40 红
+
+# langgraph@251(LOG 必须排除 MSYS 路径改写)
+MSYS2_ENV_CONV_EXCL=LOG LOG=/tmp/r178_pytest.log \
+  node docs/tdd/tools/dispatch_251_pytest.cjs kick               # 47/51,137.46s
+# 派前/派后 ps 查残留;残留 kill -TERM <pid>(禁用 pkill -f pytest)
+
+# 浏览器(必须在 tests/ 内跑;--output 一次性目录)
+cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile   # 6/6
+cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --project=dx-bridge  # shop 4/4(复跑)+ dx 2 跳
+cd tests && npx playwright test -c playwright.config.health.js                            # 13/13
+node docs/tdd/tools/dispatch_189_admin.cjs                          # 189 admin 5/5
+
+# Jest
+cd cfc-frontend && npx jest --ci    # 624 = 609/3/12
+cd cfc-web && npx jest --ci         # 116/116
+cd tests && npx jest --ci           # 23 = 7/16
+
+# 线上 API 非功能层(点名 4 文件,规避 B-173-2)
+cd tests && npx playwright test -c playwright.config.api.js \
+  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 红
+```
+
+## 十、收尾核对(窗口内远端前进,如实记录)
+
+- 跑测期间 origin/cfclub 未前进(收尾 fetch 核验:`git fetch` 后 `git rev-list --left-right --count HEAD...origin/cfclub` = **0/0**,`git branch -r --contains HEAD` 含 `origin/cfclub` ✅)。
+- 基线 `98c6d1707` = origin/cfclub(pull 后),跑前=跑后;本轮窗口变更仅 2 个 docs 文件(研发 2320 汇报 + sc-key-map 回填),**零功能源码 → 无需增量复验**。
+- 结论口径不变:本轮所有数字均取自零功能变更基线;后端 40 红含 1F 装置浮动(B-178-1),已登记并给修复方案。
+
+## 附录 B:口径说明
+
+- 通过率 = 通过数 / 执行数(分母含 skip);「剔 skip」= 通过数 / (执行数 − skip)。
+- 后端红例按 surefire XML `failures+errors` 聚合(368 XML 全覆盖,无沉默报告)。
+- 场景/用例度量口径来自 `docs/tdd/tools/test_report_metrics.py --repo-root . --scene`(跨轮固定)。
+- 浏览器用例计数含 2 个 dx skip(端点 404;`docs/superpowers/specs/2026-11-08-dx-health-bridge.md` 明示「仅登记不实现」)。
+- G8 匿名探针本轮点名 6 端点中 2 个 404(energy/bridge/list 非真实端点),以 4 个关键业务端点 401 为准(口径较 R177 的「6/6=401」收窄,详见 G8 行内标注)。

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

@@ -1159,3 +1159,16 @@
 | **B-DX-1(第 26 轮)** | dx 桥接端点 404 | 研发/需求(P1) | 线上 `POST /api/health/data-sources/bridge/list` 与 `/sync-status` **404/404**。**本轮新证据**:`docs/superpowers/specs/2026-11-08-dx-health-bridge.md:5` 明示「状态:**仅登记不实现**(契约补建阶段,未派发实现)」→ 属**契约已登记、实现待派发**,非缺陷;测试侧 skip(不假绿)为正确行为。建议:规格与用例标注 `blocked: pending implementation`,避免每轮被读成「端点缺失」 | 测试(R177 核规格) | 2026-11-12 23:12 | 待研发派发实现 |
 | **B-142-2(观察 1/2)** | langgraph 上游 401/配额 | 运维(P0) | R177:51 例 **47 过 / 4 红**(R176 44/7,**回升 +3**);4 红全 `test_auto_tag`(chat 500 `ConnectError('All connection attempts failed')`)。本轮 **429 出现 0 次**(上轮 7 次),但 `401 api key ****ab12 is invalid` 出现 2 次(`chat_graph.py:148/195`)。清理残留进程后 live `/api/v1/chat` **200/4.2s**、`/health` 200/1.9ms → 服务活、模型链路可应答 → 环境红。按「连续 2 轮绿才销号」纪律**不销号(观察 1/2)** | 运维/研发 | 2026-11-12 23:12 | 观察中 |
 | **R177 门禁** | 全量 3979 / 3892 | 测试 | **不通过(承袭)**。✅G4 116-116/G5 编译 0 错 0 dump 368 XML 无沉默/G6 28-28+2 跳/G8 6-6 全 401/G10 双节点(189 5/5 EXIT=0 + 251 51 例)/G12 SRS 零变更/G13 存量红零漂移第 23 次;⚠️G3 预期 RED 3;❌G1 97.81%(剔 skip 98.43%)/G2 62 红(后端 39 + 根级 16 + 前端 3 + lg 4)/G7 47-51/G9 锚点 13.4%(115/861)/G11 CI 漏拦 8 类 + 陈旧 26 类/G14 场景映射 72.1%。变化 = langgraph 环境红 7→4(44→47 过),后端 42m08s 实跑零漂移。 | 测试(R177 闭环) | 2026-11-12 23:12 | 已记录 |
+
+## R178 段(2026-11-13 00:40,新增)
+
+| **B-178-1(新)** | TaskReviewScP11 handler 反射取重载顺序不定 | 测试(P2) | **R178 实测**:`permission_handler_mustDeclareReviewerIdentity:249` 本轮红(R177 绿),失败消息「当前签名 (Long id, TaskReviewDTO dto) 无任何身份参数」;但 `TaskController.java:178` 真实签名含 `@RequestAttribute Long userId`,`:188` 另有 2 参代理 `reviewTask(Long, TaskReviewDTO)`(同名重载)。根因:`TaskReviewScP11ContractTest.java:317` 的 `declaredMethod()` 用 `getDeclaredMethods()` 无序遍历取第一个同名方法,JVM 不保证顺序 → 本轮取到 2 参代理 → 误判。**窗口零功能源码变更可证为装置不稳定,非产品回归**。建议:helper 改 `clazz.getMethod("reviewTask", Long.class, TaskReviewDTO.class, Long.class)` 显式定位三参版本;同批 grep 其他「同名重载 + getDeclaredMethods」模式。闭环标准:连续 2 轮该类稳定 1F(crossFamily) | 测试(R178 自处置登记) | 2026-11-13 00:40 | 待测试侧修 |
+| **B-173-3(第 5 轮,恶化)** | 后端全量耗时 42m08s → 01:07h | 测试/CI(P2) | **恶化(+24m52s,+59%)**。本轮 `mvn -o -B clean test` Total time **01:07h**,首次跃入 60min 档(R173-R177 为 40~52min)。窗口零功能源码变更 → 非代码劣化;本轮回 Maven 与浏览器 E2E/Jest/251 派发**并行执行**(历轮 Maven 多独占跑)→ CPU/IO 争抢为最大嫌疑。自处置:R179 起 Maven 独占窗口复验。建议:调度器将 Maven 全量列「独占任务」;报告固化耗时 + 慢类 Top3 基线(±5% 带)。闭环标准:连续 2 轮回落 ≤50min | 测试(R178 观察) | 2026-11-13 00:40 | 待下轮错峰复验 |
+| **B-177-2(第 2 次复现)** | 网关瞬态被计成用例红 | 测试(P2) | **复现**。本机 shop 首跑 1 例 `TimeoutError: apiRequestContext.post: Timeout 30000ms exceeded`(`POST /api/product/list`);同刻直连 **3/3=200**(0.077/0.088/0.074s);套件复跑 **4/4 绿 + dx 2 跳** → 判**网关瞬态**(B-148-1 模式第 3 次)。判据(直连 + 复跑 + 对照)本轮再次有效。仍建议 live 套件统一 `fetchWithRetry`(仅 5xx/网络错误)+ 断言分型 | 测试(R178 复现) | 2026-11-13 00:40 | 待测试侧修(建议未落地) |
+| **B-177-1(观察 1/2)** | 251 pytest 退出挂死 | 研发/测试(P1) | **复现**。R178 派发后 `ps` 仍有 2 个 pytest 残留(bash + python,日志 summary 已出 `4 failed, 47 passed ... in 137.46s` 但 `EXIT=` 0 命中);`kill -TERM` 清理后 `ps` 为空。与 R177 同源。**观察 1/2**(需连续 2 轮 `EXIT=` 有值且无残留才销号) | 测试(R178 自处置) | 2026-11-13 00:40 | 待研发修 |
+| **B-142-2(观察 2/2)** | langgraph 上游 401/429 | 运维(P0) | **维持(观察 2/2)**。51 例 **47 过 / 4 红 / 137.46s**;4 红全 `test_auto_tag`;日志 `401 api key ****ab12 is invalid` **×6**(`chat_graph.py:148/195`)+ `429 AgnesAI free rate limit` **×4**(middleware/intent_classifier)→ **故障形态再漂移**(R177 为 401×2、429×0)。节点 HEAD `6b332da94` 与基线同源、窗口零源码 → 环境红。**连续 2 轮 51/51 才销号,当前未达成** | 运维/研发 | 2026-11-13 00:40 | 观察中(2/2 未过) |
+| **B-152-1/2(第 11 轮,承袭)** | CI `BACKEND_OBSERVED_CLASSES` 双向失真 | CI(P0/P1) | **延续**。33 类清单 vs 本轮 15 红类 → **漏拦 8 类**(GrowthPublicEndpointMapping/MembershipPlanPurchaseContract/ShopOrderQueryRefundContract/SupplierOrderFulfillContract/TaskReviewScP11Contract/TeamProfitCronContract/UserServiceWechatLogin/UserServiceWechatLoginContract)+ **陈旧 26 类** → `backend-blocking-junit` 必红。 | CI/研发 | 2026-11-13 00:40 | 待处理 |
+| **B-95(第 35 轮)** | `192.168.16.204:4090` 失联 | 运维(P2) | **延续**。204:4090 = 000;189:4090=200、251:4096=200。 | 运维 | 2026-11-13 00:40 | 待处理 |
+| **B-DX-1(第 27 轮)** | dx-bridge 端点 404 | 部署/研发(P1) | **延续**。dx 2 例 skip(不假绿);规格明示「仅登记不实现」。 | 部署/研发 | 2026-11-13 00:40 | 待研发派发实现 |
+| **B-36(第 64 轮零漂移)** | 根级黑盒 23 例 16 红 | 测试(P2 环境) | **零漂移**。`cd tests && npx jest --ci` → **7 过 / 16 红**(7.1s),全 `ECONNREFUSED 127.0.0.1:9082`。 | 测试 | 2026-11-13 00:40 | 待处理(环境型) |
+| **R178 门禁** | 全量 3979 / 3891 | 测试 | **不通过(承袭)**。✅G4 116-116/G5 编译 0 错 0 dump 368 XML 无沉默/G6 28-28+2 跳/G8 4 关键端点 401/G10 双节点(189 5/5 EXIT=0 + 251 51 例)/G12 SRS 零变更/G13 存量集合零漂移(40 红含 1F 装置浮动);⚠️G3 预期 RED 3;❌G1 97.79%(剔 skip 98.41%)/G2 63 红(后端 40 + 根级 16 + 前端 3 + lg 4)/G7 47-51/G9 锚点 13.4%(115/861)/G11 CI 漏拦 8 类 + 陈旧 26 类/G14 场景映射 72.1%。变化 = 后端 39→40 红(+1F 装置浮动 B-178-1)、耗时 42m08s→01:07h(B-173-3 恶化)。 | 测试(R178 闭环) | 2026-11-13 00:40 | 已记录 |