ソースを参照

docs(tdd): 测试负责人 22:13 轮(契约 79 例复验 74 绿/3 红/2 错·B-21 第 4 次确认复发·维度合并 aa6ccb2dd 后首验 28 例 26 绿/2 红(HealthDimensionControllerTest 2 红精确化归因 currentMemberId 兜底传参·B-18)·O-1 终局:git fetch --deepen 消除 shallow 假阴性,1767d4414/c3e32460a 确认在祖先链,研发 20:14 证伪成立,YELLOW sha 卡点消除,降为纯状态机同步单卡点(第 18 轮)·B-10 连续第 9 轮无复发·并入跨批次未推送 B-14~B-24·台账 359/1942/19.2%/220/1715/2990)

E2E Test Bot 1 週間 前
親
コミット
b32d99e181

ファイルの差分が大きいため隠しています
+ 0 - 0
docs/tdd/orchestration/pending.md


+ 90 - 0
docs/tdd/test/automation-run-2026-11-05-2213.md

@@ -0,0 +1,90 @@
+# TDD 闭环自动化运行报告 — 2026-11-05 22:13(测试负责人轮)
+
+- 角色:测试负责人(cfc-tester)。未派发 opencode;离线契约测试实跑 ×2 轮 + **git 历史补深(shallow→全量)后的 O-1 权威终局复核** + 台账重扫。
+- 基线:HEAD 对齐 `fa2344eb8`(origin/cfclub,autostash rebase;rebase 前对齐 `9195a4b37`,新增提交 1f4c14c6f=docs 汇报 / fa2344eb8=cfc-web build bump [skip ci],均不含 cfc-backend main 代码,不影本方实测结果)。
+- 本轮时间窗 21:13→22:13 远端合入:**统一维度体系 merge `aa6ccb2dd`(P0+P1+P2,17 文件 +1058/-136)** + T41 小游戏前端 + 报告页优化 + 研发 22:11 轮 O-1 证伪汇报 `1f4c14c6f`。
+
+## 本轮核心证据(实测)
+
+### 1. 主口径契约复验:79 例 → 74 绿 / 3 红 / 2 错(与 19:19 轮完全一致)
+
+命令:`mvn -o -B -f cfc-backend/pom.xml -DskipTests=false -Dtest='HealthReportControllerCreateReportTest,DanAssessmentControllerGetActiveMaterialTest,TrainingPlanControllerGetPlanDetailTest,TaskControllerCreateTaskTest,TaskControllerReviewTest,TaskServiceReviewTest,DimensionRegistryTreeTest,DimensionRegistryMapContractTest,CfBalanceControllerTest' test`(4m38s,**维度合并后首轮同口径复验**)
+
+| 测试类 | 结果 | 说明 |
+|---|---|---|
+| createReport 5 + getActiveMaterial 3 + getPlanDetail 8 + createTask 7 | 23/23 绿 | 2 个 YELLOW 键契约**连续第 9 轮**独立复验通过 |
+| TaskServiceReviewTest | 15/15 绿 | — |
+| CfBalanceControllerTest | 8/8 绿 | — |
+| DimensionRegistryTreeTest | 9/9 绿 | — |
+| **DimensionRegistryMapContractTest** | **3 红**(7 例) | **P-2 口径 3 红(map_unknownLegacy:76 / map_emptyLegacy:85 / map_missingLegacy:92)——维度合并后仍无改善**,与 10:45/13:58/19:19 轮完全一致,非新回归 |
+| **TaskControllerReviewTest** | **2 错**(17 例) | **B-21 连续第 3 轮确认复发**:pendingReview_directCall_uniformResultShape:316 + pendingReview_parent_success_returnsList:176 双 NPE(根因不变:SC-X-22 f14e46f84 在 TaskController:197/205 新增 rewardRuleService 调用,测试装置未补 mock,A 类测试夹具问题) |
+
+- **testCompile 零编译错误(B-10 连续第 9 轮无复发)**——维度合并未引入编译回归。
+
+### 2. 维度合并新增测试首验:28 例 → 26 绿 / 2 红(新精确证据)
+
+命令:`mvn -o -B -f cfc-backend/pom.xml -DskipTests=false -Dtest='HealthDimensionControllerTest,DimensionAdminControllerTest' test`(3m1s)
+
+| 测试类 | 结果 | 说明 |
+|---|---|---|
+| DimensionAdminControllerTest | **13/13 全绿** | 维度管理新增契约全部通过 |
+| HealthDimensionControllerTest | **13 绿 / 2 红** | overview_missingMemberId:58 / history_missingMemberId:217:期望 `result.getCode()==500` 实得 `200` |
+
+**B-18 精确化(A 类测试装置口径)**:`overview_missingMemberId` / `history_missingMemberId` 两用例调用 `controller.overview(params, 1L, 1L)` / `controller.history(params, 1L, 1L)` 时**传入了 currentMemberId=1L**——实现 `memberId = ParamUtils.getLong(params.get("memberId"), currentMemberId)` 触发 **currentMemberId 兜底语义**(双角色家长视角注入,刻意的设计行为),memberId 实为 1L 非空 → 正常路径返回 200。测试想验证「memberId 缺失 → 500」却误传兜底参数,**属测试装置口径错误而非生产缺陷**;修复:第 3 参传 `null`(或改 `.andExpect(200)` 断言兜底行为)。此 2 例与 B-18 台账「A 类 54 例」中 HealthDimensionControllerTest 条目同源,本轮给出精确行号与根因。
+
+## O-1 终局:YELLOW sha「失效」判定被推翻(shallow 假阴性,本轮补深后权威定性)
+
+**背景**:测试侧 16:59/19:19 轮判定研发登记的 YELLOW 实现 sha `1767d4414`(createReport)/`c3e32460a`(getActiveMaterial)不在 origin/cfclub 祖先链 → 提「YELLOW sha 失效」双卡点;研发 20:14 反驳为「shallow 克隆假阴性」,22:11 轮 `1f4c14c6f` 正式证伪。
+
+**本轮独立权威复核(消除假阴性)**:
+1. 发现仓库为 **shallow clone**(`.git/shallow` 边界 = 2026-09-13/09-18 三个提交),origin/cfclub 仅可达 3085 提交,最早 09-13;`1767d4414`(06-12)/`c3e32460a`(06-09)**早于边界 3 个月** → 此前 `git log`/`rev-list`/`merge-base`/`branch -r --contains` 对边界前提交的判定**全部不可信**(假阴性)。
+2. `git fetch --deepen=8000` 补深:**浅边界消除**,origin/cfclub 可达提交 3085 → **8854**,最早回溯至 **2026-03-31**。
+3. 补深后重新复核(完整 sha + `rev-list` 精确匹配 + `merge-base --is-ancestor` 三重验证):
+
+| sha | 补深前(误判) | 补深后(真值) |
+|---|---|---|
+| `1767d4414` | NO / 0 hits | **YES / 1 hit ✓ 在祖先链** |
+| `c3e32460a` | NO / 0 hits | **YES / 1 hit ✓ 在祖先链** |
+| `6c906c79e` / `d8687f7c8`(测试侧建议重登记) | YES | YES(仍有效,无需变更) |
+| `f14e46f84`(SC-X-22) | YES | YES |
+
+**终局结论**:测试侧 16:59/19:19 的「YELLOW sha 失效」判定**确为 shallow 克隆假阴性**,**研发 20:14 的反驳与 22:11 轮证伪成立**;`1767d4414`/`c3e32460a` 均为合法 origin/cfclub 祖先,**无需重登记 sha**。O-1 由「状态机同步 + YELLOW sha 失效」**降为纯状态机同步单卡点**(责任:编排侧/主理人同步本地 `.tdd/state.json`,测试侧不可自解)。
+
+**教训(测试侧方法论修正)**:在 shallow 仓库中判定「X 是否祖先链」前必须先检查 `git rev-parse --is-shallow-repository`;边界前的提交不可用 log/rev-list/merge-base/branch -r --contains 判定,唯一可靠路径是 `git fetch --deepen` 补深到覆盖目标提交日期后再复核。此教训与 19:19 轮的「O-1 终局判定」记录相抵触,以本报告为准。
+
+## 状态机
+
+- 本地 `.tdd/state.json` 仍 3 伪 RED(createReport/getActiveMaterial/getPlanDetail,mtime 11-04 10:14 未动)——**纯状态机同步缺口第 18 轮**;mark-green 落账实测仍被拒(「当前阶段 RED 须先 YELLOW」)。
+- 研发 22:11 口径:DONE 12 / YELLOW 2 / RED 0。mark-green 证据链**已完全就绪**:YELLOW sha 有效(本轮补深确认)+ 契约测试连续 9 轮复验通过 + RED sha 在链上——只差状态机同步这一个编排侧动作。
+
+## 台账重扫(只读)
+
+- 发现:控制器 **359** / handler **1942**(覆盖 **372=19.2%**,↑19.1%)/ 测试文件 **220**(@Test **1715**,部分 4)。
+- 总台账:结构化 784 + Playwright 444 + Python 47 + Java **1715** + 场景 11 = 跨源 **2990** 用例(vs 19:19 轮 2956,**+34**——全部来自维度合并新增测试类)。
+
+## 提交
+
+- 本轮将提交:本报告 + blockers(B-18 精确化 / B-21 第 3 轮确认)+ pending(O-1 终局翻转),精确 add 后 single commit → push origin/cfclub。
+- 工作区 132 项跨角色 WIP 未触碰(autostash 已回放)。
+
+## 结论:不通过(承袭,有条件)
+
+| 门禁 | 判定 | 依据 |
+|---|---|---|
+| G1 后端通过率 | ⚠️ 采信兄弟批次 ≈92%(本轮未跑全量) | 本轮主口径 79 例 + 维度 28 例实测 |
+| G2 非环境红 | ❌ 112 红未清零 | B-18 A 类 54 例待自修 |
+| G3 前端 | ✅ 100%(采信) | 兄弟批次 |
+| G4 testCompile | ✅ **0 错(本轮实跑,B-10 连续第 9 轮无复发)** | 维度合并后首验 |
+| G5 契约 | ⚠️ 74 绿/3 红/2 错(本轮实跑) | P-2 3 红 + B-21 2 错 |
+| G6 CI | ❌ 无 | 未变 |
+| G7 状态机 | ❌ 伪 RED 第 18 轮 | 纯同步缺口(YELLOW sha 卡点已消除) |
+| G8 契约红例 | ❌ P-2 3 红 + B-21 2 错 | 待拍板/待自修 |
+
+**本轮核心改善**:① **O-1 权威终局**——YELLOW sha「失效」卡点经补深历史证实为 shallow 假阴性,双卡点降为单卡点,研发侧证伪成立,测试侧 16:59/19:19 判定撤回;② 维度合并(aa6ccb2dd,21:07 合入)**合并后首轮复验无编译回归**(B-10 连续第 9 轮);③ 维度新增测试 28 例首验 26 绿(DimensionAdmin 13/13),HealthDimension 2 红精确归因为测试装置 currentMemberId 兜底传参。
+
+**使绿顺序**:① 编排侧/主理人同步 `.tdd/state.json`(第 18 轮卡点,mark-green 证据链已就绪)→ 测试 `--mark-green` 收口 2 YELLOW 键 → ② 测试侧自修 B-21(补 RewardRuleService @Mock,SC-P-11 恢复 17/17)→ ③ 测试侧自修 B-18 A 类(含本轮精确化的 HealthDimensionControllerTest 2 例传 null;G1→≈95.7%)→ ④ P-2 map 契约口径拍板(设计文档 v 实现:unknown/empty→null、missing→400)→ ⑤ B-13 环境红 / B-14 固定 SHA 复验 → ⑥ 最小 CI。
+
+## 未实测
+
+- 全量 surefire(采信兄弟批次,业务基线本轮仅增维度测试与 docs);前端 jest;langgraph pytest(采信)。Playwright/接口冒烟(联网未授权,且 9082 本轮未探活)。JaCoCo/PIT/性能/依赖漏洞(无工具/未授权)。
+- mark-green 落账受阻(状态机过时,第 18 轮,实测受阻非未尝试)。

+ 71 - 7
docs/tdd/test/automation-status.md

@@ -19,12 +19,12 @@
 
 | 来源类型 | 文件数 | 用例/方法数 | 已自动化 | 待自动化 | 未跟踪 | 已执行 | 通过 | 失败 | 阻塞 |
 | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
-| 结构化测试用例(md) | 9 | 729 | 0 | 729 | 729 | 0 | 0 | 0 | 0 |
-| 用户场景(md) | 9 | 0 | 0 | 9 | 9 | 0 | 0 | 0 | 0 |
-| Playwright(e2e/integration) | 73 | 436 | 73 | 0 | 63 | 0 | 7 | 3 | 0 |
+| 结构化测试用例(md) | 11 | 784 | 0 | 784 | 784 | 0 | 0 | 0 | 0 |
+| 用户场景(md) | 11 | 0 | 0 | 11 | 11 | 0 | 0 | 0 | 0 |
+| Playwright(e2e/integration) | 76 | 444 | 76 | 0 | 66 | 0 | 7 | 3 | 0 |
 | Python(pytest) | 11 | 47 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
-| Java后端测试 | 216 | 1665 | 216 | 0 | 199 | 0 | 15 | 2 | 0 |
-| **合计** | — | **2877** | **300** | **738** | 1011 | 0 | 22 | 5 | 0 |
+| Java后端测试 | 220 | 1715 | 220 | 0 | 203 | 0 | 15 | 2 | 0 |
+| **合计** | — | **2990** | **307** | **795** | 1075 | 0 | 22 | 5 | 0 |
 
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 
@@ -114,6 +114,36 @@
 | `tests/test-cases/admin.md#TC-A-N07` | 内容安全 | 运营 | P0 | 文档用例(待自动化) | 未跟踪 | 设计:禁止内网地址(SSRF 防护);仅白名单外域;超时截断|e2e:SSRF 防护 |
 | `tests/test-cases/admin.md#TC-A-N08` | 知识库 | 运营 | P1 | 文档用例(待自动化) | 未跟踪 | 设计:类型校验拒绝;不落盘执行|e2e:上传校验 |
 | `tests/test-cases/admin.md#TC-A-N09` | 注销导出 | 运营 | P0 | 文档用例(待自动化) | 未跟踪 | 设计:仅工单授权用户可导出;数据脱敏打包;操作留痕审计|e2e:数据导出合规 |
+| `tests/test-cases/butler.md#TC-B-01` | 家长 | P0 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:B-01 / P-49|e2e:- |
+| `tests/test-cases/butler.md#TC-B-02` | 家长 | P0 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:B-02 / P-65|e2e:- |
+| `tests/test-cases/butler.md#TC-B-04` | 家长 | P0 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:B-04 / P-23|e2e:- |
+| `tests/test-cases/butler.md#TC-B-05` | 系统 | P0 | 安全 | 文档用例(待自动化) | 未跟踪 | 设计:B-05 / A-13 / T-28|e2e:- |
+| `tests/test-cases/butler.md#TC-B-06` | 系统 | P0 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-06 / P-40 / P-49|e2e:- |
+| `tests/test-cases/butler.md#TC-B-07` | 家长 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:B-07 / P-10 / P-13 / P-28|e2e:- |
+| `tests/test-cases/butler.md#TC-B-09` | 家长 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:B-09 / P-36 / X-11|e2e:- |
+| `tests/test-cases/butler.md#TC-B-10` | 家长 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:B-10 / P-68 / T-16|e2e:- |
+| `tests/test-cases/butler.md#TC-B-11` | 家长 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:B-11 / B-04|e2e:- |
+| `tests/test-cases/butler.md#TC-B-12` | 家长 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:B-12 / P-46 / T-05|e2e:- |
+| `tests/test-cases/butler.md#TC-B-01-E` | 家长 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-01|e2e:- |
+| `tests/test-cases/butler.md#TC-B-02-E` | 家长 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-02|e2e:- |
+| `tests/test-cases/butler.md#TC-B-04-E` | 家长 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-04|e2e:- |
+| `tests/test-cases/butler.md#TC-B-05-E` | 系统 | P1 | 安全 | 文档用例(待自动化) | 未跟踪 | 设计:B-05|e2e:- |
+| `tests/test-cases/butler.md#TC-B-06-E` | 系统 | P1 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-06|e2e:- |
+| `tests/test-cases/butler.md#TC-B-07-E` | 家长 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-07|e2e:- |
+| `tests/test-cases/butler.md#TC-B-09-E` | 家长 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-09|e2e:- |
+| `tests/test-cases/butler.md#TC-B-10-E` | 家长 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-10|e2e:- |
+| `tests/test-cases/butler.md#TC-B-11-E` | 家长 | P3 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-11|e2e:- |
+| `tests/test-cases/butler.md#TC-B-12-E` | 家长 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:B-12|e2e:- |
+| `tests/test-cases/butler.md#TC-B-01-P` | 家长 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-01|e2e:- |
+| `tests/test-cases/butler.md#TC-B-02-P` | 家长 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-02|e2e:- |
+| `tests/test-cases/butler.md#TC-B-04-P` | 家长 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-04|e2e:- |
+| `tests/test-cases/butler.md#TC-B-05-P` | 系统 | P0 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-05|e2e:- |
+| `tests/test-cases/butler.md#TC-B-06-P` | 系统 | P2 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-06|e2e:- |
+| `tests/test-cases/butler.md#TC-B-07-P` | 家长 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-07|e2e:- |
+| `tests/test-cases/butler.md#TC-B-09-P` | 家长 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-09|e2e:- |
+| `tests/test-cases/butler.md#TC-B-10-P` | 家长 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-10|e2e:- |
+| `tests/test-cases/butler.md#TC-B-11-P` | 家长 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-11|e2e:- |
+| `tests/test-cases/butler.md#TC-B-12-P` | 家长 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:B-12|e2e:- |
 | `tests/test-cases/child.md#TC-C-01` | 权限/双角色 | 孩子 | P0 | 文档用例(待自动化) | 未跟踪 | 设计:进入孩子端首页;**无切换家长入口**;直接拼家长路由被 role 校验拦截|e2e:双角色铁律:孩子端不能切家长 |
 | `tests/test-cases/child.md#TC-C-02` | 任务 | 孩子 | P0 | 文档用例(待自动化) | 未跟踪 | 设计:状态→待家长审核;完成动作写入记录;重复提交不重复计分|e2e:TaskController |
 | `tests/test-cases/child.md#TC-C-03` | 小游戏 | 孩子 | P1 | 文档用例(待自动化) | 未跟踪 | 设计:得分按规则计算;积分/能量到账;成绩入榜;中途退出不计分|e2e:pages/games/* |
@@ -259,6 +289,10 @@
 | `tests/test-cases/cross-role-e2e.md#TC-X-19-P` | 跨角色 | P0 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:X-19|e2e:- |
 | `tests/test-cases/cross-role-e2e.md#TC-X-20-P` | 跨角色 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:X-20|e2e:- |
 | `tests/test-cases/cross-role-e2e.md#TC-X-21-P` | 跨角色 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:X-21|e2e:- |
+| `tests/test-cases/cross-role-e2e.md#TC-X-22` | 跨角色 | P0 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:X-22 / P-10、C-05、X-07、T-6|e2e:- |
+| `tests/test-cases/cross-role-e2e.md#TC-X-22-E` | 跨角色 | P1 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:X-22 / P-87、C-25、P-89、P-93|e2e:- |
+| `tests/test-cases/cross-role-e2e.md#TC-X-22-E2` | 跨角色 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:X-22 / P-13、C-04、X-12|e2e:- |
+| `tests/test-cases/cross-role-e2e.md#TC-X-22-P` | 跨角色 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:X-22 / P-77、X-07|e2e:- |
 | `tests/test-cases/cross-role-e2e.md#TC-X-N01` | 跨角色 | P0 | 性能 | 文档用例(待自动化) | 未跟踪 | 设计:X-01|e2e:- |
 | `tests/test-cases/cross-role-e2e.md#TC-X-N02` | 跨角色 | P0 | 性能 | 文档用例(待自动化) | 未跟踪 | 设计:X-03|e2e:- |
 | `tests/test-cases/cross-role-e2e.md#TC-X-N03` | 跨角色 | P0 | 性能 | 文档用例(待自动化) | 未跟踪 | 设计:X-15|e2e:- |
@@ -324,6 +358,27 @@
 | `tests/test-cases/guest.md#TC-G-N03` | 非微信H5 | 游客 | P2 | 文档用例(待自动化) | 未跟踪 | 设计:功能可用;无微信 SDK 依赖报错;流程闭环|e2e:H5 兜底 |
 | `tests/test-cases/guest.md#TC-G-N04` | 落地页 | 游客 | P0 | 文档用例(待自动化) | 未跟踪 | 设计:返回 401;不泄露数据与结构|e2e:接口鉴权 |
 | `tests/test-cases/guest.md#TC-G-N05` | 登录注册 | 游客 | P0 | 文档用例(待自动化) | 未跟踪 | 设计:触发限流/锁定;验证码一次性;防爆破;无撞库成功|e2e:登录限流 |
+| `tests/test-cases/human-butler.md#TC-H-01` | 真人管家 | P0 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:H-01 / B-09|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-02` | 真人管家 | P0 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:H-02 / P-32|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-03` | 真人管家 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:H-03 / X-11 / T-16|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-04` | 真人管家 | P0 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:H-04 / A-13|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-05` | 真人管家 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:H-05 / P-44|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-06` | 真人管家 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:H-06 / B-01 / B-09|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-07` | 系统 | P1 | 功能 | 文档用例(待自动化) | 未跟踪 | 设计:H-07 / A-13|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-01-E` | 真人管家 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:H-01|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-02-E` | 真人管家 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:H-02|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-03-E` | 真人管家 | P3 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:H-03|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-04-E` | 真人管家 | P1 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:H-04|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-05-E` | 真人管家 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:H-05|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-06-E` | 真人管家 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:H-06|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-07-E` | 系统 | P2 | 异常 | 文档用例(待自动化) | 未跟踪 | 设计:H-07|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-01-P` | 真人管家 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:H-01|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-02-P` | 真人管家 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:H-02|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-03-P` | 真人管家 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:H-03|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-04-P` | 真人管家 | P0 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:H-04|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-05-P` | 真人管家 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:H-05|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-06-P` | 真人管家 | P1 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:H-06|e2e:- |
+| `tests/test-cases/human-butler.md#TC-H-07-P` | 系统 | P0 | 权限 | 文档用例(待自动化) | 未跟踪 | 设计:H-07|e2e:- |
 | `tests/test-cases/parent.md#TC-P-01` | 家庭 | 家长 | P0 | 文档用例(待自动化) | 未跟踪 | 设计:家庭创建成功;生成唯一邀请码+二维码(令牌+落地页);角色变家庭管理员|e2e:FamilyInviteController |
 | `tests/test-cases/parent.md#TC-P-02` | 家庭/成员 | 家长 | P1 | 文档用例(待自动化) | 未跟踪 | 设计:C 加入家庭,成员列表出现 C|e2e:FamilyInviteController |
 | `tests/test-cases/parent.md#TC-P-03` | 成员资料 | 家长 | P1 | 文档用例(待自动化) | 未跟踪 | 设计:成员卡片正确显示;关系标签可选(RelationshipPicker)|e2e:FamilyMembersController |
@@ -776,9 +831,12 @@
 | `tests/e2e/ai-plan-task-flow.spec.js` | 7 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e/api/api-smoke.spec.js` | 4 | 已自动化(e2e) | 通过 | — |
 | `tests/e2e/api/article-api.spec.js` | 7 | 已自动化(e2e) | 通过 | — |
+| `tests/e2e/api/butler-fallback.spec.js` | 4 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e/api/contact-api.spec.js` | 6 | 已自动化(e2e) | 通过 | — |
 | `tests/e2e/api/energy-api.spec.js` | 8 | 已自动化(e2e) | 通过 | — |
 | `tests/e2e/api/family-member-api.spec.js` | 14 | 已自动化(e2e) | 通过 | — |
+| `tests/e2e/api/generated/tc-scripted.spec.js` | 0 | 已自动化(e2e) | 未跟踪 | — |
+| `tests/e2e/api/human-butler-workorder.spec.js` | 4 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e/api/nonfunc-perf-compat.spec.js` | 5 | 已自动化(e2e) | 通过 | — |
 | `tests/e2e/api/nonfunc-security.spec.js` | 11 | 已自动化(e2e) | 失败 | — |
 | `tests/e2e/api/sc-p-03-switch-role.spec.js` | 11 | 已自动化(e2e) | 未跟踪 | — |
@@ -880,6 +938,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | 6 | 已自动化(@Test) | 未跟踪 | HealthReportControllerProxyParseBinding |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | 2 | 已自动化(@Test) | 未跟踪 | IndicatorController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | 10 | 已自动化(@Test) | 未跟踪 | IndicatorFavoriteController |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/MembershipControllerPlansLevelOrderTest.java` | 1 | 已自动化(@Test) | 未跟踪 | MembershipControllerPlansLevelOrder |
 | `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 |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` | 4 | 已自动化(@Test) | 未跟踪 | AdminButlerControllerEnvelope |
@@ -895,6 +954,8 @@
 | `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 |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` | 10 | 已自动化(@Test) | 通过 | TrainingPlanControllerGetPlanList |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/RewardEstimateControllerEstimateTest.java` | 11 | 已自动化(@Test) | 未跟踪 | RewardEstimateControllerEstimate |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/RewardEstimateControllerTest.java` | 17 | 已自动化(@Test) | 未跟踪 | RewardEstimateController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerCreateTaskTest.java` | 7 | 已自动化(@Test) | 未跟踪 | TaskControllerCreateTask |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerReviewTest.java` | 17 | 已自动化(@Test) | 未跟踪 | TaskControllerReview |
 | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | 3 | 已自动化(@Test) | 未跟踪 | ActivityDTO |
@@ -1011,6 +1072,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportAnalyzeQuotaServiceTest.java` | 6 | 已自动化(@Test) | 未跟踪 | ReportAnalyzeQuotaService |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportDateExtractorTest.java` | 6 | 已自动化(@Test) | 未跟踪 | ReportDateExtractor |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` | 1 | 已自动化(@Test) | 未跟踪 | ReportSummaryServiceCompleteness |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/RewardRuleServiceEstimateTest.java` | 21 | 已自动化(@Test) | 未跟踪 | RewardRuleServiceEstimate |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` | 9 | 已自动化(@Test) | 未跟踪 | SpecialPriceService |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` | 4 | 已自动化(@Test) | 未跟踪 | TaskServiceCfEarn |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceReviewTest.java` | 15 | 已自动化(@Test) | 未跟踪 | TaskServiceReview |
@@ -1080,14 +1142,16 @@
 | 来源 | 用例数 | 自动化状态 | 执行状态 | 备注 |
 | --- | --- | --- | --- | --- |
 | `tests/user-scenarios/01-guest.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 13 个 |
-| `tests/user-scenarios/02-parent.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 87 个 |
+| `tests/user-scenarios/02-parent.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 86 个 |
 | `tests/user-scenarios/03-child.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 23 个 |
 | `tests/user-scenarios/04-teacher.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 30 个 |
 | `tests/user-scenarios/05-admin.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 23 个 |
 | `tests/user-scenarios/06-vendor.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 12 个 |
 | `tests/user-scenarios/07-five-dimension.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 18 个 |
+| `tests/user-scenarios/08-butler.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 14 个 |
+| `tests/user-scenarios/09-human-butler.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 12 个 |
 | `tests/user-scenarios/README.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 5 个 |
-| `tests/user-scenarios/应用场景总览.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 29 个 |
+| `tests/user-scenarios/应用场景总览.md` | 文件级 | 用户场景(待自动化) | 未跟踪 | 场景标题约 31 个 |
 
 ## 七、回写与发布流程(本地侧车 → 共享台账)
 

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

@@ -18,3 +18,14 @@
 | B-11 | `/api/cf` 三端点删除(待确认意图) | 研发 | `44b2f0d42`(11-05 00:31,`chore(sync)` 工作区 WIP 收尾)删除 `/api/cf/stats`、`/api/cf/family-summary`、`/api/cf/promotion-earnings` 及前端 3 个封装(-210 行)。**全套 1528 例零转红**,即删除行为无任何用例可证伪。该提交标题为"遗留 WIP 收尾同步",具备误覆盖特征。需研发确认:有意精简 / 误覆盖 → 前者补 `API_REFERENCE.md` 下线记录,后者 revert 并补 3 端点用例 | 测试(36 轮巡检登记) | 2026-11-05 02:48 | 待处理 |
 | B-12 | 3 类 20 个 `@Test` 长期 `@Disabled` | 研发/测试 | `DataMigrationServiceTest`(11,依赖 sfms 数据源)、`TaskServiceMinigameTest`(5,依赖硬编码 userId=1L)、`TeacherLoginTest`(4,依赖硬编码手机号,测试间数据污染) 均类级 `@Disabled`;台账 @Test 1545 与实际执行 1528 差 17 例。根因统一为测试数据夹具缺失。需建 seed 脚本/`@Sql` 夹具后解禁。**口径精确化(37 轮)**:注解 1545 − 20(3 类 @Disabled 内注解)+ 3(surefire 为每个禁用类仍记 1 条 skipped 占位)= 1528,误差 0;已逐类排除「参数化展开」假设(全仓参数化类 注解数=执行数)。 | 测试(36 轮登记/37 轮精确化) | 2026-11-05 02:48 | 待处理 |
 | B-13 | 3 个 @SpringBootTest 类硬编码 127.0.0.1:3306(环境红根因) | 研发/环境 | `AdminFamilyOverviewControllerTest.java:21-22`、`service/FamilyAdminOverviewServiceTest`、`service/UserServiceFamilyNameLinkTest` 三处 `@SpringBootTest(properties={"spring.datasource.url=jdbc:mysql://127.0.0.1:3306/zxyj…"})` 硬编码本机 MySQL;本机无 MySQL → `Connection refused` → `Failed to load ApplicationContext`,**8 例每轮必红**(37 轮实测异常链:BeanCreationException → primaryDataSource → HikariPool$PoolInitializationException → CommunicationsException → ConnectException)。全仓 `grep -rl 127.0.0.1:3306 src/test` 命中恰好这 3 类。**非池压力**(37 轮 `Too many connections` 出现 0 次)。建议:改 `@ActiveProfiles("test")` + `src/test/resources/application-test.yml` 统一指向 192.168.16.251 测试库(池上限 4)。 | 测试(37 轮巡检登记) | 2026-11-05 05:30 | 待处理 |
+| B-14 | 测试窗口内并发提交(基线漂移) | 研发/流程 | 38 轮全量跑测窗口(06:16→07:15,58:41)内 HEAD 由 `345cf745e` 前移至 `f1b0e3ed5`,落入 `8660d7dbe`(SC-G-06 越权拦截:`JwtInterceptor`+3 测试类)与 `0dce400d2`/`f1b0e3ed5`(switchRole:`FamilyMembersController`/`FamilyMemberService`+`FamilyUserSwitchRoleTest`);4 个测试文件 mtime 07:14:57–07:15:12 晚于 `testCompile`(`Compiling 205 source files`)→ 聚合首扫即 `源类 208 / 报告 204 / 沉默 4`。若不补跑将把 41 例新增用例漏记、并把新特性回归风险误报为「零变更」。**已处置**:定向补跑 5 类 46/46 绿(`testCompile` 209 源 0 错)。**遗留**:其余 199 类未在 `f1b0e3ed5` 上重验。建议跑测改 `git worktree` 固定 SHA 或 CI checkout SHA,报告头部固化 `rev-parse HEAD` | 测试(38 轮登记) | 2026-11-05 07:25 | 部分处置(补跑已完成,全量复验待下轮) |
+| B-15 | 度量脚本丢失且从未入库 | 测试/度量 | `discover_tests.py` / `test_inventory.py` 全仓 `find` 无命中,`git log --all` 为空 → 从未提交,属本地未跟踪脚本已被清理;历史台账「覆盖 365 / 跨源用例 2731 / @Test 1545」**不可复现**,跨轮对比失去基准。38 轮改用内联统计(357 控制器 / 1933 `@PostMapping` / 8 `@GetMapping` / 204 测试文件 / 1546 `@Test`)。建议脚本纳入 `docs/tdd/tools/` 并提交,报告注明脚本版本 | 测试(38 轮登记) | 2026-11-05 07:25 | 待处理 |
+| B-16 | 根级 integration 套件缺凭据夹具(12 例恒红) | 测试 | 9082 已在线后套件不再 `fetch failed`,暴露真实根因:`tests/integration/plan-chain.spec.js:21-22` 依赖 `ADMIN_PHONE`/`ADMIN_PASSWORD`(当前为空)→ `[0] 前置环境检查` 收到空串、`[1] 登录` 返回 `code=500 msg=用户不存在`;`mini-games-api.spec.js` 10 例 `Expected 200 / Received 401`(无 token)。判为**测试侧配置缺口**,非生产缺陷。建议新增 `tests/.env.test` + seed 脚本,`globalSetup` 内自动登录取 token,CI 注入 `API_BASE_URL=http://127.0.0.1:9082` | 测试(38 轮登记) | 2026-11-05 07:25 | 待处理 |
+| B-17 | `.tdd/state.json` 与 08:12 轮报告脱节(新增 2 RED 键未落账) | 研发/流程 | 08:12 轮报告(`automation-run-2026-11-05-0812.md`)与提交 `69f8820d8` 说明称新建 `task.parent.createTask` / `task.parent.review` 两个 RED 键并落契约测试(39 轮独立实测 **7 绿 + 17+15=32 绿**,与报告吻合);但本地 `.tdd/state.json` 仍只有 3 键(`health.report.createReport` / `dan.assessment.getActiveMaterial` / `guide.trainingPlan.getPlanDetail`),`updated_at` 仍为 2026-11-04 10:14。**报告说的 ≠ 状态机记的**,看板无法反映真实进展。需走 CLI 补登记(`--add-task` + `--mark-red --commit <sha>`),禁止手改 `state.json` | 测试(39 轮巡检登记) | 2026-11-05 09:40 | 待处理 |
+| B-18 | A 类测试漂移 54 例集中爆发(Mockito 误用 + 断言基线过期) | 研发/测试 | 39 轮全量实测非环境红 112 例/34 类,其中 **A 类 54 例/17 类**可纯测试侧修复:`doNothing()` 用于非 void 方法(`ArticleControllerTest`/`PlannerBindInviteFlowTest`/`DailyCheckinStreakFlowTest`)、matcher 混用(`ProductControllerTest` 3E `InvalidUseOfMatchers`、`ProductOrderServiceFulfillmentMultiModeTest` 6E)、桩名过期(`ProductOrderControllerTest` 6E 打 `confirm`/实现 `confirmReceive`)、反射注入已删字段(`TaskProgressUpdateTest` 3E `NoSuchFieldException: platformPointsService`)、断言基线漂移(`WishControllerTest` 文案 `childId`→`memberId`;`StatsControllerTest`/`MindFortuneControllerTest` 500 vs 5001;`HealthDimensionControllerTest` **期望 500 实得 200**)。**批量修完 54 例后 G1 由 92.41% → ≈95.7%,G2 由 112 → 58**,是当前性价比最高的一步。**精确化(22:13 轮实测,维度合并后首验 28 例 26 绿/2 红)**:`HealthDimensionControllerTest.overview_missingMemberId:58` / `history_missingMemberId:217` 期望 `result.getCode()==500` 实得 `200`——根因=用例调用 `controller.overview(params, 1L, 1L)` / `history(params, 1L, 1L)` **误传 currentMemberId=1L**,实现 `ParamUtils.getLong(params.get("memberId"), currentMemberId)` 触发双角色「家长视角 currentMemberId 兜底」(设计行为)→ memberId=1L 非空走正常路径 200。**测试装置口径错误,非生产缺陷**;修复:第 3 参传 `null`(或断言兜底 200) | 测试(39 轮登记,22:13 轮精确化) | 2026-11-05 09:40 | 待处理 |
+| B-19 | `cfc-langgraph` pytest 长期「未实测」结论已过期,首次实测 19 红 | 测试/研发 | 41 轮(11-05 15:19)探活发现 `cfc-langgraph/.venv/Scripts/python.exe` = **Python 3.12.7**,`pytest 9.2.0` / `fastapi` / `httpx` / `langgraph` 全部可 import → 此前 #28–#40 多轮报告的「无 .venv / 缺 httpx → pytest 47 例未实测」**结论过期**(度量失真,同 N-1 类)。首次实跑 `pytest tests --ignore=tests/qna`:**43 例 24 绿 / 19 红(55.81%)**。19 红分层:**C 环境 14 例**(`401 Authentication Fails, Your api key: ****ocal is invalid` → analyze 2 + auto_tag 5 + chat 1 + intent 4;另 report_parse 2 例因用例写死容器路径 `/app/cfc/docs/参考资料/*.pdf` 在本机 400);**A 测试漂移 5 例**(`test_graph` 2:`GenerateRequest.respondent_name Field required` 而用例仍发 `member_name`;`test_memory` 3:`MemoryManager.__init__() missing 'embeddings'`)。另 `tests/qna/test_graph.py` 收集期 `ModuleNotFoundError: No module named 'src.qna'` → 整模块 0 例可执行(死资产)。建议:①注入测试 LLM 凭据或对 LLM client 全 mock;②`test_report_parse` 路径改相对仓库路径;③删/重写 `tests/qna/test_graph.py`;④pytest 纳入 CI | 测试(41 轮巡检登记) | 2026-11-05 16:20 | 待处理 |
+| B-20 | Playwright 规模扩张至 96 spec 而长期未实测 | 测试/环境 | #40 记录 69 spec / 402 `test()`,#41 复核为 **96 个 spec 文件**(+27),但唯一一次实测是 11-05 12:14 execute 档(用户显式授权联网)的 API 级 83 例(66 绿 / 6 红 / 3 跳过 / 8 串行阻塞,91.67%);UI 级因 `cfc.iwintrue.com` 无前端页面(`/` 404)不可跑。此后各轮均记「未授权联网 → 未实测」。风险:spec 持续增长而信号为零,用例腐化不可见(如 12:14 已发现 2 条路径/断言过期)。建议:①本地 9082 在听时改用 `playwright.config.api.js`(无 globalSetup,不 reset 共享库)纳入每轮;②默认配置的 `globalSetup` 会 `reset-db.sh` 重置共享测试库,禁止在共享环境直接跑;③UI 级待补独立前置环境 | 测试(41 轮登记) | 2026-11-05 16:20 | 待处理 |
+| B-21 | SC-P-11 契约回归(YELLOW 键首次转红) | 研发/测试 | 42 轮全量实测:`TaskControllerReviewTest` 由连续 7 轮 17/17 全绿降为 **15/17**(`pendingReview_parent_success_returnsList:176` 与 `pendingReview_directCall_uniformResultShape:316` 均 NPE)。根因=SC-X-22 合入 `f14e46f84` 在 `TaskController.java:197/205` 新增 `rewardRuleService.attachTaskListEstimate(...)`,而该测试用 `new TaskController()` + 手工注入(`:80-84`)未补 `RewardRuleService` → 字段 null。**性质:A 类(测试夹具未跟进生产新增依赖)**,生产侧 `resolveMemberIdByUser:157`/`attachTaskListEstimate:193` 均有 null 守卫,非生产缺陷。影响:SC-P-11 契约 32 → 30 绿、G8 由「3 红」扩为「5 红」;证明「契约绿无回归网」——无 CI 时绿是瞬时绿。建议:该类补 `@Mock RewardRuleService` 并注入,同批 `grep -l "new TaskController()" src/test` 全量排查 | 测试(42 轮实测登记) | 2026-11-05 18:26 | 待处理(**20:24 轮第 3 次 / 22:13 轮第 4 次复现确认**:同码复跑 15/17、2 例 NPE(pendingReview_directCall:316 + pendingReview_parent:176),维度合并 aa6ccb2dd 后首轮 79 例复验依旧,非瞬时抖动、非维度合并引入;修复方案见 20:24 轮报告 P-1) |
+| B-22 | CF 预估挂载的 N+1 读与鉴权清单无守护 | 研发/测试 | ①**N+1**:`attachTaskListEstimate`(`RewardRuleService:193`)对列表逐条调 `estimate()`,已挂 6 处(`TaskController:109/197/205/358`、`GuideFamilyTaskController:271/295`),命中 `/api/tasks/today`、`/pending-review`、`/today-parent`、规划师任务历史与待审等高频接口;`attachTaskEstimate:186` 用 `catch (Exception) log.warn` 静默吞异常,降级不可见。既有 `RewardRuleServiceEstimateTest` 仅测单条计算,**无「N 条任务 → 查询次数」与「降级仍 200」断言**。②**鉴权清单**:`/api/reward/estimate` 已正确加入 `JwtInterceptor.LOGIN_REQUIRED_PATHS:124-127`,但 11 例契约测试为 standalone MockMvc,不经拦截器 → 该清单条目零断言覆盖(历史上 SEC-20261031-01 / SC-G-06 均因鉴权清单漂移返工)。建议:补批量查询次数断言 + 降级断言;补对 `LOGIN_REQUIRED_PATHS` 全条目的「无 token → 401」参数化契约用例 | 测试(42 轮巡检登记) | 2026-11-05 18:26 | 待处理 |
+| B-23 | SC-X-22 契约测试 15 例未入库 | 测试/流程 | `RewardEstimateControllerEstimateTest`(11) 与 `RewardRuleServiceEstimateTest`(4) 参与 43 轮全量执行且 **15/15 全绿**,但 `git ls-files` 对 `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/`、`.../service/RewardRuleServiceEstimateTest.java` **零命中**(`git status` 为 `??`,mtime 17:34/17:42)→ 只存在于主工作区。任何 `git clean -fd` / 工作区重置都会静默丢失(同类事故已发生:B-15 度量脚本丢失)。且违反「完成 = 已提交 + 工作目录干净」铁律,与 O-3 同源(主工作区本轮仍有 126 项未提交/未跟踪)。建议:`git add` 两路径 → commit + push origin/cfclub → `--clean-check` 复核;测试/契约文件入库纳入 DoD | 测试(43 轮实测登记) | 2026-11-05 21:02 | 待处理 |
+| B-24 | 跑测时延劣化 +18%,结果零漂移(环境时延) | 测试/环境 | 同码复跑对账:XML 单类耗时总和 **1649.3s → 1952.2s(+18.4%)**,Maven **31:36 → 36:49**;用例/F/E/S 完全一致(218 类 1664 例 71F 51E 4S)。增量集中 `@SpringBootTest` 类:GuideOrder +200s、AIChat +120s、Wish +62s、AdminSpecialPrice +53s;期间 `Exception during pool initialization` 8 次(3 类硬编码 `127.0.0.1:3306`,B-13 未修),`Too many connections` 0 次 → 判为外部依赖时延,非代码劣化。风险:长窗口放大 B-14(窗口内并发提交),CI 时长不可估。建议:容器化固定测试库/Redis + 报告中固化「总耗时 / 单类 Top5」基线(±5% 带) | 测试(43 轮实测登记) | 2026-11-05 21:02 | 待处理 |

+ 10 - 6
docs/tdd/test/discovery.md

@@ -7,15 +7,15 @@
 
 | 指标 | 数值 |
 | --- | --- |
-| 控制器总数 | 358 |
-| handler 方法总数 | 1941 |
-| handler 方法已覆盖 | 371 (19.1%) |
-| 单元-全覆盖(handler 方法) | 25 |
+| 控制器总数 | 359 |
+| handler 方法总数 | 1942 |
+| handler 方法已覆盖 | 372 (19.2%) |
+| 单元-全覆盖(handler 方法) | 26 |
 | 单元-部分覆盖(handler 方法) | 192 |
 | 单元-未覆盖(handler 方法) | 140 |
 | 单元-无handler 方法 | 1 |
-| 测试文件数 | 216 |
-| @Test 方法总数 | 1665 |
+| 测试文件数 | 220 |
+| @Test 方法总数 | 1715 |
 | 含跳过/假设项(test 级 partial) | 4 |
 
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
@@ -298,6 +298,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DimensionScoreServiceTest.java` | com | 21 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodRecommendServiceTest.java` | com | 21 | 1 | 0 | FoodRecommendController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideRolePermissionTest.java` | com | 21 | 6 | 9 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/RewardRuleServiceEstimateTest.java` | com | 21 | 3 | 0 | RewardController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` | com | 20 | 11 | 8 | GuideFamilyTaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorChangeServiceSemanticTest.java` | com | 20 | 0 | 0 | IndicatorController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductOrderControllerTest.java` | com | 20 | 3 | 7 | ProductOrderController | — |
@@ -306,6 +307,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/SupplySystemServiceTest.java` | com | 18 | 0 | 0 | SupplySystemController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AIChatControllerTest.java` | com | 17 | 17 | 3 | AIChatController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipServiceTest.java` | com | 17 | 0 | 0 | MembershipController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/RewardEstimateControllerTest.java` | com | 17 | 0 | 1 | RewardEstimateController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerReviewTest.java` | com | 17 | 1 | 4 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ActivityControllerTest.java` | com | 16 | 9 | 6 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/CfGrowthPathwayEarnServiceTest.java` | com | 16 | 6 | 0 | — | — |
@@ -335,6 +337,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` | com | 11 | 0 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/PdfParseServiceTest.java` | com | 11 | 0 | 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/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 | — |
@@ -500,6 +503,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DailyOverviewServiceTest.java` | com | 1 | 1 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorCorrelationServiceTest.java` | com | 1 | 0 | 0 | IndicatorController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorValueMapperTest.java` | com | 1 | 0 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/MembershipControllerPlansLevelOrderTest.java` | com | 1 | 0 | 0 | MembershipController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/mind/MindFortuneControllerTest.java` | com | 1 | 1 | 0 | MindFortuneController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/RecommendationNutritionTagTest.java` | com | 1 | 0 | 0 | RecommendController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` | com | 1 | 0 | 0 | ReportSummaryController | — |

+ 69 - 5
docs/tdd/test/inventory.md

@@ -8,12 +8,12 @@
 
 | 来源类型 | 文件数 | 用例/方法数 |
 | --- | --- | --- |
-| 结构化测试用例(md) | 9 | 729 |
-| Playwright(spec.js) | 73 | 436 |
+| 结构化测试用例(md) | 11 | 784 |
+| Playwright(spec.js) | 76 | 444 |
 | Python(pytest) | 11 | 47 |
-| Java后端(测试文件) | 216 | 1665 (@Test) |
-| 用户场景(md) | 9 | 文件级 |
-| **合计** | — | **2877** 用例/方法 |
+| Java后端(测试文件) | 220 | 1715 (@Test) |
+| 用户场景(md) | 11 | 文件级 |
+| **合计** | — | **2990** 用例/方法 |
 
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 
@@ -105,6 +105,36 @@
 | `TC-A-N07` | 内容安全 | 运营 | P0 | 安全 | `tests/test-cases/admin.md#TC-A-N07` | SSRF 防护 | 禁止内网地址(SSRF 防护);仅白名单外域;超时截断 |
 | `TC-A-N08` | 知识库 | 运营 | P1 | 安全 | `tests/test-cases/admin.md#TC-A-N08` | 上传校验 | 类型校验拒绝;不落盘执行 |
 | `TC-A-N09` | 注销导出 | 运营 | P0 | 安全 | `tests/test-cases/admin.md#TC-A-N09` | 数据导出合规 | 仅工单授权用户可导出;数据脱敏打包;操作留痕审计 |
+| `TC-B-01` | 家长 | P0 | 功能 | 家长 A 已登录;AI 服务可用;知识库已加载 | `tests/test-cases/butler.md#TC-B-01` | - | B-01 / P-49 |
+| `TC-B-02` | 家长 | P0 | 功能 | 家长已配置提醒项(用药 08:00、测评到期);推送通道可用 | `tests/test-cases/butler.md#TC-B-02` | - | B-02 / P-65 |
+| `TC-B-04` | 家长 | P0 | 功能 | 孩子 B 已有入库报告(SC-P-23 / SC-P-91) | `tests/test-cases/butler.md#TC-B-04` | - | B-04 / P-23 |
+| `TC-B-05` | 系统 | P0 | 安全 | 内容安全策略 / 敏感词库已配置 | `tests/test-cases/butler.md#TC-B-05` | - | B-05 / A-13 / T-28 |
+| `TC-B-06` | 系统 | P0 | 异常 | AiGateway` 熔断 / 超时机制就绪;可切换 LangGraph 连通性 | `tests/test-cases/butler.md#TC-B-06` | - | B-06 / P-40 / P-49 |
+| `TC-B-07` | 家长 | P1 | 功能 | 孩子 B 有五维数据与入库报告;B 有过敏记录 | `tests/test-cases/butler.md#TC-B-07` | - | B-07 / P-10 / P-13 / P-28 |
+| `TC-B-09` | 家长 | P1 | 功能 | 家长已绑定规划师(SC-T-02);构造专业信号(持续异常 / 报告高风险) | `tests/test-cases/butler.md#TC-B-09` | - | B-09 / P-36 / X-11 |
+| `TC-B-10` | 家长 | P1 | 功能 | 家庭成员已有能量 / 报告 / 任务 / 方案数据 | `tests/test-cases/butler.md#TC-B-10` | - | B-10 / P-68 / T-16 |
+| `TC-B-11` | 家长 | P1 | 功能 | 已对报告发起过解读(TC-B-04),报告上下文在会话内可追溯 | `tests/test-cases/butler.md#TC-B-11` | - | B-11 / B-04 |
+| `TC-B-12` | 家长 | P1 | 功能 | 规划师方案已激活(SC-P-46 / SC-T-05) | `tests/test-cases/butler.md#TC-B-12` | - | B-12 / P-46 / T-05 |
+| `TC-B-01-E` | 家长 | P2 | 异常 | AI 服务可用 | `tests/test-cases/butler.md#TC-B-01-E` | - | B-01 |
+| `TC-B-02-E` | 家长 | P2 | 异常 | 提醒已配置;免打扰 22:00-08:00 | `tests/test-cases/butler.md#TC-B-02-E` | - | B-02 |
+| `TC-B-04-E` | 家长 | P2 | 异常 | 孩子 B 报告状态可构造 | `tests/test-cases/butler.md#TC-B-04-E` | - | B-04 |
+| `TC-B-05-E` | 系统 | P1 | 安全 | 敏感词库已配置 | `tests/test-cases/butler.md#TC-B-05-E` | - | B-05 |
+| `TC-B-06-E` | 系统 | P1 | 异常 | 可切换连通性 | `tests/test-cases/butler.md#TC-B-06-E` | - | B-06 |
+| `TC-B-07-E` | 家长 | P2 | 异常 | 孩子 B 数据状态可构造 | `tests/test-cases/butler.md#TC-B-07-E` | - | B-07 |
+| `TC-B-09-E` | 家长 | P2 | 异常 | 绑定关系可构造 | `tests/test-cases/butler.md#TC-B-09-E` | - | B-09 |
+| `TC-B-10-E` | 家长 | P2 | 异常 | 家庭成员数据可构造 | `tests/test-cases/butler.md#TC-B-10-E` | - | B-10 |
+| `TC-B-11-E` | 家长 | P3 | 异常 | 报告上下文可构造 | `tests/test-cases/butler.md#TC-B-11-E` | - | B-11 |
+| `TC-B-12-E` | 家长 | P2 | 异常 | 方案状态可构造 | `tests/test-cases/butler.md#TC-B-12-E` | - | B-12 |
+| `TC-B-01-P` | 家长 | P1 | 权限 | 家庭1 + 无关家庭 F9;孩子 / 服务商 / 游客账号 | `tests/test-cases/butler.md#TC-B-01-P` | - | B-01 |
+| `TC-B-02-P` | 家长 | P1 | 权限 | 家庭1 + F9 | `tests/test-cases/butler.md#TC-B-02-P` | - | B-02 |
+| `TC-B-04-P` | 家长 | P1 | 权限 | 家庭1(A+B)+ F9(有报告);规划师 T 仅绑定 F2 | `tests/test-cases/butler.md#TC-B-04-P` | - | B-04 |
+| `TC-B-05-P` | 系统 | P0 | 权限 | 各角色账号 | `tests/test-cases/butler.md#TC-B-05-P` | - | B-05 |
+| `TC-B-06-P` | 系统 | P2 | 权限 | 各角色账号 | `tests/test-cases/butler.md#TC-B-06-P` | - | B-06 |
+| `TC-B-07-P` | 家长 | P1 | 权限 | 家庭1(A+B)+ F9 | `tests/test-cases/butler.md#TC-B-07-P` | - | B-07 |
+| `TC-B-09-P` | 家长 | P1 | 权限 | 家长 A 仅绑定规划师 T1;T2 未绑定 | `tests/test-cases/butler.md#TC-B-09-P` | - | B-09 |
+| `TC-B-10-P` | 家长 | P1 | 权限 | 家庭1 + F9 | `tests/test-cases/butler.md#TC-B-10-P` | - | B-10 |
+| `TC-B-11-P` | 家长 | P1 | 权限 | 家庭1 + F9 报告 | `tests/test-cases/butler.md#TC-B-11-P` | - | B-11 |
+| `TC-B-12-P` | 家长 | P1 | 权限 | 家庭1 + F9 方案 | `tests/test-cases/butler.md#TC-B-12-P` | - | B-12 |
 | `TC-C-01` | 权限/双角色 | 孩子 | P0 | 权限 | `tests/test-cases/child.md#TC-C-01` | 双角色铁律:孩子端不能切家长 | 进入孩子端首页;**无切换家长入口**;直接拼家长路由被 role 校验拦截 |
 | `TC-C-02` | 任务 | 孩子 | P0 | 功能 | `tests/test-cases/child.md#TC-C-02` | TaskController | 状态→待家长审核;完成动作写入记录;重复提交不重复计分 |
 | `TC-C-03` | 小游戏 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-03` | pages/games/* | 得分按规则计算;积分/能量到账;成绩入榜;中途退出不计分 |
@@ -250,6 +280,10 @@
 | `TC-X-19-P` | 跨角色 | P0 | 权限 | 家庭1 / F2 / F9 | `tests/test-cases/cross-role-e2e.md#TC-X-19-P` | - | X-19 |
 | `TC-X-20-P` | 跨角色 | P1 | 权限 | 家庭1 + F9 | `tests/test-cases/cross-role-e2e.md#TC-X-20-P` | - | X-20 |
 | `TC-X-21-P` | 跨角色 | P1 | 权限 | 家庭1 + F9 | `tests/test-cases/cross-role-e2e.md#TC-X-21-P` | - | X-21 |
+| `TC-X-22` | 跨角色 | P0 | 功能 | 家庭1(家长A+孩子B);CF 规则已配置:任务审核通过 +20、方案任务打卡 +10、商城下单满 99 +50;B 当日 CF 与五维能量均未触顶;已装各端 | `tests/test-cases/cross-role-e2e.md#TC-X-22` | - | X-22 / P-10、C-05、X-07、T-6 |
+| `TC-X-22-E` | 跨角色 | P1 | 异常 | 家庭1;CF 规则可配活动倍率/日上限;可注入规则未配置、超时 | `tests/test-cases/cross-role-e2e.md#TC-X-22-E` | - | X-22 / P-87、C-25、P-89、P-93 |
+| `TC-X-22-E2` | 跨角色 | P2 | 异常 | 规则存在但值为 0;存在消耗型产出点(心愿兑换/商城兑换) | `tests/test-cases/cross-role-e2e.md#TC-X-22-E2` | - | X-22 / P-13、C-04、X-12 |
+| `TC-X-22-P` | 跨角色 | P1 | 权限 | 家庭1(A+B)、无关家庭 F9、游客账号、孩子/服务商/运营账号 | `tests/test-cases/cross-role-e2e.md#TC-X-22-P` | - | X-22 / P-77、X-07 |
 | `TC-X-N01` | 跨角色 | P0 | 性能 | 多家庭并发(≥10 家庭) | `tests/test-cases/cross-role-e2e.md#TC-X-N01` | - | X-01 |
 | `TC-X-N02` | 跨角色 | P0 | 性能 | 多家庭同时生成方案 | `tests/test-cases/cross-role-e2e.md#TC-X-N02` | - | X-03 |
 | `TC-X-N03` | 跨角色 | P0 | 性能 | 活动名额 100,瞬时 500 请求 | `tests/test-cases/cross-role-e2e.md#TC-X-N03` | - | X-15 |
@@ -315,6 +349,27 @@
 | `TC-G-N03` | 非微信H5 | 游客 | P2 | 兼容 | `tests/test-cases/guest.md#TC-G-N03` | H5 兜底 | 功能可用;无微信 SDK 依赖报错;流程闭环 |
 | `TC-G-N04` | 落地页 | 游客 | P0 | 安全 | `tests/test-cases/guest.md#TC-G-N04` | 接口鉴权 | 返回 401;不泄露数据与结构 |
 | `TC-G-N05` | 登录注册 | 游客 | P0 | 安全 | `tests/test-cases/guest.md#TC-G-N05` | 登录限流 | 触发限流/锁定;验证码一次性;防爆破;无撞库成功 |
+| `TC-H-01` | 真人管家 | P0 | 功能 | 家长 A 已触发 AI 升级(来自 SC-B-09 或异常预警);已开通真人管家服务 | `tests/test-cases/human-butler.md#TC-H-01` | - | H-01 / B-09 |
+| `TC-H-02` | 真人管家 | P0 | 功能 | 家长已开通真人管家服务(套餐 / 权益有效) | `tests/test-cases/human-butler.md#TC-H-02` | - | H-02 / P-32 |
+| `TC-H-03` | 真人管家 | P1 | 功能 | 已建立家长-规划师-管家三方服务关系 | `tests/test-cases/human-butler.md#TC-H-03` | - | H-03 / X-11 / T-16 |
+| `TC-H-04` | 真人管家 | P0 | 功能 | 升级 / 应急 SOP 已配置;值班与紧急联系人就绪 | `tests/test-cases/human-butler.md#TC-H-04` | - | H-04 / A-13 |
+| `TC-H-05` | 真人管家 | P1 | 功能 | 线下资源库 / 活动已录入并通过审核;服务商资源可用 | `tests/test-cases/human-butler.md#TC-H-05` | - | H-05 / P-44 |
+| `TC-H-06` | 真人管家 | P1 | 功能 | AI 升级工单已处理完成(TC-H-01) | `tests/test-cases/human-butler.md#TC-H-06` | - | H-06 / B-01 / B-09 |
+| `TC-H-07` | 系统 | P1 | 功能 | 质检规则与满意度问卷已配置;存在已完成的服务会话与工单 | `tests/test-cases/human-butler.md#TC-H-07` | - | H-07 / A-13 |
+| `TC-H-01-E` | 真人管家 | P2 | 异常 | 升级队列可用 | `tests/test-cases/human-butler.md#TC-H-01-E` | - | H-01 |
+| `TC-H-02-E` | 真人管家 | P2 | 异常 | 服务权益可构造 | `tests/test-cases/human-butler.md#TC-H-02-E` | - | H-02 |
+| `TC-H-03-E` | 真人管家 | P3 | 异常 | 三方关系可构造 | `tests/test-cases/human-butler.md#TC-H-03-E` | - | H-03 |
+| `TC-H-04-E` | 真人管家 | P1 | 异常 | 应急 SOP 已配置 | `tests/test-cases/human-butler.md#TC-H-04-E` | - | H-04 |
+| `TC-H-05-E` | 真人管家 | P2 | 异常 | 资源库可构造 | `tests/test-cases/human-butler.md#TC-H-05-E` | - | H-05 |
+| `TC-H-06-E` | 真人管家 | P2 | 异常 | 反哺通道可用 | `tests/test-cases/human-butler.md#TC-H-06-E` | - | H-06 |
+| `TC-H-07-E` | 系统 | P2 | 异常 | 质检规则可构造 | `tests/test-cases/human-butler.md#TC-H-07-E` | - | H-07 |
+| `TC-H-01-P` | 真人管家 | P1 | 权限 | 家庭1 + F9;管家仅服务家庭1 | `tests/test-cases/human-butler.md#TC-H-01-P` | - | H-01 |
+| `TC-H-02-P` | 真人管家 | P1 | 权限 | 管家仅服务家庭1 | `tests/test-cases/human-butler.md#TC-H-02-P` | - | H-02 |
+| `TC-H-03-P` | 真人管家 | P1 | 权限 | 三方关系 + F9 | `tests/test-cases/human-butler.md#TC-H-03-P` | - | H-03 |
+| `TC-H-04-P` | 真人管家 | P0 | 权限 | 各角色账号 | `tests/test-cases/human-butler.md#TC-H-04-P` | - | H-04 |
+| `TC-H-05-P` | 真人管家 | P1 | 权限 | 服务商 V 仅可维护自家资源 | `tests/test-cases/human-butler.md#TC-H-05-P` | - | H-05 |
+| `TC-H-06-P` | 真人管家 | P1 | 权限 | 知识库审核权归运营 | `tests/test-cases/human-butler.md#TC-H-06-P` | - | H-06 |
+| `TC-H-07-P` | 系统 | P0 | 权限 | 绩效看板仅授权角色可见 | `tests/test-cases/human-butler.md#TC-H-07-P` | - | H-07 |
 | `TC-P-01` | 家庭 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-01` | FamilyInviteController | 家庭创建成功;生成唯一邀请码+二维码(令牌+落地页);角色变家庭管理员 |
 | `TC-P-02` | 家庭/成员 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-02` | FamilyInviteController | C 加入家庭,成员列表出现 C |
 | `TC-P-03` | 成员资料 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-03` | FamilyMembersController | 成员卡片正确显示;关系标签可选(RelationshipPicker) |
@@ -769,9 +824,12 @@
 | `tests/e2e/ai-plan-task-flow.spec.js` | 7 | `tests/e2e/ai-plan-task-flow.spec.js` |
 | `tests/e2e/api/api-smoke.spec.js` | 4 | `tests/e2e/api/api-smoke.spec.js` |
 | `tests/e2e/api/article-api.spec.js` | 7 | `tests/e2e/api/article-api.spec.js` |
+| `tests/e2e/api/butler-fallback.spec.js` | 4 | `tests/e2e/api/butler-fallback.spec.js` |
 | `tests/e2e/api/contact-api.spec.js` | 6 | `tests/e2e/api/contact-api.spec.js` |
 | `tests/e2e/api/energy-api.spec.js` | 8 | `tests/e2e/api/energy-api.spec.js` |
 | `tests/e2e/api/family-member-api.spec.js` | 14 | `tests/e2e/api/family-member-api.spec.js` |
+| `tests/e2e/api/generated/tc-scripted.spec.js` | 0 | `tests/e2e/api/generated/tc-scripted.spec.js` |
+| `tests/e2e/api/human-butler-workorder.spec.js` | 4 | `tests/e2e/api/human-butler-workorder.spec.js` |
 | `tests/e2e/api/nonfunc-perf-compat.spec.js` | 5 | `tests/e2e/api/nonfunc-perf-compat.spec.js` |
 | `tests/e2e/api/nonfunc-security.spec.js` | 11 | `tests/e2e/api/nonfunc-security.spec.js` |
 | `tests/e2e/api/sc-p-03-switch-role.spec.js` | 11 | `tests/e2e/api/sc-p-03-switch-role.spec.js` |
@@ -875,6 +933,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | cfc-backend | 6 | HealthReportControllerProxyParseBinding | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | cfc-backend | 2 | IndicatorController | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | cfc-backend | 10 | IndicatorFavoriteController | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/MembershipControllerPlansLevelOrderTest.java` | cfc-backend | 1 | MembershipControllerPlansLevelOrder | `cfc-backend/src/test/java/com/etotem/cfc/controller/MembershipControllerPlansLevelOrderTest.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` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` | cfc-backend | 4 | AdminButlerControllerEnvelope | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` |
@@ -890,6 +949,8 @@
 | `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` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` | cfc-backend | 10 | TrainingPlanControllerGetPlanList | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/RewardEstimateControllerEstimateTest.java` | cfc-backend | 11 | RewardEstimateControllerEstimate | `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/RewardEstimateControllerEstimateTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/RewardEstimateControllerTest.java` | cfc-backend | 17 | RewardEstimateController | `cfc-backend/src/test/java/com/etotem/cfc/controller/reward/RewardEstimateControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerCreateTaskTest.java` | cfc-backend | 7 | TaskControllerCreateTask | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerCreateTaskTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerReviewTest.java` | cfc-backend | 17 | TaskControllerReview | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerReviewTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | cfc-backend | 3 | ActivityDTO | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` |
@@ -1006,6 +1067,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportAnalyzeQuotaServiceTest.java` | cfc-backend | 6 | ReportAnalyzeQuotaService | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportAnalyzeQuotaServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportDateExtractorTest.java` | cfc-backend | 6 | ReportDateExtractor | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportDateExtractorTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` | cfc-backend | 1 | ReportSummaryServiceCompleteness | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/RewardRuleServiceEstimateTest.java` | cfc-backend | 21 | RewardRuleServiceEstimate | `cfc-backend/src/test/java/com/etotem/cfc/service/RewardRuleServiceEstimateTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` | cfc-backend | 9 | SpecialPriceService | `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` | cfc-backend | 4 | TaskServiceCfEarn | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceReviewTest.java` | cfc-backend | 15 | TaskServiceReview | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceReviewTest.java` |
@@ -1081,6 +1143,8 @@
 | `tests/user-scenarios/05-admin.md` | `tests/user-scenarios/05-admin.md` |
 | `tests/user-scenarios/06-vendor.md` | `tests/user-scenarios/06-vendor.md` |
 | `tests/user-scenarios/07-five-dimension.md` | `tests/user-scenarios/07-five-dimension.md` |
+| `tests/user-scenarios/08-butler.md` | `tests/user-scenarios/08-butler.md` |
+| `tests/user-scenarios/09-human-butler.md` | `tests/user-scenarios/09-human-butler.md` |
 | `tests/user-scenarios/README.md` | `tests/user-scenarios/README.md` |
 | `tests/user-scenarios/应用场景总览.md` | `tests/user-scenarios/应用场景总览.md` |
 

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません