فهرست منبع

test(R163): 测试负责人全站巡检汇报——langgraph 环境红 10→8 正向改善+契约批次 S-cfc-142~151 首验 96 例(78绿/18红全预期)

- 浏览器三节点: admin@189 5/5(第7轮绿) + 本机 fe 6/shop 4/health 13 + dx 2 skip
- cfc-frontend 609/3/12、cfc-web 116/116 零漂移
- langgraph@251 51例=43过/8红(红10→8改善, 全环境401/429, 零代码回归)
- 契约批次定向 surefire 首验 11类96例=78绿/18红, 18红全部与研发声明预期RED吻合
- 后端 src 零变更 → 采信 R162 全量(353类/2974例/2945过/25红/4跳)
- 门禁: 承袭不通过(无恶化), 3914例 97.75% 通过率, 变化项正向 → 通知研发
E2E Test Bot 1 روز پیش
والد
کامیت
2756292918

+ 44 - 0
docs/tdd/notice-2026-11-12-R163-研发通知.md

@@ -0,0 +1,44 @@
+# 研发通知 · 2026-11-12 R163 测试负责人巡检
+
+> 依据《测试负责人工作汇报模板》输出。本轮测试结果与上一轮(R162)存在变化(langgraph 10 红 → 8 红,正向改善;契约批次 S-cfc-142~151 首验入库),按纪律提交远程并通知研发。
+
+## 一、结论摘要
+
+- **三节点实测**:189 admin 浏览器 **5/5**(首轮即绿,B-153-1 维持第 7 轮);本机 frontend 6/6 + shop 4/4 + health 13/13 全绿 + dx 2 skip、cfc-web 116/116、cfc-frontend 609/3/12(3 红为 S-cfc-132/133 预期 RED);**251 langgraph pytest 51 例全执行 = 43 passed / 8 failed(497.33s)**。
+- **契约批次 S-cfc-142~151 定向首验(本轮核心新增)**:干净基线(origin/cfclub)worktree 实跑 11 类 **96 例 = 78 绿 / 18 红**。**18 红全部与研发提交声明预期 RED 逐条吻合**(143×3 / 144×3 / 145×2 / 147×4 / 148×2 / 150×1 / 151×3),**零意外红、零代码回归**。
+- **变化项(正向)**:langgraph 41/51 → **43/51**,红 10→8(auto_tag 5→4、intent 4→3),全为上游 401/429 环境红自愈,**非代码回归**(cfc-langgraph 窗口内零源码变更)。
+- **无新增代码缺陷回归**:前端/web/浏览器全部零漂移;后端 src 零变更(采信 R162 全量 2945 过/25 红/4 跳)。
+
+## 二、三节点实测明细
+
+| 节点 | 用例集 | 结果 | 用时 |
+|------|--------|------|------|
+| 189:4090(远程) | admin-live UI E2E(TC-A-U01~U05) | **5 passed**(首轮即绿) | 1.9m |
+| 本机 | frontend-live(TC-F-U01~U06) | **6 passed** | 55.2s |
+| 本机 | shop-sort-api(TC-S-U01~U04) | **4 passed** | 6.0s |
+| 本机 | health-contract(TC-H + TC-HP,含 TC-HP-U01~03 匿名 401) | **13 passed** | 5.4s |
+| 本机 | dx-bridge(TC-DX-U01/U02) | 2 skipped(端点 404,B-DX-1) | — |
+| 本机 | cfc-frontend / cfc-web Jest | 609/3/12(预期 RED)· 116/116 | 24.9s / 19.9s |
+| 251:4096(远程) | langgraph pytest(ignore qna/test_chat) | **43 passed / 8 failed(497.33s)** | 8m17s |
+| worktree(本机编译) | 契约批次 S-cfc-142~151 定向 surefire | **78 过 / 18 红(全预期 RED)=96 例** | 39s |
+| 采信(src 零变更) | 后端全量 mvn / 根级黑盒 | 2945/25/4(R162)· 7/16(B-36) | — |
+
+## 三、需要研发/平台侧处理
+
+| 序号 | 事项 | 类型 | 优先级 | 建议 |
+|------|------|------|--------|------|
+| 1 | **langgraph API key `****ab12` 失效(401)+ AgnesAI 免费额度耗尽(429),51 例 8 红(B-142-2 第 10 轮,风向改善但未销号)** | 运维/AI 平台 | **P0** | ① 轮换有效 key;② 升级付费额度;③ 测试侧对 401/429 打 `xfail(strict=False)` 防配额期误报。改善判据:连续 2 轮 51/51 全绿(当前观察 0/3) |
+| 2 | **契约批次 S-cfc-142~151 红例与我方判定一致,待按 TDD 推进** | 研发(TDD) | P1 | 18 红全为声明内预期 RED:143×3 / 144×3 / 145×2 / 147×4 / 148×2 / 150×1 / 151×3;全绿 78 例含 142(6)/146(13)/149(14)/TaskTaskCreate(7)——4 个绿类可优先 mark 推进收尾 |
+| 3 | **langgraph 收集口径差异(51 收集 vs 实跑)** | 研发/测试 | P2 | 251 `--collect-only` 51 例 vs 实跑 51 例一致(本轮口径闭合);B-141-1 qna/test_chat 排除项持续 |
+| 4 | 后端未入库测试文件治理(B-162-1 第 2 轮) | 测试/研发 | P1 | GrowthPublic/JwtInterceptorGrowth/ArticleTags 3 文件仍 `??`,请确认入库或删除 |
+| 5 | CI 排除清单(B-152-1/2)、建表 SQL(B-156-1)、admin 鉴权门(B-142-1,S-cfc-143/144 红例同根) | 研发 | P0/P1 | 均延续,见 blockers.md R163 段 |
+
+## 四、变更感知(SRS/场景)
+
+- `--changes` 窗口(R162 后):SRS / 需求 / specs / API_REFERENCE / test-cases **零提交** → 无新增能力键 → **零新增用例(G12 合规)**。
+- 窗口内合入:S-cfc-142~151 契约 RED 批次 6 新类(+1528/−333)+ 研发汇报 2 + auto bump 2。
+
+## 五、git 证据
+
+- 本轮交付:`docs/tdd/test/automation-run-2026-11-12-R163.md` + `docs/tdd/orchestration/report-test-2026-11-12-R163.md` + `docs/tdd/notice-2026-11-12-R163-研发通知.md` + `docs/tdd/test/blockers.md`(R163 段)+ 台账三件套(discovery/inventory/automation-status)。
+- 提交 → rebase → push `origin/cfclub`(详见报告 §git 证据)。不触碰研发/他人 WIP(工作树 111 项遗留未入库文件零接触)。

+ 165 - 0
docs/tdd/orchestration/report-test-2026-11-12-R163.md

@@ -0,0 +1,165 @@
+# 测试负责人工作汇报(R163 轮)
+
+> 本汇报按《测试负责人工作汇报模板》填写。R163 以基线 diff 判定 src 零变更,故后端全量/根级黑盒采信 R162 实测口径;本轮实跑 = 浏览器三节点(189→admin、本机→fe/shop/health/dx)+ 本机两端 Jest + langgraph@251 实派全量 51 例 + **契约批次 S-cfc-142~151 定向 surefire 首验(96 例,新增纳入)**。勿以模板占位符作为空数据。
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 测试负责人(自动化测试闭环任务) |
+| 汇报周期 | 2026年11月12日 06:00 ~ 06:30(第 163 轮) |
+| 负责模块/单元 | 全站回归:管理端 admin + 小程序 H5 frontend(浏览器 E2E:189→admin、本机→frontend/shop/health/dx)+ cfc-langgraph(251 实派)+ 契约批次 S-cfc-142~151 定向核验(本机 worktree surefire)+ 后端 JUnit 全量/Jest(src 零变更,采信 R162) |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数*** | 0 个 | SRS/场景闸门零命中(`--changes` 窗口 specs/API_REFERENCE/test-cases 零提交),G12 合规;开发窗口合入 S-cfc-142~151 契约 RED 批次(RED 资产非本轮新增用例,本轮完成首验纳入基线) |
+| **本轮验证执行测试数*** | 3914 个(917 实跑 + 2997 采信) | 实跑:admin 5 + fe 6 + shop 4 + health 13 + dx 2skip + fe Jest 624 + web Jest 116 + langgraph@251 51 + 契约批次 96 = 917;采信(src 零变更):后端 2974 + 根级黑盒 23 = 2997 |
+| **用例通过率** | 97.75% | = 3826 PASS ÷ 3914(874 实跑过 + 2952 采信过;70 红 + 18 skip 另计口径见门禁结论) |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数*** | 2 个 | 189 admin 浏览器(`_r163_189_admin.cjs` 实派)+ 251 langgraph pytest(`_r163_251_lg.cjs` 实派 .venv 版,497.33s 全执行) |
+| **恢复智能体会话数*** | 0 个 | 节点串行直跑,无会话中断 |
+| **当前在用会话数** | 0 个 | 所有任务已完成,无活跃浏览器自动化任务(符合「每节点仅一任务」约束) |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| `local-browser`(本机) | 本机进程 | done | frontend/shop/health/dx UI E2E(串行) | 已完成 | d:\cfc\tests | 23 过 / 2 skip,0 失败 |
+| `local-jest` | 本机进程 | done | cfc-frontend / cfc-web Jest | 已完成(24.9s/19.9s) | d:\cfc\cfc-frontend、d:\cfc\cfc-web | fe 609/3/12、web 116/116 |
+| `local-contract`(本机) | 本机进程 | done | 契约批次 S-cfc-142~151 定向 surefire(worktree .wt-r163 干净基线) | 已完成(39s) | .wt-r163/cfc-backend | 11 类 96 例 = 78 过 / 18 预期红 |
+| `opencode-189`(admin 目标节点) | 192.168.16.189:4090 | done | admin-desktop UI E2E | 已完成(1.9m) | C:\code\cfc\tests | 5/5,首轮即绿(B-153-1 维持第 7 轮) |
+| `opencode-251`(langgraph 目标节点) | 192.168.16.251:4096 | done | langgraph pytest 51 例 | 已完成(497.33s) | /sc-data/cfc/cfc-langgraph | 43 过 / 8 红(全环境红,B-142-2 改善) |
+| `local-mvn`(后端全量) | — | 采信 | cfc-backend Maven 全量 | 采信 R162(51:59) | d:\cfc\cfc-backend | src 零变更 → 采信 353 类/2974 例/25 红/4 跳 |
+| `local-root`(根级黑盒) | — | 采信 | 根级黑盒 Jest | 采信 R162 | d:\cfc\tests | 9082 DOWN → 采信 23 例 7 过/16 红 |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数*** | 1 个(B-163-1) | 契约批次 S-cfc-142~151 首验核验登记:11 类 96 例 78 绿/18 红全为研发声明预期 RED,零意外(核验结论类登记,非新代码缺陷) |
+| **已解决测试相关问题数*** | 0 个 | — |
+| **待解决测试相关问题数** | 4 个(P0×1 / P1×2 / P2×1) | ① langgraph 8 红(B-142-2 第 10 轮,改善但未销号);② B-156-1 建表 SQL;③ B-142-1 admin 鉴权门;④ B-162-1 未入库测试文件治理 |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| 本汇报入库后 new_sha | 全站巡检 R163 | 汇报 | 测试文档(docs/tdd + 台账) | cfclub | 提交时 push | 含本汇报 + automation-run + blockers(R163 段) + 研发通知 + 台账三件套 |
+
+> 本轮无 RED/YELLOW/GREEN 阶段推进(无新测试资产入库;契约批次 S-cfc-142~151 为研发 RED 资产,本轮完成首验核验后交回研发按 TDD 推进)。
+
+### 1.5 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | 0 | 需求侧 ⏳ 0 键 |
+| RED | 0 | 无待写红单测键(测试侧) |
+| YELLOW | 0 | 无在途开发 |
+| GREEN | 5 | admin.auth.login / dan.assessment.getActiveMaterial / guide.trainingPlan.getPlanDetail / health.report.createReport / health.report.upload |
+| DONE | 0 | 本轮无归档键 |
+
+> 全局状态机(研发负责人侧口径,第 129 轮):86 键 RED10/YELLOW53/GREEN8/DONE15,任务池契约批次 S-cfc-142~151 在途(本轮实测:142/146/149/TaskTaskCreate 4 类全绿可优先收尾,143/144/145/147/148/150/151 红例为声明内预期 RED)。
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | 正常 | SRS 需求池未启用,合法空 |
+| 契约常量(contract) | 0 | 正常 | 本轮无派单需求,改以契约批次定向核验(S-cfc-142~151) |
+| 测试用例引用(test_case_map) | 1185 | 正常 | 侧车 progress 1185 条未重写 |
+| 执行结果回填(case_results) | 3914 | 正常 | 三节点实测 917 + src 零变更采信 2997 |
+
+---
+
+## 二、向研发提出的改进建议
+
+| 序号 | 建议标题 | 问题描述 | 根因分析 | 建议方案 | 优先级 | 状态 |
+|------|----------|----------|----------|----------|--------|------|
+| 1 | langgraph 上游 LLM 双因(B-142-2 第 10 轮,风向改善) | 51 例 **43 过 / 8 红**(R162 10 红 → R163 8 红,**改善 2 例**):test_analyze 1 + test_auto_tag 4 + test_intent 3。日志实证 **① 401:API key `****ab12` invalid;② 429:`rate_limit_exceeded`(free users 每日文本配额耗尽,限速 1 请求/3 分钟)** | ① 上游 key 失效未轮换;② AgnesAI 免费额度长期耗尽,配额窗口波动致红例集漂移(auto_tag 5→4、intent 4→3 为环境自愈) | 运维轮换有效 key + 升级付费额度;测试侧对 401/429 打 `xfail(strict=False)` 避免配额期误报回归。销号判据:连续 2 轮 51/51 全绿(观察 0/3) | P0 | 待处理(风向改善) |
+| 2 | 契约批次 S-cfc-142~151 首验完成,红例待 TDD 推进 | 定向实测 11 类 96 例 = **78 绿 / 18 红,18 红全部与研发声明预期 RED 逐条吻合,零意外** | 契约能力按设计 RED(权限流/校验缺口/钩子未落地等 7 类根因);78 绿例 = 契约已落地达成 | 研发按 TDD 推进:142(6 绿)/146(13 绿)/149(14 绿)/TaskTaskCreate(7 绿)4 个全绿类优先 mark 收尾;143/144/151 权限流与 B-142-1 鉴权门同根,修复后可一次性转绿 | P1 | 待研发处理(核验完成) |
+| 3 | 后端未入库测试文件治理(B-162-1 第 2 轮) | `GrowthPublicEndpointMappingTest`(5 红)/ `JwtInterceptorGrowthPolicyTest`(0 红)/ `ArticleTagsContractTest`(0 红)仍 `git status ??` 未跟踪,与版本库纯度(346 类)漂移 | 本地工作区遗留测试资产未 add/commit,历轮累积 | 测试/研发确认 3 文件归属:有效则入库(Growth 红例随库评估),无效则删除 | P1 | 待处理 |
+| 4 | 前端 3 个预期 RED 契约测试跟进(S-cfc-132/133) | growthHistory.dayGroupView RED-A7、signature.consignee AC-R1/R2 仍为预期红(较 R162 零漂移) | 对应契约能力尚未由开发实现(RED 状态设计内) | 研发按 S-cfc-132/133 实现后转绿 | P2 | 待处理 |
+
+---
+
+## 三、本轮阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| langgraph LLM 上游 401+429(B-142-2 第 10 轮) | cfc-langgraph 51 例 8 红 | 运维/AI(P0) | **改善 10→8**。key `****ab12` 失效 + 免费额度耗尽;251:9000 `/health` 正常(服务活、仅 LLM 面被掐);红例 = analyze 1 + auto_tag 4 + intent 3 | 运维轮换 key + 升级额度;测试侧 401/429 打 xfail |
+| `nutrition_age_dosage` 建表 SQL 无效(B-156-1 第 4 轮) | 后端 schema 初始化 | 研发(P1) | 延续(34 次建表失败被静默 catch) | 研发修 schema.sql + DatabaseInitializer |
+| `/api/admin/**` 鉴权门缺失(B-142-1 第 15 轮) | 管理端接口安全 | 研发(P1 安全) | 延续;契约 S-cfc-143/144/151 权限流红例同根(admin.article.create/audit/review 越权未拦截) | 研发补鉴权门,可连带消 9 红 |
+| 后端未入库测试文件(B-162-1 第 2 轮) | 后端全量口径漂移 | 测试(P1) | 延续;3 文件仍 `??` | 确认入库或删除 |
+| CI 排除清单(B-152-1/2 第 7 轮未修) | CI 必红误报 | 研发(P0/P1 CI) | 延续;`backend-blocking-junit` 必红仍未解 | 研发修 CI 清单 |
+| 204 节点失联(B-95 第 27 轮) | 204:4090 浏览器自动化节点 | 运维 | 延续。本轮探活 000;189/251 在线 | 运维恢复 204 节点 |
+
+---
+
+## 四、下轮工作计划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
+|--------|--------------|----------|------|
+| 后端全量重跑纳入契约批次 S-cfc-142~151 | 下轮 | — | src 若零变更则继续采信 + 定向核验;若研发有新提交则全量实跑(预期 359 类) |
+| langgraph 实跑复验 | 每轮 | 运维轮换 key/额度 | 401+429 双因消除后目标 51/51,连续 2 轮销号 |
+| 契约批次红例跟进 | 每轮 | 研发 TDD 推进 | 跟踪 143/144/145/147/148/150/151 红例转黄/转绿 |
+| 未入库测试文件归口(B-162-1) | 1 轮内 | 测试/研发确认归属 | 入库或删除,消除口径漂移 |
+| 浏览器 28/28 零漂移维持 | 每轮 | 节点在线 | admin/frontend/shop/health 连续多轮稳定 |
+
+---
+
+## 附录
+
+### 附录 A:本轮新增测试用例明细
+
+无(0 条,SRS 闸门零命中,G12 合规)。
+
+### 附录 B:任务分派与会话恢复明细
+
+| 任务号 | 目标会话标签 | 分派时间 | 分派类型 | 当前状态 | 恢复会话标签 | 恢复原因 | 恢复时间 |
+|--------|--------------|----------|----------|----------|--------------|----------|----------|
+| R163-1 | opencode-189(admin) | 06:03 | 派发(`_r163_189_admin.cjs`) | done(1.9m) | — | — | — |
+| R163-2 | local-browser(本机) | 06:05 | 直跑(串行 frontend→shop→health→dx) | done | — | — | — |
+| R163-3 | local-jest(本机) | 06:06 | 直跑 | done(24.9s/19.9s) | — | — | — |
+| R163-4 | opencode-251(langgraph) | 06:07 | 派发(`_r163_251_lg.cjs` .venv 版,497.33s) | done | — | — | — |
+| R163-5 | local-contract(本机) | 06:16 | 直跑(worktree .wt-r163 定向 surefire 39s) | done | — | — | — |
+
+### 附录 C:新发现问题明细
+
+| 问题 ID | 能力键/任务号 | 问题类型 | 路由去向 | 登记时间 | 处置状态 | 关联 sha |
+|---------|---------------|----------|----------|----------|----------|----------|
+| B-163-1 | 契约批次 S-cfc-142~151 首验 | 测试(TDD 核验) | 研发(按 TDD 推进) | 2026-11-12 06:30 | 核验完成:78 绿/18 红全预期,待研发处理 | — |
+
+---
+
+## 附:实测明细(证据)
+
+| 维度 | 用例集 | 结果 | 用时 | 说明 |
+|------|--------|------|------|------|
+| 浏览器 admin@189 | playwright.config.live.js --project=admin-desktop | **5 passed** | 1.9m | TC-A-U01~U05 全过,首轮即绿(B-153-1 维持第 7 轮) |
+| 浏览器 frontend(本机) | --project=frontend-mobile | **6 passed** | 55.2s | TC-F-U01~U06 全过 |
+| 浏览器 shop(本机) | --project=shop-api | **4 passed** | 6.0s | TC-S-U01~U04 价格排序契约全过 |
+| 浏览器 health(本机) | -c playwright.config.health.js | **13 passed** | 5.4s | TC-H-U01~U10 + TC-HP-U01~U03 鉴权契约 13/13(含匿名 401,B-69 维持销号) |
+| 浏览器 dx(本机) | --project=dx-bridge | **2 skipped** | — | 端点 404(B-DX-1 第 20 轮,不假绿) |
+| cfc-frontend Jest | 本机(cfc-frontend 目录内) | **609 passed / 3 failed / 12 skipped(624 total)** | 24.9s | 与 R162 严格零漂移;3 红为 S-cfc-132/133 已知预期 RED |
+| cfc-web Jest | 本机 | **116 passed / 0 failed** | 19.9s | 零漂移(连续多轮一致) |
+| **langgraph@251** | `.venv/bin/python -m pytest`(51 例收集) | **43 passed / 8 failed(497.33s)** | 8m17s | **较 R162 41/51 改善 2 例(红 10→8)**:auto_tag 5→4、intent 4→3,全为上游 401/429 环境红自愈,**零代码回归**(cfc-langgraph 窗口内零源码变更) |
+| **契约批次 S-cfc-142~151**(worktree .wt-r163 = origin/cfclub 干净基线) | `mvn -o surefire:test -DforkCount=0 -Dtest='{11 类}'` | **78 passed / 18 failed(96 total),18 红全预期 RED** | 34s+5s | 首验:143×3 / 144×3 / 145×2 / 147×4 / 148×2 / 150×1 / 151×3 与研发声明逐条吻合;全绿:142(6)/146(13)/149(14)/TaskTaskCreate(7)/其余部分绿。证据 `.tdd/r163_contract/` |
+| 后端全量 mvn test | cfc-backend(本机) | **2945 passed / 25 failed / 4 skipped(2974 total)= 99.02%** | 采信 R162(51:59) | src 零变更(基线 diff 仅契约测试类)→ 采信 R162 实测口径 |
+| 根级黑盒(本机) | cd tests && npx jest -c jest.config.js | **7 passed / 16 failed(23 total)** | 采信 R162(13.9s) | B-36 第 53 轮(9082 未启动,`fetch failed`) |
+| 线上可达性 | curl /admin /frontend / | 302 / 302 / 404 | — | 正常(R162 同) |
+
+> **变更触发判定(用户规则「测试结果有变化 → 提交远程 + 通知研发」)**:**触发**。① langgraph 41/51 → 43/51(红 10→8,正向改善 2 例);② 契约批次 S-cfc-142~151 首验(96 例)新增纳入基线(78/18 全预期);③ 前端/web/浏览器全部零漂移、后端 src 零变更。→ 已推送 5 件套报告 + 研发通知。
+
+> **门禁结论**:**不通过(承袭 R162)**。双目标均未完全达成:① 所有用例通过 ❌(25 后端红 + 3 前端预期红 + 8 langgraph 环境红 + 16 根级红 + 18 契约预期 RED);② 覆盖全部 SRS+用户场景含异常流 ❌(SRS 池未启用=0 锚点)。但本轮 3914 例 **97.75% 通过、零代码回归**(唯一变化项 langgraph 环境红 10→8 为正向改善;契约批次 18 红全部为研发声明预期 RED),门禁承袭「不通过」但无恶化项。复评条件:langgraph 经 key 轮换/额度升级后 ≥46/51 且连续 2 轮 51/51、契约批次红例按 TDD 推进减除后后端全量回落至 C 预算、未入库文件归口。

+ 91 - 0
docs/tdd/test/automation-run-2026-11-12-R163.md

@@ -0,0 +1,91 @@
+# R163 轮执行日志 · 2026-11-12 06:00~06:30
+
+> 触发:定时自动化 ccb91e89-8b79-496c-b3d8-a98ed7ada63b;角色:测试负责人;全程静默,无人值守。
+> 指令:「浏览器自动化访问 http://cfc.iwintrue.com/admin 与 /frontend;189 与本机可跑浏览器自动化(每节点单任务);langgraph 测试派发 192.168.16.251;测试用例覆盖全部 SRS 与用户场景,SRS/场景变更时更新用例;测试结果有变化时提交远程并通知研发。」
+
+## 一、基线
+
+- 基线 commit:origin/cfclub `e1a648a78`(06:01 研发第 134 轮汇报 + bump);本地 HEAD `3a4663f81`(merge origin/cfclub,含 S-cfc-145 契约测试)。
+- **src 零变更**:`git diff <R162基线> origin/cfclub -- cfc-backend/src(cfc-frontend/cfc-web/cfc-langgraph)` 仅命中 6 个新增契约测试类(S-cfc-143/144/146/147/149/151),**main 代码与前端/ langgraph 源码零变更**。
+- **SRS/场景/用例文档零变更**(G12 合规)→ 不新增用例,不更新既有用例。
+- 远端窗口新增 9 提交:S-cfc-142~151 契约 RED 批次(研发侧 10/10 链上核验已完成)。
+
+## 二、环境探活
+
+| 目标 | 结果 |
+|---|---|
+| http://cfc.iwintrue.com/admin | 302(在线) |
+| http://cfc.iwintrue.com/frontend | 302(在线) |
+| 192.168.16.251:9000 langgraph /health | `{"status":"ok"}`(在线) |
+| 192.168.16.251:4096 shell API | 200(Basic Auth 通过,可派发) |
+| 192.168.16.189:4090(浏览器节点) | 200(可派发 admin) |
+| 127.0.0.1:4091(本机 shell) | 200 |
+| 127.0.0.1:9082(本机后端) | 000(未启动) |
+| 192.168.16.204:4090 | 000(B-95 第 27 轮失联) |
+
+## 三、实测执行
+
+| 套件 | 位置/方式 | 结果 | 用时 | 对比 R162 |
+|---|---|---|---|---|
+| admin-desktop E2E | 189 派发 `_r163_189_admin.cjs` | **5/5**(TC-A-U01~05,首轮即绿) | 1.9m | 零漂移(B-153-1 维持第 7 轮) |
+| frontend-mobile E2E | 本机 `--project=frontend-mobile` | **6/6**(TC-F-U01~06) | 55.2s | 零漂移 |
+| shop-api E2E | 本机 `--project=shop-api` | **4/4**(TC-S-U01~04) | 6.0s | 零漂移 |
+| health-contract E2E | 本机 `-c playwright.config.health.js` | **13/13**(TC-H/TC-HP/**TC-HP-U01~03 匿名 401**) | 5.4s | 零漂移 |
+| dx-bridge E2E | 本机 `--project=dx-bridge` | **2 skipped**(端点 404,B-DX-1) | — | 零漂移 |
+| cfc-frontend Jest | 本机(cfc-frontend 目录内) | **624 = 609 过 / 3 红 / 12 跳**(S-cfc-132/133 预期 RED) | 24.9s | 零漂移 |
+| cfc-web Jest | 本机 | **116/116** | 19.9s | 零漂移 |
+| **langgraph pytest@251** | 251 派发 `_r163_251_lg.cjs` | **51 例 = 43 过 / 8 红**(497.33s,EXIT≠0) | 8m17s | **变化:红 10→8(改善)** |
+| **后端契约批次 S-cfc-142~151** | worktree `origin/cfclub` 定向 surefire(`-DforkCount=0`) | **11 类 96 例 = 78 绿 / 18 红(全预期 RED)** | 34s+5s | **本轮首验(新增纳入)** |
+| 后端全量 mvn test | — | 采信 R162(353 类/2974 例/2945 过/25 红/4 跳),src 零变更 | — | 采信 |
+| 根级黑盒 Jest | — | 采信 R162(23 例 7 过/16 红,9082 DOWN B-36) | — | 采信 |
+
+## 四、契约批次定向核验明细(B-163-1)
+
+运行:`mvn -o surefire:test -DforkCount=0 -Dtest='{11 个契约类}'`(worktree .wt-r163 = origin/cfclub 干净基线,先 `test-compile` 4m16s EXIT=0)
+
+| 契约类 | S-cfc | 用例 | 红 | 研发声明 | 判定 |
+|---|---|---|---|---|---|
+| AdminArticleListContractTest | 142 | 6 | 0 | 全绿 | ✅ 一致 |
+| AdminArticleCreateContractTest | 143 | 6 | 3 | fail 3/6(B-142-1 权限流) | ✅ 一致 |
+| AdminArticleAuditContractTest | 144 | 12 | 3 | 权限流 3 红+行为锁定 9 绿 | ✅ 一致 |
+| HealthReportCreateContractTest | 145 | 10 | 2 | 2 红/8 绿(reportType 校验缺口) | ✅ 一致 |
+| HealthReportDetailContractTest | 146 | 13 | 0 | 全绿 | ✅ 一致 |
+| DanAssessmentRecordCreateContractTest | 147 | 6 | 4 | 4 红 2 绿(必填/材料/归属缺一) | ✅ 一致 |
+| DanAssessmentResultRecordContractTest | 148 | 3 | 2 | 2 红 1 绿(SC-T-07/30 钩子) | ✅ 一致 |
+| TaskCreateScP10ContractTest | 149 | 14 | 0 | 全绿 | ✅ 一致 |
+| TaskTaskCreateContractTest | 150(controller) | 7 | 0 | task.task.create 控制器层 | ✅ 一致 |
+| TaskCompleteScC02ContractTest | 150(service) | 11 | 1 | 超期提交锚点 1 红 | ✅ 一致 |
+| TaskReviewScP11ContractTest | 151 | 8 | 3 | SC-P-11-P 越权未拦截 3 红 | ✅ 一致 |
+| **合计** | 142~151 | **96** | **18** | **18 红全部为声明内预期 RED,零意外** | — |
+
+证据:`.tdd/r163_contract/`(11 份 surefire XML 备份)。
+
+## 五、langgraph@251 红例(8 红,全环境)
+
+- `test_analyze.py::test_analyze_missing_report`(assert 500==200,LlamaParse/LLM 上游 401)
+- `test_auto_tag.py` 4 例(endpoint_responds / valid_format / content_relevance / empty_content)
+- `test_intent.py` 3 例(classify_recommend / classify_mind / classify_health — `intent_classifier.py:62` 兜底伪装 429)
+- 根因:**① API key `****ab12` 401 失效;② AgnesAI 免费额度 429 耗尽(限速 1 请求/3 分钟)**。251:9000 /health 正常 → 服务活、仅 LLM 面被掐。
+- 对比 R162(analyze 1 + auto_tag 5 + intent 4 = 10 红):auto_tag -1、intent -1 → **环境自愈 2 例,非代码回归**(cfc-langgraph 窗口内零源码变更)。连续 2 轮 51/51 才销号(观察 0/3)。
+
+## 六、台账刷新(本轮回写)
+
+- discovery:**365 控制器 / 1974 handler / 覆盖 456(23.1%)**(covered 34 / partial 200 / uncovered 130 / no-handler 1);测试文件 367 / @Test 3030(部分 4)。
+- inventory:**跨源 4365 = md 716 + PW 571 + Python 48 + Java@Test 3030 + 场景 11**。
+- 侧车 progress 1185 条未重写(保留历史执行状态)。
+
+## 七、差异结论
+
+- **结果有变化(正向 1 项)**:langgraph 红 10→8(43/51,通过率 80.4%→84.3%)。
+- 零漂移项:浏览器 28/28+2skip、fe 609/3/12、web 116/116、后端全量(采信)、根级 7/16(采信)。
+- 新增纳入基线:契约批次 S-cfc-142~151 首验(96 例)。
+- **依指令 → 提交远程 + 通知研发**(见 notice-2026-11-12-R163)。
+
+## 八、未实测项(如实标注)
+
+- 后端全量 `mvn test` 未重跑(src 零变更,采信 R162;新契约类以定向 surefire 实跑纳入)。
+- 根级黑盒 23 例未实跑(9082 未启动,采信 R162)。
+- Playwright 非 live 套件 / 性能 / SAST / DAST / 依赖扫描(未授权联网)。
+- JaCoCo 行覆盖 / PIT 变异(pom 未配置)。
+- 3 个未入库测试文件(B-162-1)未在干净基线复跑(属主工作树遗留,随库后下轮纳入)。
+- 204 节点失联(B-95)。

+ 16 - 2
docs/tdd/test/automation-status.md

@@ -23,8 +23,8 @@
 | 用户场景(md) | 11 | 0 | 0 | 11 | 11 | 0 | 0 | 0 | 0 |
 | Playwright(e2e/integration) | 96 | 571 | 96 | 0 | 86 | 0 | 7 | 3 | 0 |
 | Python(pytest) | 11 | 48 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
-| Java后端测试 | 353 | 2934 | 353 | 0 | 336 | 0 | 15 | 2 | 0 |
-| **合计** | — | **4269** | **523** | **664** | 865 | 255 | 36 | 5 | 26 |
+| Java后端测试 | 367 | 3030 | 367 | 0 | 350 | 0 | 15 | 2 | 0 |
+| **合计** | — | **4365** | **537** | **664** | 879 | 255 | 36 | 5 | 26 |
 
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 
@@ -874,11 +874,14 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | 7 | 已自动化(@Test) | 通过 | AttributionStage1Foundation |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | 6 | 已自动化(@Test) | 通过 | DatabaseInitializerSeed |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` | 11 | 已自动化(@Test) | 通过 | FamilyAccessInterceptor |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/GrowthPublicEndpointMappingTest.java` | 5 | 已自动化(@Test) | 未跟踪 | GrowthPublicEndpointMapping |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorContractEdgeTest.java` | 10 | 已自动化(@Test) | 未跟踪 | JwtInterceptorContractEdge |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorGrowthPolicyTest.java` | 5 | 已自动化(@Test) | 未跟踪 | JwtInterceptorGrowthPolicy |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredPathTest.java` | 3 | 已自动化(@Test) | 未跟踪 | JwtInterceptorLoginRequiredPath |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` | 5 | 已自动化(@Test) | 通过 | JwtInterceptorLoginRequired |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorWechatLoginTest.java` | 4 | 已自动化(@Test) | 未跟踪 | JwtInterceptorWechatLogin |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/ScG06JwtGuardTest.java` | 19 | 已自动化(@Test) | 未跟踪 | ScG06JwtGuard |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/WebConfigGrowthExcludeRemovedTest.java` | 2 | 已自动化(@Test) | 未跟踪 | WebConfigGrowthExcludeRemoved |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` | 1 | 已自动化(@Test) | 通过 | AttributionController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` | 3 | 已自动化(@Test) | 通过 | AttributionSurveyRouting |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AuthWechatLoginContractTest.java` | 10 | 已自动化(@Test) | 未跟踪 | AuthWechatLoginContract |
@@ -910,6 +913,9 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/ScG12H5FallbackContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | ScG12H5FallbackContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/SurveyHealthReviewContractTest.java` | 9 | 已自动化(@Test) | 未跟踪 | SurveyHealthReviewContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/TeamInvitationCreateContractTest.java` | 7 | 已自动化(@Test) | 未跟踪 | TeamInvitationCreateContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleAuditContractTest.java` | 12 | 已自动化(@Test) | 未跟踪 | AdminArticleAuditContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleCreateContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | AdminArticleCreateContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleListContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | AdminArticleListContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginContractTest.java` | 15 | 已自动化(@Test) | 未跟踪 | AdminAuthControllerLoginContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | 10 | 已自动化(@Test) | 未跟踪 | AdminAuthControllerLoginStatus |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` | 11 | 已自动化(@Test) | 未跟踪 | AdminAuthWechatScan |
@@ -929,6 +935,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerAddMemberTest.java` | 7 | 已自动化(@Test) | 未跟踪 | FamilyMembersControllerAddMember |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` | 4 | 已自动化(@Test) | 未跟踪 | FamilyMembersControllerList |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` | 2 | 已自动化(@Test) | 未跟踪 | FamilyMembersControllerRenameFamily |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/growth/GrowthAuthContractTest.java` | 2 | 已自动化(@Test) | 未跟踪 | GrowthAuthContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/growth/GrowthHistoryViewContractTest.java` | 9 | 已自动化(@Test) | 未跟踪 | GrowthHistoryViewContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` | 1 | 已自动化(@Test) | 通过 | TeacherMessageControllerMy |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` | 8 | 已自动化(@Test) | 未跟踪 | TrainingPlanControllerGetPlanDetail |
@@ -1117,6 +1124,8 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ConditionalPathogenLowSideRuleTest.java` | 10 | 已自动化(@Test) | 未跟踪 | ConditionalPathogenLowSideRule |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/CouponUseScP57ScP75ContractTest.java` | 11 | 已自动化(@Test) | 未跟踪 | CouponUseScP57ScP75Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentExecutionContractTest.java` | 11 | 已自动化(@Test) | 未跟踪 | DanAssessmentExecutionContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentRecordCreateContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | DanAssessmentRecordCreateContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentResultRecordContractTest.java` | 3 | 已自动化(@Test) | 未跟踪 | DanAssessmentResultRecordContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/DanReportUploadContractTest.java` | 11 | 已自动化(@Test) | 未跟踪 | DanReportUploadContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/DietFoodHealthAdjustContractTest.java` | 10 | 已自动化(@Test) | 未跟踪 | DietFoodHealthAdjustContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/DietRecommendationBoundaryTest.java` | 12 | 已自动化(@Test) | 未跟踪 | DietRecommendationBoundary |
@@ -1164,6 +1173,8 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanLazyBackfillTest.java` | 5 | 已自动化(@Test) | 未跟踪 | HealthPlanLazyBackfill |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | 10 | 已自动化(@Test) | 未跟踪 | HealthPlanReviewGuard |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportAuditContractTest.java` | 8 | 已自动化(@Test) | 未跟踪 | HealthReportAuditContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportCreateContractTest.java` | 10 | 已自动化(@Test) | 未跟踪 | HealthReportCreateContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportDetailContractTest.java` | 13 | 已自动化(@Test) | 未跟踪 | HealthReportDetailContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` | 9 | 已自动化(@Test) | 未跟踪 | KnowledgeBaseBackfill |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/LangGraphErrorPropagateContractTest.java` | 5 | 已自动化(@Test) | 未跟踪 | LangGraphErrorPropagateContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/LangGraphExitHangContractTest.java` | 4 | 已自动化(@Test) | 未跟踪 | LangGraphExitHangContract |
@@ -1198,11 +1209,14 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/RolesUtilTest.java` | 7 | 已自动化(@Test) | 未跟踪 | RolesUtil |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleApproveTest.java` | 6 | 已自动化(@Test) | 未跟踪 | ServiceRoleApprove |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleFilterTest.java` | 3 | 已自动化(@Test) | 未跟踪 | ServiceRoleFilter |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskCompleteScC02ContractTest.java` | 11 | 已自动化(@Test) | 未跟踪 | TaskCompleteScC02Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskCreateScP10ContractTest.java` | 14 | 已自动化(@Test) | 未跟踪 | TaskCreateScP10Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskFrequencyScP12ContractTest.java` | 4 | 已自动化(@Test) | 未跟踪 | TaskFrequencyScP12Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java` | 4 | 已自动化(@Test) | 未跟踪 | TaskPlanService |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskProgressUpdateTest.java` | 3 | 已自动化(@Test) | 未跟踪 | TaskProgressUpdate |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScP11ContractTest.java` | 8 | 已自动化(@Test) | 未跟踪 | TaskReviewScP11Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScT06ContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | TaskReviewScT06Contract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTaskCreateContractTest.java` | 7 | 已自动化(@Test) | 未跟踪 | TaskTaskCreateContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTemplatePackageContractTest.java` | 13 | 已自动化(@Test) | 未跟踪 | TaskTemplatePackageContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitAdminManageContractTest.java` | 20 | 已自动化(@Test) | 未跟踪 | TeamProfitAdminManageContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitCronContractTest.java` | 22 | 已自动化(@Test) | 未跟踪 | TeamProfitCronContract |

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

@@ -962,3 +962,23 @@
 | **B-69-Update(维持销号)** | mind/fortune 匿名 200 | 研发 | **维持销号**。health 套件 13/13(5/5=401 鉴权断言含)。 | 测试(R162 实测) | 2026-11-12 05:40 | 已闭环 |
 | **B-141-3-Update(观察)** | 站点 `/frontedn` 路径 404 | 运维(P3) | **观察**。`/frontedn`=404、`/admin`=302、`/frontend`=302。 | 运维 | 2026-11-12 05:40 | 观察中 |
 | **R162 门禁** | 全量 3818 / 3750 | 测试 | **不通过**(较 R161「有条件通过」收紧)。✅G1 98.25%/G4 116/G5 编译/G6 28-28/G8 5-5/G10 三节点/G12;❌G2 54 红/**G7 41-51**/G9/G11/G14/G13 25 红;⚠️G3 3 预期 RED。唯一实质动因:langgraph 5→10 红(上游 401+429)。 | 测试(R162 闭环) | 2026-11-12 05:40 | 已记录 |
+
+---
+
+## R163 段(2026-11-12 06:30,更新)
+
+> **R163 口径**:浏览器 admin@189 5/5(首轮即绿,B-153-1 维持第 7 轮)+ 本机 fe 6/shop 4/health 13 + dx 2 skip(23 过 0 败);cfc-web 116/116、cfc-frontend 609/3/12(预期 RED,S-cfc-132/133);**langgraph@251 51 例全执行 = 43 过 / 8 红(497.33s)**;**契约批次 S-cfc-142~151 定向首验 11 类 96 例 = 78 绿 / 18 红,18 红全部 = 研发声明预期 RED,零意外、零代码回归**;后端 src 零变更 → 采信 R162 全量(353 类/2974 例/2945 过/25 红/4 跳)。
+> **结论**:**不通过(承袭)**,但唯一变化项为正向——langgraph 红 10→8(B-142-2 环境红自愈 2 例,auto_tag 5→4、intent 4→3,仍全为上游 401/429 环境红,非代码回归);前端/web/浏览器零漂移;SRS/场景零变更 → G12 合规零新增用例。**变化点 → 已推送 + 通知研发**(notice-2026-11-12-R163 随 commit 入库)。
+
+| 编号 | 关联键/对象 | 类型 | 描述 | 经办 | 登记时间 | 状态 |
+|---|---|---|---|---|---|---|
+| **B-142-2-Update(第 10 轮,改善)** | 251 LLM 上游 401+429 | 运维/AI(P0) | **改善 10→8 红(51 例 43 过)**。红例 = test_analyze 1 + test_auto_tag 4 + test_intent 3(auto_tag -1、intent -1 为环境自愈);日志仍实证 **① 401:API key `****ab12` invalid;② 429:`rate_limit_exceeded`(free 用户每日文本配额耗尽)**;`intent_classifier.py:62` 兜底伪装持续(B-134-4)。251:9000 `/health` 200 → 服务活、仅 LLM 面被掐。**连续 2 轮 51/51 才销号(观察 0/3)**。 | 测试(R163 实派) | 2026-11-12 06:30 | 待处理(P0,风向改善) |
+| **B-163-1(新)** | 契约批次 S-cfc-142~151 首验 | 测试(TDD 核验) | **新登记(核验结论)**。定向实测 11 类 96 例 = **78 绿 / 18 红**,18 红全部与研发 commit 声明预期 RED 逐条吻合:143×3(admin.article.create 权限流 B-142-1)+144×3(admin.article.audit 权限流 3 红+行为锁定 9 绿)+145×2(health.report.create reportType 校验缺口)+147×4(dan.assessment.recordCreate 必填/材料/归属缺一)+148×2(dan.assessment.resultRecord SC-T-07/30 钩子未落地)+150×1(task.task.complete 超期提交锚点)+151×3(task.task.review 权限流 SC-P-11-P 越权未拦截)。**零意外红**:绿 78 = 142 全绿 6 + 146 全绿 13 + 149 全绿 14 + TaskTaskCreate 7 + 部分 143(3)/144(9)/145(8)/147(2)/148(1)/150(10)/151(5)。 | 测试(R163 定向实测) | 2026-11-12 06:30 | 待研发按 TDD 推进(红→黄) |
+| **B-162-1-Update(第 2 轮)** | 后端 3 个未入库测试文件 | 测试(P1 治理) | **延续**。`GrowthPublicEndpointMappingTest`(5 红)/`JwtInterceptorGrowthPolicyTest`(0 红)/`ArticleTagsContractTest`(0 红)仍 `git status ??` 未跟踪。 | 测试(R163 巡检) | 2026-11-12 06:30 | 待归口 |
+| **B-36-Update(第 53 轮零漂移)** | 根级黑盒门控 | 测试(P3) | **零漂移**。23 例 7 过/16 红(9082 未启动,采信 R162 口径)。 | 测试(R163 巡检) | 2026-11-12 06:30 | 待处理(环境型) |
+| **B-95-Update(第 27 轮)** | `204:4090` 失联 | 运维(P2) | **延续**。本轮探活 204:4090 = 000;189/251 均在线。 | 运维 | 2026-11-12 06:30 | 待处理 |
+| **B-DX-1-Update(第 20 轮)** | dx-bridge 端点 404 | 部署(P2) | **延续**。dx 2 例 skip(不假绿)。 | 部署/运维 | 2026-11-12 06:30 | 待处理 |
+| **B-152-1/2-Update(第 7 轮未修)** | CI 排除清单漏 3 红类 / 陈旧 26 绿类 | 研发(P0/P1 CI) | **延续**。`backend-blocking-junit` 必红仍未解。 | 测试(R163 复核) | 2026-11-12 06:30 | 待处理(P0) |
+| **B-156-1-Update(第 4 轮未修)** | `nutrition_age_dosage` 建表 SQL 无效 | 研发(P1 Schema) | **延续**。建表失败被静默 catch。 | 测试(R163 复核) | 2026-11-12 06:30 | 待处理 |
+| **B-142-1-Update(第 15 轮)** | `/api/admin/**` 鉴权门缺失 | 研发(P1 安全) | **延续**。契约类 S-cfc-143/144 红例即此缺口(admin.article.create/audit 权限流)。 | 测试(R163 复核) | 2026-11-12 06:30 | 待处理 |
+| **R163 门禁** | 全量 3818 / 3748 | 测试 | **不通过(承袭)**。✅G1 98.16%/G4 116/G5 编译/G6 28-28/G8 5-5/G10 三节点/G12;❌G2 52 红/**G7 43-51(84.3%,改善但未 51/51)**/G9/G11/G14/G13 25 红(采信);⚠️G3 3 预期 RED。唯一变化 = langgraph 10→8 红(正向)。 | 测试(R163 闭环) | 2026-11-12 06:30 | 已记录 |

+ 21 - 7
docs/tdd/test/discovery.md

@@ -9,13 +9,13 @@
 | --- | --- |
 | 控制器总数 | 365 |
 | handler 方法总数 | 1974 |
-| handler 方法已覆盖 | 450 (22.8%) |
+| handler 方法已覆盖 | 456 (23.1%) |
 | 单元-全覆盖(handler 方法) | 34 |
 | 单元-部分覆盖(handler 方法) | 200 |
 | 单元-未覆盖(handler 方法) | 130 |
 | 单元-无handler 方法 | 1 |
-| 测试文件数 | 353 |
-| @Test 方法总数 | 2934 |
+| 测试文件数 | 367 |
+| @Test 方法总数 | 3030 |
 | 含跳过/假设项(test 级 partial) | 4 |
 
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
@@ -93,13 +93,13 @@
 共 200 个:
 
 - `AdminController`:覆盖 1/65,未覆盖方法:getUsers、createUser、getUser、updateUser、resetUserPassword、searchUsers、deleteUser、getChild、updateChild、adjustPoints
-- `HealthReportController`:覆盖 1/59,未覆盖方法:createReport、getLatestReport、listFamilyReports、listAllReports、getReportIndicatorsWithPrevious、listIndicators、getMemberIndicators、getGutFlora、rebuildIndicatorCurrent、getMemberIndicatorCurrent
+- `HealthReportController`:覆盖 4/59,未覆盖方法:getLatestReport、listFamilyReports、listAllReports、getReportIndicatorsWithPrevious、listIndicators、getGutFlora、rebuildIndicatorCurrent、getMemberIndicatorCurrent、getBodyDetail、getReportPayload
 - `HealthKnowledgeBaseController`:覆盖 2/29,未覆盖方法:batchQuery、add、update、delete、importKnowledgeBase、queryBacteria、batchQueryBacteria、queryIndicator、queryFood、getSection
 - `AdminArticleController`:覆盖 2/22,未覆盖方法:create、update、detail、delete、publishById、backfillTags、toggleFeatured、move、audit、submitReview
 - `ProductOrderController`:覆盖 7/19,未覆盖方法:myOrderCounts、vendorConfirm、reviewUpdate、ship、applyRefund、handlePaymentSuccess、notify、activityAudit、activitySignIn、activityComplete
 - `AuthController`:覆盖 14/18,未覆盖方法:setSwitchPassword、verifyToken、ssoTicket、ssoLogin
 - `HealthPlanController`:覆盖 17/18,未覆盖方法:SuppressWarnings
-- `TaskController`:覆盖 7/18,未覆盖方法:getMinigameOptions、getTodayTasks、completeTask、startTask、getTodayParentTasks、completeParentTask、deleteTask、completeMinigameTask、batchComplete、batchDelete
+- `TaskController`:覆盖 8/18,未覆盖方法:getMinigameOptions、getTodayTasks、startTask、getTodayParentTasks、completeParentTask、deleteTask、completeMinigameTask、batchComplete、batchDelete、getMyPendingTasks
 - `ArticleController`:覆盖 6/17,未覆盖方法:relatedProducts、related、relatedByProduct、getArticleAudio、reportReadingTime、readingStats、dailyTip、aiQuestions、submitAnswers、myPosts
 - `FamilyUserController`:覆盖 3/17,未覆盖方法:getUserInfo、updateUserInfo、joinFamily、createFamily、switchMode、switchToFamilyMember、switchBackToParent、switchBackVerify、getFamilyMemberren、updateFamilyMember
 - `GuideManagementController`:覆盖 3/17,未覆盖方法:resubmitApplication、getUserApplications、getApplicationRecords、generateInviteCode、getInviteCodes、validateInviteCode、getChildGuides、getAllChildGuides、getParentGuide、getGuidePackageTemplates
@@ -142,7 +142,7 @@
 - `SupplyManageController`:覆盖 1/8,未覆盖方法:detail、create、update、delete、addRole、removeRole、adjustTier
 - `AdminOrgController`:覆盖 1/7,未覆盖方法:create、update、disable、detail、myOrg、userSearch
 - `AdminProductOrderController`:覆盖 1/7,未覆盖方法:detail、ship、updateExpress、close、approveRefund、rejectRefund
-- `AdminUnlockGateController`:覆盖 1/7,未覆盖方法:save、delete、sort、toggle、resetFamily、getFamilyProgress
+- `AdminUnlockGateController`:覆盖 2/7,未覆盖方法:save、delete、toggle、resetFamily、getFamilyProgress
 - `CartController`:覆盖 1/7,未覆盖方法:add、update、remove、count、comboOffer、replaceCombo
 - `DoaController`:覆盖 1/7,未覆盖方法:createStage、stageDetail、cancelStage、submitPlan、submitReview、weekList
 - `EmotionCheckinController`:覆盖 3/7,未覆盖方法:create、stats、weeklyReport、recognizeEmotion
@@ -171,7 +171,7 @@
 - `InsurancePolicyController`:覆盖 1/6,未覆盖方法:detail、create、update、delete、upload
 - `PackageTemplateController`:覆盖 1/6,未覆盖方法:Operation、Operation、Operation、Operation、Operation
 - `PromotionMaterialController`:覆盖 1/6,未覆盖方法:detail、byScenario、create、update、delete
-- `ReportTemplateController`:覆盖 1/6,未覆盖方法:get、save、delete、toggle、indicators
+- `ReportTemplateController`:覆盖 2/6,未覆盖方法:get、save、delete、toggle
 - `ServiceContentController`:覆盖 1/6,未覆盖方法:Operation、Operation、Operation、Operation、Operation
 - `ServiceTypeController`:覆盖 1/6,未覆盖方法:Operation、Operation、Operation、Operation、Operation
 - `SupplierProductController`:覆盖 1/6,未覆盖方法:create、update、detail、delete、shelve
@@ -352,12 +352,14 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` | com | 13 | 0 | 7 | DimensionAdminController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyUserSwitchRoleTest.java` | com | 13 | 1 | 1 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuidePackageServiceTest.java` | com | 13 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportDetailContractTest.java` | com | 13 | 13 | 1 | HealthReportController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ManualDimensionScoreContractTest.java` | com | 13 | 6 | 2 | ManualDimensionScoreController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PersonalLayerDualAssertionTest.java` | com | 13 | 4 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/ScG03LoginMethodContractTest.java` | com | 13 | 1 | 4 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTemplatePackageContractTest.java` | com | 13 | 4 | 11 | TaskTemplatePackageController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamStarMultiplierContractTest.java` | com | 13 | 0 | 0 | TeamStarController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTeamServiceUnitTest.java` | com | 12 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleAuditContractTest.java` | com | 12 | 3 | 0 | AdminArticleController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/AfterSalesScS06ContractTest.java` | com | 12 | 0 | 0 | AfterSalesController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceSettleTest.java` | com | 12 | 2 | 0 | CfCommissionController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ConditionEvaluatorServiceTest.java` | com | 12 | 7 | 0 | — | — |
@@ -391,6 +393,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ReportViewPermissionContractTest.java` | com | 11 | 13 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/common/ResultCodeFactoryTest.java` | com | 11 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/RewardEstimateControllerEstimateTest.java` | com | 11 | 0 | 0 | RewardController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskCompleteScC02ContractTest.java` | com | 11 | 7 | 1 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityAdminServiceTest.java` | com | 10 | 10 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityAuditTest.java` | com | 10 | 4 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | com | 10 | 1 | 3 | AdminAuthController | — |
@@ -406,6 +409,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | com | 10 | 0 | 0 | GuideController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideHierarchyServiceTest.java` | com | 10 | 0 | 0 | GuideController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | com | 10 | 0 | 0 | HealthPlanController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportCreateContractTest.java` | com | 10 | 10 | 1 | HealthReportController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | com | 10 | 8 | 3 | IndicatorFavoriteController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorContractEdgeTest.java` | com | 10 | 2 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/config/SleepConfigTagsMechanismContractTest.java` | com | 10 | 3 | 3 | — | — |
@@ -458,6 +462,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/RealNameBackfillServiceTest.java` | com | 8 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ReportDietRecommendContractTest.java` | com | 8 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/ScG05AnonymousBrowseContractTest.java` | com | 8 | 2 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScP11ContractTest.java` | com | 8 | 0 | 0 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitPipelineContractTest.java` | com | 8 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` | com | 8 | 0 | 0 | TrainingPlanController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | com | 7 | 11 | 0 | AttributionController | — |
@@ -480,15 +485,19 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/task/TaskCheckinWebhookReminderTaskTest.java` | com | 7 | 0 | 0 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerCreateTaskTest.java` | com | 7 | 0 | 1 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerGetTaskHistoryTest.java` | com | 7 | 4 | 1 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTaskCreateContractTest.java` | com | 7 | 0 | 1 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/TeamInvitationCreateContractTest.java` | com | 7 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitHookContractTest.java` | com | 7 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityRegistrationQuotaConcurrencyTest.java` | com | 6 | 0 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityServicePublishTest.java` | com | 6 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleCreateContractTest.java` | com | 6 | 9 | 0 | AdminArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleListContractTest.java` | com | 6 | 11 | 1 | AdminArticleController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleRelatedServiceTest.java` | com | 6 | 0 | 0 | ArticleController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/AssessmentComparisonContractTest.java` | com | 6 | 0 | 0 | AssessmentComparisonController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/BadgeServiceUnlockNoticeTest.java` | com | 6 | 1 | 0 | BadgeController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/CfTransferServiceTest.java` | com | 6 | 0 | 0 | CfTransferController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` | com | 6 | 14 | 6 | DailyCheckinController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentRecordCreateContractTest.java` | com | 6 | 2 | 0 | DanAssessmentController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | com | 6 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/impl/DimensionScoreServiceImplTest.java` | com | 6 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyRelationshipServiceLabelTest.java` | com | 6 | 0 | 0 | FamilyController | — |
@@ -539,10 +548,12 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyNamingSupportTest.java` | com | 5 | 0 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyPlatformPointsServiceCouponTest.java` | com | 5 | 0 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GlobalSearchScP82ContractTest.java` | com | 5 | 12 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/GrowthPublicEndpointMappingTest.java` | com | 5 | 0 | 0 | GrowthController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuheVersionSplitContractTest.java` | com | 5 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanLazyBackfillTest.java` | com | 5 | 0 | 0 | HealthPlanController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerCreateReportTest.java` | com | 5 | 2 | 0 | HealthReportController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceBackfillResilienceTest.java` | com | 5 | 7 | 0 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorGrowthPolicyTest.java` | com | 5 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` | com | 5 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/LangGraphErrorPropagateContractTest.java` | com | 5 | 1 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/MiniGameServiceTest.java` | com | 5 | 0 | 0 | MiniGameController | — |
@@ -597,6 +608,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerMigrationServiceTest.java` | com | 3 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboOrderStockTest.java` | com | 3 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/DanAssessmentControllerGetActiveMaterialTest.java` | com | 3 | 0 | 0 | DanAssessmentController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentResultRecordContractTest.java` | com | 3 | 0 | 0 | DanAssessmentController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/EnergyControllerGrantEnergyTest.java` | com | 3 | 4 | 1 | EnergyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyAdminOverviewServiceTest.java` | com | 3 | 4 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyServiceBindTest.java` | com | 3 | 0 | 0 | GuideController | — |
@@ -628,10 +640,12 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceGrantEnergyTest.java` | com | 2 | 1 | 0 | EnergyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` | com | 2 | 1 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FiveDimensionSelfCheckServiceTest.java` | com | 2 | 0 | 0 | FiveDimensionSelfCheckController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/growth/GrowthAuthContractTest.java` | com | 2 | 2 | 0 | GrowthController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | com | 2 | 1 | 1 | IndicatorController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductListNutritionTagFilterTest.java` | com | 2 | 0 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserAddressServiceBackfillTest.java` | com | 2 | 0 | 0 | UserController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceFamilyNameLinkTest.java` | com | 2 | 0 | 0 | UserController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/WebConfigGrowthExcludeRemovedTest.java` | com | 2 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/AiGatewayTimeoutTest.java` | com | 1 | 2 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` | com | 1 | 0 | 0 | AttributionController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/butler/ButlerControllerEnvelopeTest.java` | com | 1 | 7 | 1 | ButlerController | — |

+ 16 - 2
docs/tdd/test/inventory.md

@@ -11,9 +11,9 @@
 | 结构化测试用例(md) | 10 | 716 |
 | Playwright(spec.js) | 96 | 571 |
 | Python(pytest) | 11 | 48 |
-| Java后端(测试文件) | 353 | 2934 (@Test) |
+| Java后端(测试文件) | 367 | 3030 (@Test) |
 | 用户场景(md) | 11 | 文件级 |
-| **合计** | — | **4269** 用例/方法 |
+| **合计** | — | **4365** 用例/方法 |
 
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 
@@ -869,11 +869,14 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | cfc-backend | 7 | AttributionStage1Foundation | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | cfc-backend | 6 | DatabaseInitializerSeed | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` | cfc-backend | 11 | FamilyAccessInterceptor | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/GrowthPublicEndpointMappingTest.java` | cfc-backend | 5 | GrowthPublicEndpointMapping | `cfc-backend/src/test/java/com/etotem/cfc/config/GrowthPublicEndpointMappingTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorContractEdgeTest.java` | cfc-backend | 10 | JwtInterceptorContractEdge | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorContractEdgeTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorGrowthPolicyTest.java` | cfc-backend | 5 | JwtInterceptorGrowthPolicy | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorGrowthPolicyTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredPathTest.java` | cfc-backend | 3 | JwtInterceptorLoginRequiredPath | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredPathTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` | cfc-backend | 5 | JwtInterceptorLoginRequired | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorWechatLoginTest.java` | cfc-backend | 4 | JwtInterceptorWechatLogin | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorWechatLoginTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/ScG06JwtGuardTest.java` | cfc-backend | 19 | ScG06JwtGuard | `cfc-backend/src/test/java/com/etotem/cfc/config/ScG06JwtGuardTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/WebConfigGrowthExcludeRemovedTest.java` | cfc-backend | 2 | WebConfigGrowthExcludeRemoved | `cfc-backend/src/test/java/com/etotem/cfc/config/WebConfigGrowthExcludeRemovedTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` | cfc-backend | 1 | AttributionController | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` | cfc-backend | 3 | AttributionSurveyRouting | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AuthWechatLoginContractTest.java` | cfc-backend | 10 | AuthWechatLoginContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/AuthWechatLoginContractTest.java` |
@@ -905,6 +908,9 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/ScG12H5FallbackContractTest.java` | cfc-backend | 6 | ScG12H5FallbackContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/ScG12H5FallbackContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/SurveyHealthReviewContractTest.java` | cfc-backend | 9 | SurveyHealthReviewContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/SurveyHealthReviewContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/TeamInvitationCreateContractTest.java` | cfc-backend | 7 | TeamInvitationCreateContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/TeamInvitationCreateContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleAuditContractTest.java` | cfc-backend | 12 | AdminArticleAuditContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleAuditContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleCreateContractTest.java` | cfc-backend | 6 | AdminArticleCreateContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleCreateContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleListContractTest.java` | cfc-backend | 6 | AdminArticleListContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminArticleListContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginContractTest.java` | cfc-backend | 15 | AdminAuthControllerLoginContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | cfc-backend | 10 | AdminAuthControllerLoginStatus | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` | cfc-backend | 11 | AdminAuthWechatScan | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` |
@@ -924,6 +930,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerAddMemberTest.java` | cfc-backend | 7 | FamilyMembersControllerAddMember | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerAddMemberTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` | cfc-backend | 4 | FamilyMembersControllerList | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` | cfc-backend | 2 | FamilyMembersControllerRenameFamily | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/growth/GrowthAuthContractTest.java` | cfc-backend | 2 | GrowthAuthContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/growth/GrowthAuthContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/growth/GrowthHistoryViewContractTest.java` | cfc-backend | 9 | GrowthHistoryViewContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/growth/GrowthHistoryViewContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` | cfc-backend | 1 | TeacherMessageControllerMy | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` | cfc-backend | 8 | TrainingPlanControllerGetPlanDetail | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` |
@@ -1112,6 +1119,8 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ConditionalPathogenLowSideRuleTest.java` | cfc-backend | 10 | ConditionalPathogenLowSideRule | `cfc-backend/src/test/java/com/etotem/cfc/unit/ConditionalPathogenLowSideRuleTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/CouponUseScP57ScP75ContractTest.java` | cfc-backend | 11 | CouponUseScP57ScP75Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/CouponUseScP57ScP75ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentExecutionContractTest.java` | cfc-backend | 11 | DanAssessmentExecutionContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentExecutionContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentRecordCreateContractTest.java` | cfc-backend | 6 | DanAssessmentRecordCreateContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentRecordCreateContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentResultRecordContractTest.java` | cfc-backend | 3 | DanAssessmentResultRecordContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/DanAssessmentResultRecordContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/DanReportUploadContractTest.java` | cfc-backend | 11 | DanReportUploadContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/DanReportUploadContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/DietFoodHealthAdjustContractTest.java` | cfc-backend | 10 | DietFoodHealthAdjustContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/DietFoodHealthAdjustContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/DietRecommendationBoundaryTest.java` | cfc-backend | 12 | DietRecommendationBoundary | `cfc-backend/src/test/java/com/etotem/cfc/unit/DietRecommendationBoundaryTest.java` |
@@ -1159,6 +1168,8 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanLazyBackfillTest.java` | cfc-backend | 5 | HealthPlanLazyBackfill | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanLazyBackfillTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | cfc-backend | 10 | HealthPlanReviewGuard | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportAuditContractTest.java` | cfc-backend | 8 | HealthReportAuditContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportAuditContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportCreateContractTest.java` | cfc-backend | 10 | HealthReportCreateContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportCreateContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportDetailContractTest.java` | cfc-backend | 13 | HealthReportDetailContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportDetailContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` | cfc-backend | 9 | KnowledgeBaseBackfill | `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/LangGraphErrorPropagateContractTest.java` | cfc-backend | 5 | LangGraphErrorPropagateContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/LangGraphErrorPropagateContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/LangGraphExitHangContractTest.java` | cfc-backend | 4 | LangGraphExitHangContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/LangGraphExitHangContractTest.java` |
@@ -1193,11 +1204,14 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/RolesUtilTest.java` | cfc-backend | 7 | RolesUtil | `cfc-backend/src/test/java/com/etotem/cfc/unit/RolesUtilTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleApproveTest.java` | cfc-backend | 6 | ServiceRoleApprove | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleApproveTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleFilterTest.java` | cfc-backend | 3 | ServiceRoleFilter | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleFilterTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskCompleteScC02ContractTest.java` | cfc-backend | 11 | TaskCompleteScC02Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskCompleteScC02ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskCreateScP10ContractTest.java` | cfc-backend | 14 | TaskCreateScP10Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskCreateScP10ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskFrequencyScP12ContractTest.java` | cfc-backend | 4 | TaskFrequencyScP12Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskFrequencyScP12ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java` | cfc-backend | 4 | TaskPlanService | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskProgressUpdateTest.java` | cfc-backend | 3 | TaskProgressUpdate | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskProgressUpdateTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScP11ContractTest.java` | cfc-backend | 8 | TaskReviewScP11Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScP11ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScT06ContractTest.java` | cfc-backend | 6 | TaskReviewScT06Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScT06ContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTaskCreateContractTest.java` | cfc-backend | 7 | TaskTaskCreateContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTaskCreateContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTemplatePackageContractTest.java` | cfc-backend | 13 | TaskTemplatePackageContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTemplatePackageContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitAdminManageContractTest.java` | cfc-backend | 20 | TeamProfitAdminManageContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitAdminManageContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitCronContractTest.java` | cfc-backend | 22 | TeamProfitCronContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitCronContractTest.java` |