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

docs(tdd): 以真实发现替换虚构播种台账(SRS/cases/discovery)

Agnes Agent 1 неделя назад
Родитель
Сommit
8eff023e7f
3 измененных файлов с 815 добавлено и 54 удалено
  1. 274 31
      docs/tdd/SRS.md
  2. 186 23
      docs/tdd/test/cases.md
  3. 355 0
      docs/tdd/test/discovery.md

+ 274 - 31
docs/tdd/SRS.md

@@ -1,35 +1,278 @@
-# CFC(浠艾福 XAF)TDD 能力键台账
+# CFC · TDD 覆盖台账(自动发现 · 不发明)
 
 
-> 本文件是 `tdd-orchestrator` skill 的**需求侧数据源**(`docs_interface`)。
-> 解析口径(skill 硬编码):区段以 `## SRS 能力键(TDD 池源)` 起始,到下一个 `## ` 标题结束;
-> 仅解析 `|` 开头、且拆出 ≥8 列的表格行;第 2 列为能力键(须 `unit.domain.action` 三段式),第 6 列为状态。
-> 状态:`⏳` = 未实现(进入 TDD 目标池的门槛);`✅` = 已实现(仅作契约化标注,不入池)。
->
-> ⚠️ **种子声明**:本台账的 `⏳` 条目为依据 CFC 现有控制器与 cfclub 新特性清单**初步推导的种子**,
-> 并非经核实的真实缺口。上线前请用 `tools/xaf_agent_hub/tasks_backlog.json` 与 cfclub 特性清单核对替换。
-> 能力键单元(unit)取自 CFC 真实控制器域:auth / family / health / article / dimension / indicator / guide / dailyTask。
+> 生成依据:`tdd-orchestrator/scripts/discover_tests.py` 对 `cfc-backend` 的只读扫描。
+> **本仓库模式**:TDD 编排器在 CFC 的定位是 **发现 / 格式化 / 跟踪已有测试**,
+> **不创建测试用例、不发明需求缺口**。所有数据来自仓库真实测试源代码。完整明细见 `docs/tdd/test/discovery.md`。
 
 
 ## SRS 能力键(TDD 池源)
 ## SRS 能力键(TDD 池源)
 
 
-| 来源页面 | 能力键 | 所属单元 | 能力域 | 动作类 | 状态 | 备注 |
-| --- | --- | --- | --- | --- | --- | --- |
-| cfc-backend AuthController | auth.user.login | auth | user | login | ✅ | 已实现,AuthControllerTest 覆盖 |
-| cfc-backend FamilyMembersController | family.member.list | family | member | list | ✅ | 已实现,FamilyMembersControllerListTest 覆盖 |
-| cfc-backend HealthReportController | health.report.upload | health | report | upload | ✅ | 已实现,HealthReportControllerProxyParseBindingTest 覆盖 |
-| cfc-backend ArticleController | article.category.list | article | category | list | ✅ | 已实现,ArticleCategoryControllerTest 覆盖 |
-| cfc-backend DimensionAdminController | dimension.admin.update | dimension | admin | update | ✅ | 已实现,DimensionAdminControllerTest 覆盖 |
-| cfc-backend IndicatorFavoriteController | indicator.favorite.add | indicator | favorite | add | ✅ | 已实现,IndicatorFavoriteControllerTest 覆盖 |
-| cfclub 新特性·家庭邀请二维码 | family.invite.qrcode | family | invite | qrcode | ⏳ | 种子·待核实实现状态 |
-| cfclub 新特性·健康报告解析 | health.report.parse | health | report | parse | ⏳ | 种子·待核实实现状态 |
-| cfclub 新特性·文章发布-审核 | article.review.submit | article | review | submit | ⏳ | 种子·待核实实现状态 |
-| cfclub 新特性·成长规划师接单 | guide.order.create | guide | order | create | ⏳ | 种子·待核实实现状态 |
-| cfclub 新特性·每日任务提醒 | dailytask.remind.push | dailytask | remind | push | ⏳ | 种子·待核实实现状态 |
-
-## 说明
-
-- 本台账与 `docs/tdd/test/cases.md`(测试用例台账)联动:目标池 = `⏳` 键 ∩ 被用例引用的键。
-- `ops_file`(`**/*Ops.java`)当前在 CFC 无匹配文件,故能力键暂无「★已契约化」标注;
-  若后续采用契约常量约定,可新建 `*Ops.java` 写入 `"unit.domain.action"` 字符串常量。
-- `module_root` 为空(CFC 为单模块 `cfc-backend`,非 Maven `-impl`/`-contract` 布局):
-  skill 的 RED/GREEN 自动提示与 git 证据判定按 `<unit>-impl/src/{test,main}` 生成,对 CFC 单模块不适用,
-  仅 `--status` 只读池视图完全可用;写链路(RED/GREEN 派发)需按 CFC 实际路径二次适配。
+> CFC 采用「发现模式」:**不在本文档播种任何 `⏳` 虚构缺口键**。
+> 能力键池由 `discovery.md` 的真实覆盖缺口(uncovered / partial 控制器)推导;
+> 若要把某缺口转化为测试任务,走 `tdd_orchestrate.py --add-task <unit.domain.action> --requirement <源> --design <源>` 显式入池(须带溯源锚点)。
+
+## 一、整体汇总
+
+| 指标 | 数值 |
+| --- | --- |
+| 控制器总数 | 356 |
+| handler 方法总数 | 1918 |
+| handler 已覆盖 | 198 (10%) |
+| 控制器-已全覆盖(covered) | 16 |
+| 控制器-部分覆盖(partial) | 68 |
+| 控制器-未覆盖(uncovered) | 271 |
+| 控制器-无 handler | 1 |
+| 测试文件数 | 182 |
+| @Test 方法总数 | 1371 |
+| 含跳过/假设项(test 级 partial) | 4 |
+
+## 二、模块覆盖分布(按 handler 覆盖率,降序)
+
+| 模块 | 控制器 | handler | 已覆盖 | 覆盖率 |
+| --- | --- | --- | --- | --- |
+| admin | 120 | 648 | 28 | 4% |
+| guide | 19 | 121 | 26 | 21% |
+| family | 15 | 94 | 15 | 16% |
+| HealthReportController.java | 1 | 59 | 0 | 0% |
+| product | 6 | 49 | 13 | 27% |
+| content | 5 | 32 | 5 | 16% |
+| mind | 8 | 32 | 3 | 9% |
+| DanAssessmentController.java | 1 | 29 | 0 | 0% |
+| task | 3 | 28 | 0 | 0% |
+| HealthKnowledgeBaseController.java | 1 | 28 | 1 | 4% |
+| assessment | 6 | 27 | 1 | 4% |
+| auth | 2 | 21 | 14 | 67% |
+| growth | 2 | 20 | 4 | 20% |
+| ai | 5 | 20 | 4 | 20% |
+| diet | 5 | 19 | 0 | 0% |
+| MembershipController.java | 1 | 17 | 4 | 24% |
+| fatloss | 4 | 16 | 0 | 0% |
+| CircleController.java | 1 | 16 | 1 | 6% |
+| OrchestrationController.java | 1 | 15 | 0 | 0% |
+| recommendation | 5 | 15 | 0 | 0% |
+| KeyPersonController.java | 1 | 14 | 0 | 0% |
+| nutrition | 2 | 14 | 0 | 0% |
+| ActivityController.java | 1 | 13 | 6 | 46% |
+| CommissionController.java | 1 | 13 | 1 | 8% |
+| HealthPlanController.java | 1 | 13 | 1 | 8% |
+| user | 3 | 12 | 0 | 0% |
+| stats | 1 | 12 | 4 | 33% |
+| wish | 1 | 12 | 11 | 92% |
+| BadgeController.java | 1 | 11 | 0 | 0% |
+| wealth | 3 | 11 | 0 | 0% |
+| reward | 2 | 11 | 0 | 0% |
+| CouponController.java | 1 | 10 | 0 | 0% |
+| TaskTemplatePackageController.java | 1 | 10 | 0 | 0% |
+| UserController.java | 1 | 10 | 0 | 0% |
+| subscription | 1 | 10 | 1 | 10% |
+| GutHealthProjectController.java | 1 | 9 | 0 | 0% |
+| MarketController.java | 1 | 9 | 0 | 0% |
+| PearlController.java | 1 | 9 | 0 | 0% |
+| butler | 2 | 9 | 1 | 11% |
+| EnergyController.java | 1 | 9 | 5 | 56% |
+| ContactController.java | 1 | 8 | 0 | 0% |
+| DanReportController.java | 1 | 8 | 0 | 0% |
+| FamilyChallengeController.java | 1 | 8 | 0 | 0% |
+| PurchaseController.java | 1 | 8 | 0 | 0% |
+| dan | 1 | 7 | 0 | 0% |
+| planner | 1 | 7 | 0 | 0% |
+| ShareController.java | 1 | 7 | 0 | 0% |
+| StreetController.java | 1 | 7 | 0 | 0% |
+| tianpan | 1 | 7 | 0 | 0% |
+| shop | 4 | 7 | 1 | 14% |
+| DoaController.java | 1 | 7 | 1 | 14% |
+| ContactMatchController.java | 1 | 6 | 0 | 0% |
+| CouponGiftController.java | 1 | 6 | 0 | 0% |
+| FamilyEarningsController.java | 1 | 6 | 0 | 0% |
+| FamilyPlatformBalanceController.java | 1 | 6 | 0 | 0% |
+| PackagePaymentController.java | 1 | 6 | 0 | 0% |
+| PromotionMaterialController.java | 1 | 6 | 0 | 0% |
+| ServiceRoleApplicationController.java | 1 | 6 | 0 | 0% |
+| config | 4 | 6 | 2 | 33% |
+| FoodRecommendController.java | 1 | 6 | 2 | 33% |
+| IndicatorController.java | 1 | 6 | 2 | 33% |
+| cart | 1 | 5 | 0 | 0% |
+| HealthCircleController.java | 1 | 5 | 0 | 0% |
+| HealthGrowthRecordController.java | 1 | 5 | 0 | 0% |
+| MealRecommendController.java | 1 | 5 | 0 | 0% |
+| MediaController.java | 1 | 5 | 0 | 0% |
+| MiniGameController.java | 1 | 5 | 0 | 0% |
+| ReportMemberPermissionController.java | 1 | 5 | 0 | 0% |
+| parent | 2 | 5 | 2 | 40% |
+| ActivityOrderController.java | 1 | 5 | 1 | 20% |
+| DailyCheckinController.java | 1 | 5 | 4 | 80% |
+| GameRecordController.java | 1 | 5 | 1 | 20% |
+| HealthDimensionController.java | 1 | 5 | 4 | 80% |
+| HealthMealController.java | 1 | 5 | 1 | 20% |
+| InviteController.java | 1 | 5 | 2 | 40% |
+| PointsExchangeController.java | 1 | 5 | 1 | 20% |
+| SurveyController.java | 1 | 5 | 1 | 20% |
+| AttributionController.java | 1 | 4 | 0 | 0% |
+| DistributionInviteController.java | 1 | 4 | 0 | 0% |
+| HealthCheckinController.java | 1 | 4 | 0 | 0% |
+| HealthStatusController.java | 1 | 4 | 0 | 0% |
+| HomeController.java | 1 | 4 | 0 | 0% |
+| MicroActionController.java | 1 | 4 | 0 | 0% |
+| RegionController.java | 1 | 4 | 0 | 0% |
+| UserIntentController.java | 1 | 4 | 0 | 0% |
+| VirtualPayController.java | 1 | 4 | 0 | 0% |
+| wisdom | 2 | 4 | 0 | 0% |
+| ConsentController.java | 1 | 4 | 2 | 50% |
+| OctopusController.java | 1 | 4 | 1 | 25% |
+| ActivityFeedbackController.java | 1 | 3 | 0 | 0% |
+| ActivityMaterialController.java | 1 | 3 | 0 | 0% |
+| DailyFeedbackController.java | 1 | 3 | 0 | 0% |
+| GrowthController.java | 1 | 3 | 0 | 0% |
+| GrowthTaskController.java | 1 | 3 | 0 | 0% |
+| HealthExerciseController.java | 1 | 3 | 0 | 0% |
+| InviteCardController.java | 1 | 3 | 0 | 0% |
+| PromotionController.java | 1 | 3 | 0 | 0% |
+| ReportParserController.java | 1 | 3 | 0 | 0% |
+| ReportSummaryController.java | 1 | 3 | 0 | 0% |
+| UserSegmentationController.java | 1 | 3 | 0 | 0% |
+| CfCommissionController.java | 1 | 3 | 1 | 33% |
+| ReportSurveyController.java | 1 | 3 | 1 | 33% |
+| ReviewController.java | 1 | 3 | 1 | 33% |
+| vendor | 1 | 3 | 1 | 33% |
+| CfBalanceController.java | 1 | 3 | 3 | 100% |
+| IndicatorFavoriteController.java | 1 | 3 | 3 | 100% |
+| CfTransferController.java | 1 | 2 | 0 | 0% |
+| CircleChallengeController.java | 1 | 2 | 0 | 0% |
+| DataPermissionController.java | 1 | 2 | 0 | 0% |
+| HealthAlertController.java | 1 | 2 | 0 | 0% |
+| HealthMeditationController.java | 1 | 2 | 0 | 0% |
+| HealthScoreController.java | 1 | 2 | 0 | 0% |
+| HealthSleepController.java | 1 | 2 | 0 | 0% |
+| InviteMilestoneController.java | 1 | 2 | 0 | 0% |
+| notice | 1 | 2 | 0 | 0% |
+| OnboardingController.java | 1 | 2 | 0 | 0% |
+| PackageLogisticsController.java | 1 | 2 | 0 | 0% |
+| ProblemPackageController.java | 1 | 2 | 0 | 0% |
+| profile | 1 | 2 | 0 | 0% |
+| RecommendController.java | 1 | 2 | 0 | 0% |
+| ReferralLeaderboardController.java | 1 | 2 | 0 | 0% |
+| publicapi | 1 | 2 | 0 | 0% |
+| UserNotificationController.java | 1 | 2 | 0 | 0% |
+| UserNutritionProfileController.java | 1 | 2 | 0 | 0% |
+| WithdrawalController.java | 1 | 2 | 0 | 0% |
+| XiaoeWebhookController.java | 1 | 2 | 0 | 0% |
+| sncp | 1 | 2 | 0 | 0% |
+| BasicQuotaController.java | 1 | 2 | 1 | 50% |
+| EmiReportController.java | 1 | 2 | 1 | 50% |
+| HealthWaterController.java | 1 | 2 | 1 | 50% |
+| NutritionistController.java | 1 | 2 | 1 | 50% |
+| ProblemSurveyController.java | 1 | 2 | 1 | 50% |
+| PromotionCommissionController.java | 1 | 2 | 1 | 50% |
+| StreakController.java | 1 | 2 | 2 | 100% |
+| AbilityController.java | 1 | 1 | 0 | 0% |
+| CommonController.java | 1 | 1 | 0 | 0% |
+| ContentFilterController.java | 1 | 1 | 0 | 0% |
+| FamilyHealthController.java | 1 | 1 | 0 | 0% |
+| HealthInteractionController.java | 1 | 1 | 0 | 0% |
+| HealthPlanPublicController.java | 1 | 1 | 0 | 0% |
+| HealthTimelineController.java | 1 | 1 | 0 | 0% |
+| HomeBannerController.java | 1 | 1 | 0 | 0% |
+| PosterTemplateController.java | 1 | 1 | 0 | 0% |
+| ProblemDomainController.java | 1 | 1 | 0 | 0% |
+| SeedEnergyController.java | 1 | 1 | 0 | 0% |
+| ZodiacEnergyController.java | 1 | 1 | 0 | 0% |
+| DailyTaskController.java | 1 | 1 | 1 | 100% |
+| special | 1 | 1 | 1 | 100% |
+| UnlockController.java | 1 | 1 | 1 | 100% |
+| mcp | 1 | 0 | 0 | 0% |
+
+## 三、未覆盖控制器(真实缺口 · Top 40)
+
+> 以下控制器**无任何 handler 被测试命中**,是真实扫描得到的覆盖缺口。
+
+- `AdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java`,65 方法)
+- `HealthReportController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java`,59 方法)
+- `DanAssessmentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java`,29 方法)
+- `AdminArticleController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminArticleController.java`,22 方法)
+- `TaskController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/task/TaskController.java`,18 方法)
+- `FamilyUserController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyUserController.java`,17 方法)
+- `AdminInventoryController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminInventoryController.java`,16 方法)
+- `FamilyInviteController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyInviteController.java`,15 方法)
+- `OrchestrationController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/OrchestrationController.java`,15 方法)
+- `KeyPersonController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/KeyPersonController.java`,14 方法)
+- `AdminCouponController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminCouponController.java`,12 方法)
+- `SupplySystemController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplySystemController.java`,12 方法)
+- `BadgeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/BadgeController.java`,11 方法)
+- `SupplyHierarchyController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplyHierarchyController.java`,11 方法)
+- `TrainingPlanController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/TrainingPlanController.java`,11 方法)
+- `AdminGuideController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminGuideController.java`,10 方法)
+- `CouponController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/CouponController.java`,10 方法)
+- `GuideController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideController.java`,10 方法)
+- `ProcurementTaskController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/product/ProcurementTaskController.java`,10 方法)
+- `TaskTemplatePackageController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/TaskTemplatePackageController.java`,10 方法)
+- `TeacherController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/TeacherController.java`,10 方法)
+- `UserController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/UserController.java`,10 方法)
+- `AdminButlerController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminButlerController.java`,9 方法)
+- `FamilyMembersController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyMembersController.java`,9 方法)
+- `FileRecordController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/FileRecordController.java`,9 方法)
+- `GutHealthProjectController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/GutHealthProjectController.java`,9 方法)
+- `KnowledgeBaseController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/KnowledgeBaseController.java`,9 方法)
+- `MarketController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/MarketController.java`,9 方法)
+- `PearlController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/PearlController.java`,9 方法)
+- `PpointConfigAdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/PpointConfigAdminController.java`,9 方法)
+- `AdminActivityController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminActivityController.java`,8 方法)
+- `AdminAuthController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminAuthController.java`,8 方法)
+- `ArticleCommentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/content/ArticleCommentController.java`,8 方法)
+- `ContactController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ContactController.java`,8 方法)
+- `DanReportController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanReportController.java`,8 方法)
+- `FamilyChallengeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/FamilyChallengeController.java`,8 方法)
+- `PurchaseController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/PurchaseController.java`,8 方法)
+- `SupplyManageController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplyManageController.java`,8 方法)
+- `SysMenuController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SysMenuController.java`,8 方法)
+- `TaskReminderController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/task/TaskReminderController.java`,8 方法)
+- …(其余 231 个见 discovery.md)
+
+## 四、部分覆盖控制器(已做一部分测试)
+
+> 这些控制器**已有测试但只覆盖了部分方法**——即「已经做了一部分测试的情况,要能够找到」。
+
+- `HealthKnowledgeBaseController`:覆盖 1/28,未覆盖:batchQuery、list、add、update、delete、importKnowledgeBase、queryBacteria、batchQueryBacteria、queryIndicator、queryFood
+- `ProductOrderController`:覆盖 7/19,未覆盖:myOrderCounts、vendorConfirm、reviewUpdate、ship、applyRefund、handlePaymentSuccess、notify、activityAudit、activitySignIn、activityComplete
+- `AuthController`:覆盖 14/18,未覆盖:setSwitchPassword、verifyToken、ssoTicket、ssoLogin
+- `GuideManagementController`:覆盖 3/17,未覆盖:resubmitApplication、getUserApplications、getApplicationRecords、generateInviteCode、getInviteCodes、validateInviteCode、getChildGuides、getAllChildGuides、getParentGuide、getGuidePackageTemplates
+- `MembershipController`:覆盖 4/17,未覆盖:getAllLevels、getMyMembership、getUpgradeRecords、upgradeOrder、activateTrial、createOrder、continueOrder、getPricingPlans、getMembershipCompare、paymentNotify
+- `ArticleController`:覆盖 4/16,未覆盖:relatedProducts、related、relatedByProduct、getArticleAudio、reportReadingTime、readingStats、dailyTip、aiQuestions、submitAnswers、publish
+- `CircleController`:覆盖 1/16,未覆盖:myCircles、discover、join、leave、create、update、pendingMembers、approve、feed、multiFeed
+- `ReportParserAdminController`:覆盖 1/15,未覆盖:listTypes、toggleType、deleteType、listFingerprints、saveFingerprint、deleteFingerprint、listImports、uploadImport、approveImport、rejectImport
+- `ActivityController`:覆盖 6/13,未覆盖:submitReview、register、cancelRegistration、myRegistrations、registrationRoster、checkin、checkinReview
+- `CommissionController`:覆盖 1/13,未覆盖:list、team、stats、balance、teamList、funnel、teamConsumption、myReferrer、teamTree、teamGrowthCurve
+- `GrowthRecordController`:覆盖 4/13,未覆盖:getRecordList、getChildRecords、getRecordDetail、deleteRecord、syncExternalResult、createFromUpload、createSupplement、checkDuplicate、getSupplements
+- `HealthPlanController`:覆盖 1/13,未覆盖:generate、regenerateSection、save、confirm、list、detail、planTasks、availableTeachers、listPendingReview、updatePlan
+- `StatsController`:覆盖 4/12,未覆盖:getDashboardSummary、getRevenueStats、getMembershipStats、childOverview、familySummary、pointsRanking、getTrafficAnalytics、recordProductView
+- `WishController`:覆盖 11/12,未覆盖:priceAlias
+- `PaymentController`:覆盖 5/11,未覆盖:createWechatNativePay、getPaymentStatus、getOAuth2Url、oauth2Callback、handleV3Notify、generateQrCode
+- `AdminVirtualTeamController`:覆盖 1/10,未覆盖:list、create、update、toggle、addMember、removeMember、updateMember、userTeams、tree
+- `GuideFamilyTaskController`:覆盖 8/10,未覆盖:unbindFamily、getDashboardStats
+- `SubscriptionController`:覆盖 1/10,未覆盖:getPlans、createOrder、subscribe、cancel、setAutoRenew、getMyBenefits、checkBenefit、getTier、updateTier
+- `AIChatController`:覆盖 3/9,未覆盖:reportAnalyze、deleteConversation、sendNutritionMessage、sendHealthCoachMessage、sendHealthButlerMessage、transcribe
+- `AdminProductController`:覆盖 1/9,未覆盖:list、review、shelve、detail、create、update、copy、delete
+- `EnergyController`:覆盖 5/9,未覆盖:configureSourceRatios、getScoreHistory、getFamilyScoreHistory、getWealthDetail
+- `FiveDimensionSelfCheckController`:覆盖 3/9,未覆盖:submit、getHistory、ignoreSelfCheck、generatePlan、getTrendAnalysis、aiGenerateQuestions
+- `ProductController`:覆盖 6/9,未覆盖:updateImages、specMap、relatedProducts
+- `CognitiveController`:覆盖 1/8,未覆盖:getChildCognitiveScores、getFamilyCognitiveScores、updateCognitiveScore、getRecommendations、createTaskFromRecommendation、getNorms、submitSelfTest
+- `GuideTeamController`:覆盖 6/8,未覆盖:checkStatus、leaveTeam
+- `DoaController`:覆盖 1/7,未覆盖:createStage、stageDetail、cancelStage、submitPlan、submitReview、weekList
+- `EmotionCheckinController`:覆盖 2/7,未覆盖:create、list、stats、weeklyReport、recognizeEmotion
+- `AdminEnergyConfigController`:覆盖 1/6,未覆盖:sourceList、sourceSave、sourceDelete、dailyLimits、dailyLimitSave
+- `AdminGuidePopupController`:覆盖 1/6,未覆盖:list、create、update、delete、stats
+- `AdminPlannerExamController`:覆盖 1/6,未覆盖:papers、createPaper、updatePaper、deletePaper、saveQuestions
+- `AdminSpecialPriceController`:覆盖 4/6,未覆盖:list、update
+- `ButlerController`:覆盖 1/6,未覆盖:apply、getProfile、updateProfile、getServiceRecords、getCommissions
+- `FoodRecommendController`:覆盖 2/6,未覆盖:getIndex、getHistory、getByFamily、getCautionFoods
+- `IndicatorController`:覆盖 2/6,未覆盖:quickLookup、sourceTypes、periods、correlationList
+- `ActivityOrderController`:覆盖 1/5,未覆盖:create、pay、handlePaymentSuccess、notify
+- `AdminCommissionConfigController`:覆盖 1/5,未覆盖:getConfig、updateConfig、settle、refund
+- `AdminOrgStatsController`:覆盖 2/5,未覆盖:families、active、revenue
+- `DailyCheckinController`:覆盖 4/5,未覆盖:detail
+- `GameRecordController`:覆盖 1/5,未覆盖:getHistory、getBestScores、getStats、getLeaderboard
+- `HealthDimensionController`:覆盖 4/5,未覆盖:radarData
+- …(其余 28 个见 discovery.md)
+
+## 五、使用说明
+
+- 刷新覆盖台账:`python3 tdd-orchestrator/scripts/discover_tests.py --project <repo> --out docs/tdd/test/discovery.md`
+- 本台账与 `discovery.md` 均为只读扫描产物,不改动任何源码。

+ 186 - 23
docs/tdd/test/cases.md

@@ -1,25 +1,188 @@
-# CFC(浠艾福 XAF)测试用例台账
+# CFC · TDD 测试用例台账(真实发现)
 
 
-> 本文件是 `tdd-orchestrator` skill 的**测试侧数据源**(`test_dir`)。
-> 解析口径(skill 硬编码):仅解析以 `| TC-` 开头的表格行、且拆出 ≥6 列;
-> 第 2 列=用例编号,第 3 列=优先级(P0/P1),第 6 列=「关联能力键 / 页面」,
-> 只取 `/` 之前部分、抽取反引号内的 `unit.domain.action` 能力键(4 段 `web.*`/`pda.*` 不计入)。
->
-> ⚠️ 本台账与 `../SRS.md` 联动:只有被本台账引用的 `⏳` 键才会进入 TDD 目标池。
-> 下表前 5 条对应 SRS 的 `⏳` 种子键;后 2 条对应 `✅` 已实现键(仅展示覆盖,不入池)。
+> 由 `discover_tests.py` 从 `cfc-backend/src/test/java` 自动格式化。共 182 个测试文件、1371 个 `@Test` 方法。
 
 
-| 用例编号 | 优先级 | 测试类型 | 测试点 | 关联能力键 / 页面 |
-| --- | --- | --- | --- | --- |
-| TC-CFC-001 | P0 | 契约级单测 | 家庭邀请二维码生成、令牌校验、落地页绑定 | `family.invite.qrcode` / web.family.invite |
-| TC-CFC-002 | P0 | 契约级单测 | 健康报告异步解析入库、异常回退 | `health.report.parse` / web.health.report |
-| TC-CFC-003 | P1 | 契约级单测 | 文章提交审核、审核通过/驳回状态机 | `article.review.submit` / web.article.review |
-| TC-CFC-004 | P1 | 契约级单测 | 成长规划师接单创建、状态流转 | `guide.order.create` / web.guide.order |
-| TC-CFC-005 | P2 | 契约级单测 | 每日任务提醒推送触发与去重 | `dailytask.remind.push` / web.dailytask.remind |
-| TC-CFC-101 | P0 | 契约级单测 | 登录鉴权、JWT 拦截(已实现回归) | `auth.user.login` / web.auth.login |
-| TC-CFC-102 | P1 | 契约级单测 | 家庭成员列表分页与权限(已实现回归) | `family.member.list` / web.family.member |
-
-## 结果回填(可选)
-
-> 已部署端点的实测结果放 `docs/tdd/test/results/*functional*.md`,
-> 按 `| FE1-* | ... | POST | <路径> | <判定> | ... |` 回填(路径 `/family/invite/qrcode` → `family.invite.qrcode`)。
-> 当前 CFC 暂无 E1 功能报告,故执行结果数据源为空(不影响 `⏳` 新功能池)。
+| 测试文件 | 类型 | @Test数 | 命中端点 | 直接调用方法数 | 目标类 | 部分/跳过 |
+| --- | --- | --- | --- | --- | --- | --- |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AuthControllerTest.java` | com | 39 | 0 | 14 | AuthController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DanReportParseServiceTest.java` | com | 38 | 2 | 0 | DanReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfPathwayEarnServiceTest.java` | com | 32 | 16 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/WishControllerTest.java` | com | 29 | 4 | 11 | WishController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfBalanceServiceTest.java` | com | 25 | 0 | 0 | CfBalanceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorChangeServiceTest.java` | com | 23 | 0 | 0 | IndicatorController | — |
+| `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/integration/service/DimensionScoreServiceTest.java` | com | 21 | 0 | 0 | — | — |
+| `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/integration/controller/ProductOrderControllerTest.java` | com | 20 | 3 | 7 | ProductOrderController | — |
+| `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/service/FoodRecommendServiceTest.java` | com | 18 | 0 | 0 | FoodRecommendController | — |
+| `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/integration/controller/ActivityControllerTest.java` | com | 16 | 9 | 6 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductControllerTest.java` | com | 16 | 8 | 6 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfGrowthPathwayEarnServiceTest.java` | com | 16 | 6 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/HealthDimensionControllerTest.java` | com | 15 | 3 | 4 | HealthDimensionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityOrderServiceTest.java` | com | 15 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ArticleWorkflowTest.java` | com | 14 | 0 | 0 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/NutritionDeficiencyServiceTest.java` | com | 14 | 0 | 0 | — | — |
+| `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/integration/service/GuidePackageServiceTest.java` | com | 13 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/PaymentControllerTest.java` | com | 12 | 17 | 5 | PaymentController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodServiceTest.java` | com | 12 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceSettleTest.java` | com | 12 | 2 | 0 | CfCommissionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorTimelineServiceTest.java` | com | 12 | 24 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ConditionEvaluatorServiceTest.java` | com | 12 | 7 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FiveDimensionScoreServiceTest.java` | com | 12 | 10 | 0 | — | — |
+| `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/controller/ArticleControllerTest.java` | com | 11 | 7 | 4 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DataMigrationServiceTest.java` | com | 11 | 5 | 0 | DataMigrationController | ⚠部分 |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/PdfParseServiceTest.java` | com | 11 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfReferralServiceSalesTierTest.java` | com | 11 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfSpendDispatchServiceTest.java` | com | 11 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | com | 10 | 8 | 3 | IndicatorFavoriteController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/GrowthRecordSyncFlowTest.java` | com | 10 | 9 | 4 | GrowthController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityAdminServiceTest.java` | com | 10 | 9 | 0 | ActivityController | — |
+| `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/ActivityAuditTest.java` | com | 10 | 4 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | com | 10 | 0 | 0 | HealthPlanController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` | com | 9 | 0 | 0 | AdminController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/PlannerBindInviteFlowTest.java` | com | 9 | 15 | 5 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideTeamControllerTest.java` | com | 9 | 6 | 5 | GuideTeamController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FamilyFoodOverviewServiceTest.java` | com | 9 | 9 | 0 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorTrendServiceTest.java` | com | 9 | 17 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/PlatformPointsServiceTest.java` | com | 9 | 2 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` | com | 9 | 0 | 0 | SpecialPriceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/BundlePricingCalculatorTest.java` | com | 9 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | com | 9 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` | com | 9 | 6 | 0 | KnowledgeBaseController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AdminSpecialPriceControllerTest.java` | com | 8 | 12 | 4 | AdminSpecialPriceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` | com | 8 | 1 | 3 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` | com | 8 | 11 | 3 | GuideOrderController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideApplicationServiceTest.java` | com | 8 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationEngineTest.java` | com | 8 | 0 | 0 | OrchestrationController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfEarnDispatchServiceTest.java` | com | 8 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceAuditConfirmTest.java` | com | 8 | 0 | 0 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceTest.java` | com | 8 | 0 | 0 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceSpecialDealTest.java` | com | 8 | 1 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/RealNameBackfillServiceTest.java` | com | 8 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationQuotaUnitTest.java` | com | 8 | 3 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleAutoTagServiceTest.java` | com | 8 | 0 | 0 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionRedlinesTest.java` | com | 8 | 0 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/CfBalanceControllerTest.java` | com | 8 | 7 | 3 | CfBalanceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/util/CfFormulaEvaluatorTest.java` | com | 8 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | com | 7 | 11 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java` | com | 7 | 22 | 5 | EnergyController | ⚠部分 |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideFamilyServiceTest.java` | com | 7 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationIntegrationTest.java` | com | 7 | 0 | 0 | OrchestrationController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/task/TaskCheckinWebhookReminderTaskTest.java` | com | 7 | 0 | 0 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | com | 7 | 10 | 0 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthCheckinCfEarnCallSiteTest.java` | com | 6 | 0 | 2 | HealthCheckinController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthPlanDeleteControllerTest.java` | com | 6 | 3 | 2 | HealthPlanController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | com | 6 | 0 | 1 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` | com | 6 | 13 | 6 | DailyCheckinController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/StatsControllerTest.java` | com | 6 | 10 | 2 | StatsController | — |
+| `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/integration/service/GuidePackageTemplateServiceTest.java` | com | 6 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ReportBlockAssemblerTest.java` | com | 6 | 16 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceContentServiceTest.java` | com | 6 | 0 | 0 | ServiceContentController | — |
+| `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/service/ActivityRegistrationQuotaConcurrencyTest.java` | com | 6 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfTransferServiceTest.java` | com | 6 | 0 | 0 | CfTransferController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorFavoriteServiceTest.java` | com | 6 | 6 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipPaySwitchTest.java` | com | 6 | 10 | 0 | MembershipController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceFulfillmentMultiModeTest.java` | com | 6 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ReportAnalyzeQuotaServiceTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ReportDateExtractorTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` | com | 6 | 0 | 0 | WithdrawalController | — |
+| `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/GuidePlanReviewControllerAuthTest.java` | com | 6 | 1 | 4 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanDeleteCascadeTest.java` | com | 6 | 1 | 0 | HealthPlanController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/MemberPriceResolverTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleApproveTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/util/SpearmanUtilTest.java` | com | 6 | 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/integration/service/DimensionEnergySyncServiceTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/MiniGameServiceTest.java` | com | 5 | 0 | 0 | MiniGameController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/RelationshipQuestionnaireServiceTest.java` | com | 5 | 0 | 0 | RelationshipQuestionnaireController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TaskServiceMinigameTest.java` | com | 5 | 0 | 0 | TaskController | ⚠部分 |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerWiringTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CommissionServiceReferralF24Test.java` | com | 5 | 0 | 0 | CommissionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyJoinRequestServiceReferrerBindTest.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/service/HealthReportServiceBackfillResilienceTest.java` | com | 5 | 7 | 0 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/NumSoulCalculatorTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderComboStockTest.java` | com | 5 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` | com | 5 | 0 | 0 | UserController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/task/VirtualPayTimeoutTaskTest.java` | com | 5 | 0 | 0 | VirtualPayController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTagServiceTest.java` | com | 5 | 1 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionAdjustServiceTest.java` | com | 5 | 3 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/BundlePricingServiceTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyNamingSupportTest.java` | com | 5 | 0 | 0 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanLazyBackfillTest.java` | com | 5 | 0 | 0 | HealthPlanController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductSkuComboServiceTest.java` | com | 5 | 0 | 0 | ProductSkuController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductUpdateClearTest.java` | com | 5 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` | com | 4 | 1 | 1 | AdminController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` | com | 4 | 1 | 0 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/GuideModuleIntegrationTest.java` | com | 4 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ChallengeScoreServiceTest.java` | com | 4 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FortuneServiceTest.java` | com | 4 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceTypeServiceTest.java` | com | 4 | 0 | 0 | ServiceTypeController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TeacherLoginTest.java` | com | 4 | 0 | 0 | TeacherController | ⚠部分 |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CommissionDistService410Test.java` | com | 4 | 0 | 0 | CommissionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceWealthIncomeTest.java` | com | 4 | 0 | 0 | EnergyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorMappingServiceTest.java` | com | 4 | 0 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/PointsExchangeServiceTest.java` | com | 4 | 0 | 0 | PointsExchangeController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` | com | 4 | 0 | 0 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/TencentTtsServiceAuthorizationTest.java` | com | 4 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/WishServiceTest.java` | com | 4 | 0 | 0 | WishController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/impl/CfGrowthEarnCallSiteTest.java` | com | 4 | 1 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/impl/PurchaseServiceImplRenewalTest.java` | com | 4 | 5 | 0 | PurchaseController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | com | 4 | 4 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java` | com | 4 | 2 | 0 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` | com | 3 | 5 | 1 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/ReportParserAdminControllerTest.java` | com | 3 | 0 | 1 | ReportParserAdminController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | com | 3 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AdminFamilyOverviewControllerTest.java` | com | 3 | 0 | 2 | AdminFamilyOverviewController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleCategoryControllerTest.java` | com | 3 | 0 | 1 | ArticleCategoryController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/SpecialPriceControllerTest.java` | com | 3 | 8 | 1 | SpecialPriceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ArticleAudioServiceChunkFilterTest.java` | com | 3 | 0 | 0 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerMigrationServiceTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyAdminOverviewServiceTest.java` | com | 3 | 4 | 0 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceIndicatorsTest.java` | com | 3 | 26 | 0 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/NormalizeIndicatorPipelineTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/PaymentServiceORDRoutingTest.java` | com | 3 | 1 | 0 | PaymentController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceUpdateExpressFieldTest.java` | com | 3 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/task/OrderTimeoutCancelTaskSpecialDealTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationListTest.java` | com | 3 | 5 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationRejectTest.java` | com | 3 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/CartServiceTest.java` | com | 3 | 0 | 0 | CartController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyServiceBindTest.java` | com | 3 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductDTOMappingTest.java` | com | 3 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductOrderServiceTest.java` | com | 3 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/RepeatTaskGeneratorPassThroughTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ReviewCenterSummaryTest.java` | com | 3 | 0 | 0 | ReviewController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleFilterTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskProgressUpdateTest.java` | com | 3 | 0 | 0 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | com | 2 | 1 | 1 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` | com | 2 | 1 | 1 | DailyTaskController | — |
+| `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/service/CfCommissionServiceTest.java` | com | 2 | 0 | 0 | CfCommissionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ConsigneeServiceBackfillTest.java` | com | 2 | 0 | 0 | ConsigneeController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceFamilyTest.java` | com | 2 | 0 | 0 | EnergyController | — |
+| `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/unit/ArticleBackfillTest.java` | com | 2 | 0 | 0 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionPipelineMockTest.java` | com | 2 | 36 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionPlanServiceTest.java` | com | 2 | 8 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductListNutritionTagFilterTest.java` | com | 2 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` | com | 1 | 0 | 0 | AttributionController | — |
+| `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/integration/service/DailyOverviewServiceTest.java` | com | 1 | 1 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/AiGatewayTimeoutTest.java` | com | 1 | 2 | 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/service/ReportSummaryServiceCompletenessTest.java` | com | 1 | 0 | 0 | ReportSummaryController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/RecommendationNutritionTagTest.java` | com | 1 | 0 | 0 | RecommendController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/common/TestRoles.java` | com | 0 | 0 | 0 | — | — |

+ 355 - 0
docs/tdd/test/discovery.md

@@ -0,0 +1,355 @@
+# TDD 测试发现 Ledger(自动扫描 · 只读)
+
+> 生成依据:`tdd-orchestrator/scripts/discover_tests.py` 扫描 `cfc-backend\src\main\java` 与 `cfc-backend\src\test\java`。
+> 本 ledger 仅**格式化与跟踪已有测试**,不创建任何测试用例。覆盖判定兼容两种风格:HTTP 端点 + 直接方法调用。
+
+## 一、汇总
+
+| 指标 | 数值 |
+| --- | --- |
+| 控制器总数 | 356 |
+| handler 方法总数 | 1918 |
+| handler 已覆盖 | 198 (10.3%) |
+| 控制器-已全覆盖(covered) | 16 |
+| 控制器-部分覆盖(partial) | 68 |
+| 控制器-未覆盖(uncovered) | 271 |
+| 控制器-无 handler | 1 |
+| 测试文件数 | 182 |
+| @Test 方法总数 | 1371 |
+| 含跳过/假设项(test 级 partial) | 4 |
+
+## 二、未覆盖控制器(发现「缺口」· 非发明)
+
+> 以下控制器在当前测试源中**没有任何 handler 方法被命中**。这是真实扫描得到的覆盖缺口。
+
+共 271 个:
+
+- `AdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java`,65 方法)
+- `HealthReportController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java`,59 方法)
+- `DanAssessmentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java`,29 方法)
+- `AdminArticleController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminArticleController.java`,22 方法)
+- `TaskController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/task/TaskController.java`,18 方法)
+- `FamilyUserController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyUserController.java`,17 方法)
+- `AdminInventoryController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminInventoryController.java`,16 方法)
+- `FamilyInviteController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyInviteController.java`,15 方法)
+- `OrchestrationController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/OrchestrationController.java`,15 方法)
+- `KeyPersonController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/KeyPersonController.java`,14 方法)
+- `AdminCouponController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminCouponController.java`,12 方法)
+- `SupplySystemController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplySystemController.java`,12 方法)
+- `BadgeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/BadgeController.java`,11 方法)
+- `SupplyHierarchyController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplyHierarchyController.java`,11 方法)
+- `TrainingPlanController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/TrainingPlanController.java`,11 方法)
+- `AdminGuideController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminGuideController.java`,10 方法)
+- `CouponController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/CouponController.java`,10 方法)
+- `GuideController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideController.java`,10 方法)
+- `ProcurementTaskController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/product/ProcurementTaskController.java`,10 方法)
+- `TaskTemplatePackageController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/TaskTemplatePackageController.java`,10 方法)
+- `TeacherController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/TeacherController.java`,10 方法)
+- `UserController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/UserController.java`,10 方法)
+- `AdminButlerController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminButlerController.java`,9 方法)
+- `FamilyMembersController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyMembersController.java`,9 方法)
+- `FileRecordController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/FileRecordController.java`,9 方法)
+- `GutHealthProjectController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/GutHealthProjectController.java`,9 方法)
+- `KnowledgeBaseController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/KnowledgeBaseController.java`,9 方法)
+- `MarketController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/MarketController.java`,9 方法)
+- `PearlController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/PearlController.java`,9 方法)
+- `PpointConfigAdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/PpointConfigAdminController.java`,9 方法)
+- `AdminActivityController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminActivityController.java`,8 方法)
+- `AdminAuthController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminAuthController.java`,8 方法)
+- `ArticleCommentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/content/ArticleCommentController.java`,8 方法)
+- `ContactController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ContactController.java`,8 方法)
+- `DanReportController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanReportController.java`,8 方法)
+- `FamilyChallengeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/FamilyChallengeController.java`,8 方法)
+- `PurchaseController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/PurchaseController.java`,8 方法)
+- `SupplyManageController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplyManageController.java`,8 方法)
+- `SysMenuController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SysMenuController.java`,8 方法)
+- `TaskReminderController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/task/TaskReminderController.java`,8 方法)
+- `AdminDistributionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminDistributionController.java`,7 方法)
+- `AdminOrgController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminOrgController.java`,7 方法)
+- `AdminProductOrderController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminProductOrderController.java`,7 方法)
+- `AdminUnlockGateController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminUnlockGateController.java`,7 方法)
+- `AssessmentAdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AssessmentAdminController.java`,7 方法)
+- `BeijingNutritionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/nutrition/BeijingNutritionController.java`,7 方法)
+- `DanAssessmentExecutionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/dan/DanAssessmentExecutionController.java`,7 方法)
+- `GrowthPlanController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/growth/GrowthPlanController.java`,7 方法)
+- `GuideActivityController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideActivityController.java`,7 方法)
+- `NutritionProductController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/nutrition/NutritionProductController.java`,7 方法)
+- `PlannerCertificationController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/planner/PlannerCertificationController.java`,7 方法)
+- `ShareController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ShareController.java`,7 方法)
+- `StreetController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/StreetController.java`,7 方法)
+- `TianpanController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/tianpan/TianpanController.java`,7 方法)
+- `AdminCommissionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminCommissionController.java`,6 方法)
+- `AdminEnergyRuleController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminEnergyRuleController.java`,6 方法)
+- `AdminFoodController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminFoodController.java`,6 方法)
+- `AdminHomeBannerController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminHomeBannerController.java`,6 方法)
+- `AdminNoticeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminNoticeController.java`,6 方法)
+- `AdminPeriodicServiceController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminPeriodicServiceController.java`,6 方法)
+- …(其余 211 个见完整扫描)
+
+## 三、部分覆盖控制器(已做一部分测试)
+
+> 这些控制器**已有测试但只覆盖了部分方法**——即用户要求的「已经做了一部分测试的情况,要能够找到」。
+
+共 68 个:
+
+- `HealthKnowledgeBaseController`:覆盖 1/28,未覆盖方法:batchQuery、list、add、update、delete、importKnowledgeBase、queryBacteria、batchQueryBacteria、queryIndicator、queryFood
+- `ProductOrderController`:覆盖 7/19,未覆盖方法:myOrderCounts、vendorConfirm、reviewUpdate、ship、applyRefund、handlePaymentSuccess、notify、activityAudit、activitySignIn、activityComplete
+- `AuthController`:覆盖 14/18,未覆盖方法:setSwitchPassword、verifyToken、ssoTicket、ssoLogin
+- `GuideManagementController`:覆盖 3/17,未覆盖方法:resubmitApplication、getUserApplications、getApplicationRecords、generateInviteCode、getInviteCodes、validateInviteCode、getChildGuides、getAllChildGuides、getParentGuide、getGuidePackageTemplates
+- `MembershipController`:覆盖 4/17,未覆盖方法:getAllLevels、getMyMembership、getUpgradeRecords、upgradeOrder、activateTrial、createOrder、continueOrder、getPricingPlans、getMembershipCompare、paymentNotify
+- `ArticleController`:覆盖 4/16,未覆盖方法:relatedProducts、related、relatedByProduct、getArticleAudio、reportReadingTime、readingStats、dailyTip、aiQuestions、submitAnswers、publish
+- `CircleController`:覆盖 1/16,未覆盖方法:myCircles、discover、join、leave、create、update、pendingMembers、approve、feed、multiFeed
+- `ReportParserAdminController`:覆盖 1/15,未覆盖方法:listTypes、toggleType、deleteType、listFingerprints、saveFingerprint、deleteFingerprint、listImports、uploadImport、approveImport、rejectImport
+- `ActivityController`:覆盖 6/13,未覆盖方法:submitReview、register、cancelRegistration、myRegistrations、registrationRoster、checkin、checkinReview
+- `CommissionController`:覆盖 1/13,未覆盖方法:list、team、stats、balance、teamList、funnel、teamConsumption、myReferrer、teamTree、teamGrowthCurve
+- `GrowthRecordController`:覆盖 4/13,未覆盖方法:getRecordList、getChildRecords、getRecordDetail、deleteRecord、syncExternalResult、createFromUpload、createSupplement、checkDuplicate、getSupplements
+- `HealthPlanController`:覆盖 1/13,未覆盖方法:generate、regenerateSection、save、confirm、list、detail、planTasks、availableTeachers、listPendingReview、updatePlan
+- `StatsController`:覆盖 4/12,未覆盖方法:getDashboardSummary、getRevenueStats、getMembershipStats、childOverview、familySummary、pointsRanking、getTrafficAnalytics、recordProductView
+- `WishController`:覆盖 11/12,未覆盖方法:priceAlias
+- `PaymentController`:覆盖 5/11,未覆盖方法:createWechatNativePay、getPaymentStatus、getOAuth2Url、oauth2Callback、handleV3Notify、generateQrCode
+- `AdminVirtualTeamController`:覆盖 1/10,未覆盖方法:list、create、update、toggle、addMember、removeMember、updateMember、userTeams、tree
+- `GuideFamilyTaskController`:覆盖 8/10,未覆盖方法:unbindFamily、getDashboardStats
+- `SubscriptionController`:覆盖 1/10,未覆盖方法:getPlans、createOrder、subscribe、cancel、setAutoRenew、getMyBenefits、checkBenefit、getTier、updateTier
+- `AIChatController`:覆盖 3/9,未覆盖方法:reportAnalyze、deleteConversation、sendNutritionMessage、sendHealthCoachMessage、sendHealthButlerMessage、transcribe
+- `AdminProductController`:覆盖 1/9,未覆盖方法:list、review、shelve、detail、create、update、copy、delete
+- `EnergyController`:覆盖 5/9,未覆盖方法:configureSourceRatios、getScoreHistory、getFamilyScoreHistory、getWealthDetail
+- `FiveDimensionSelfCheckController`:覆盖 3/9,未覆盖方法:submit、getHistory、ignoreSelfCheck、generatePlan、getTrendAnalysis、aiGenerateQuestions
+- `ProductController`:覆盖 6/9,未覆盖方法:updateImages、specMap、relatedProducts
+- `CognitiveController`:覆盖 1/8,未覆盖方法:getChildCognitiveScores、getFamilyCognitiveScores、updateCognitiveScore、getRecommendations、createTaskFromRecommendation、getNorms、submitSelfTest
+- `GuideTeamController`:覆盖 6/8,未覆盖方法:checkStatus、leaveTeam
+- `DoaController`:覆盖 1/7,未覆盖方法:createStage、stageDetail、cancelStage、submitPlan、submitReview、weekList
+- `EmotionCheckinController`:覆盖 2/7,未覆盖方法:create、list、stats、weeklyReport、recognizeEmotion
+- `AdminEnergyConfigController`:覆盖 1/6,未覆盖方法:sourceList、sourceSave、sourceDelete、dailyLimits、dailyLimitSave
+- `AdminGuidePopupController`:覆盖 1/6,未覆盖方法:list、create、update、delete、stats
+- `AdminPlannerExamController`:覆盖 1/6,未覆盖方法:papers、createPaper、updatePaper、deletePaper、saveQuestions
+- `AdminSpecialPriceController`:覆盖 4/6,未覆盖方法:list、update
+- `ButlerController`:覆盖 1/6,未覆盖方法:apply、getProfile、updateProfile、getServiceRecords、getCommissions
+- `FoodRecommendController`:覆盖 2/6,未覆盖方法:getIndex、getHistory、getByFamily、getCautionFoods
+- `IndicatorController`:覆盖 2/6,未覆盖方法:quickLookup、sourceTypes、periods、correlationList
+- `ActivityOrderController`:覆盖 1/5,未覆盖方法:create、pay、handlePaymentSuccess、notify
+- `AdminCommissionConfigController`:覆盖 1/5,未覆盖方法:getConfig、updateConfig、settle、refund
+- `AdminOrgStatsController`:覆盖 2/5,未覆盖方法:families、active、revenue
+- `DailyCheckinController`:覆盖 4/5,未覆盖方法:detail
+- `GameRecordController`:覆盖 1/5,未覆盖方法:getHistory、getBestScores、getStats、getLeaderboard
+- `HealthDimensionController`:覆盖 4/5,未覆盖方法:radarData
+- `HealthMealController`:覆盖 1/5,未覆盖方法:list、daily、weekly、alerts
+- `InviteController`:覆盖 2/5,未覆盖方法:bind、list、getQrCode
+- `MbtiController`:覆盖 2/5,未覆盖方法:submit、profile、history
+- `PointsExchangeController`:覆盖 1/5,未覆盖方法:getProductList、getProductDetail、exchangeProduct、getExchangeStats
+- `SurveyController`:覆盖 1/5,未覆盖方法:activeTemplates、confirmQuestions、submit、history
+- `TeacherFamilyBindingController`:覆盖 1/5,未覆盖方法:approve、reject、myRequests、cancel
+- `AdminUnifiedKnowledgeController`:覆盖 1/4,未覆盖方法:section、update、reset
+- `ConsentController`:覆盖 2/4,未覆盖方法:withdrawConsent、checkConsent
+- `OctopusController`:覆盖 1/4,未覆盖方法:tentacles、addHelpLog、deleteHelpLog
+- `ParentAssessmentController`:覆盖 2/4,未覆盖方法:createAssessment、completeAssessment
+- `SupplyTeamController`:覆盖 1/4,未覆盖方法:listCustomers、bindCustomer、getRelation
+- `AdminHealthPlanController`:覆盖 1/3,未覆盖方法:list、detail
+- `AdminPackageController`:覆盖 1/3,未覆盖方法:approvePackage、rejectPackage
+- `BindInviteController`:覆盖 2/3,未覆盖方法:confirmBind
+- `CfCommissionController`:覆盖 1/3,未覆盖方法:rate、list
+- `ManualDimensionScoreController`:覆盖 1/3,未覆盖方法:submit、history
+- `ReportSurveyController`:覆盖 1/3,未覆盖方法:createSurvey、submitSurvey
+- `ReviewController`:覆盖 1/3,未覆盖方法:getReviewOrderDetail、getReviewStatus
+- `ScreeningController`:覆盖 1/3,未覆盖方法:submit、history
+- `VendorController`:覆盖 1/3,未覆盖方法:apply、getVendorInfo
+- `AdminProfileController`:覆盖 1/2,未覆盖方法:getProfile
+- `BasicQuotaController`:覆盖 1/2,未覆盖方法:getAllQuotaStatus
+- `EmiReportController`:覆盖 1/2,未覆盖方法:getFamilyLatestReports
+- `HealthWaterController`:覆盖 1/2,未覆盖方法:list
+- `NutritionistController`:覆盖 1/2,未覆盖方法:apply
+- `ProblemSurveyController`:覆盖 1/2,未覆盖方法:submit
+- `ProductCategoryController`:覆盖 1/2,未覆盖方法:tree
+- `PromotionCommissionController`:覆盖 1/2,未覆盖方法:getFamilyTotal
+
+## 四、测试清单(格式化已有测试)
+
+| 测试文件 | 类型 | @Test数 | 命中端点 | 直接调用方法数 | 目标类 | 部分/跳过 |
+| --- | --- | --- | --- | --- | --- | --- |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AuthControllerTest.java` | com | 39 | 0 | 14 | AuthController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DanReportParseServiceTest.java` | com | 38 | 2 | 0 | DanReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfPathwayEarnServiceTest.java` | com | 32 | 16 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/WishControllerTest.java` | com | 29 | 4 | 11 | WishController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfBalanceServiceTest.java` | com | 25 | 0 | 0 | CfBalanceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorChangeServiceTest.java` | com | 23 | 0 | 0 | IndicatorController | — |
+| `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/controller/GuideRolePermissionTest.java` | com | 21 | 6 | 9 | GuideController | — |
+| `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 | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodRecommendServiceTest.java` | com | 18 | 0 | 0 | FoodRecommendController | — |
+| `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/integration/controller/ActivityControllerTest.java` | com | 16 | 9 | 6 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfGrowthPathwayEarnServiceTest.java` | com | 16 | 6 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductControllerTest.java` | com | 16 | 8 | 6 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityOrderServiceTest.java` | com | 15 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/HealthDimensionControllerTest.java` | com | 15 | 3 | 4 | HealthDimensionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ArticleWorkflowTest.java` | com | 14 | 0 | 0 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/NutritionDeficiencyServiceTest.java` | com | 14 | 0 | 0 | — | — |
+| `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/integration/service/GuidePackageServiceTest.java` | com | 13 | 0 | 0 | GuideController | — |
+| `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 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FiveDimensionScoreServiceTest.java` | com | 12 | 10 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodServiceTest.java` | com | 12 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorTimelineServiceTest.java` | com | 12 | 24 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/PaymentControllerTest.java` | com | 12 | 17 | 5 | PaymentController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleControllerTest.java` | com | 11 | 7 | 4 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfReferralServiceSalesTierTest.java` | com | 11 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfSpendDispatchServiceTest.java` | com | 11 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DataMigrationServiceTest.java` | com | 11 | 5 | 0 | DataMigrationController | skip×1、⚠部分 |
+| `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/integration/service/ActivityAdminServiceTest.java` | com | 10 | 9 | 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/integration/GrowthRecordSyncFlowTest.java` | com | 10 | 9 | 4 | GrowthController | — |
+| `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/controller/IndicatorFavoriteControllerTest.java` | com | 10 | 8 | 3 | IndicatorFavoriteController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` | com | 9 | 0 | 0 | AdminController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/BundlePricingCalculatorTest.java` | com | 9 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FamilyFoodOverviewServiceTest.java` | com | 9 | 9 | 0 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | com | 9 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideTeamControllerTest.java` | com | 9 | 6 | 5 | GuideTeamController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorTrendServiceTest.java` | com | 9 | 17 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` | com | 9 | 6 | 0 | KnowledgeBaseController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/PlannerBindInviteFlowTest.java` | com | 9 | 15 | 5 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/PlatformPointsServiceTest.java` | com | 9 | 2 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` | com | 9 | 0 | 0 | SpecialPriceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationQuotaUnitTest.java` | com | 8 | 3 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AdminSpecialPriceControllerTest.java` | com | 8 | 12 | 4 | AdminSpecialPriceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleAutoTagServiceTest.java` | com | 8 | 0 | 0 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionRedlinesTest.java` | com | 8 | 0 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/CfBalanceControllerTest.java` | com | 8 | 7 | 3 | CfBalanceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfEarnDispatchServiceTest.java` | com | 8 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/util/CfFormulaEvaluatorTest.java` | com | 8 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` | com | 8 | 1 | 3 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideApplicationServiceTest.java` | com | 8 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` | com | 8 | 11 | 3 | GuideOrderController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceAuditConfirmTest.java` | com | 8 | 0 | 0 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceTest.java` | com | 8 | 0 | 0 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationEngineTest.java` | com | 8 | 0 | 0 | OrchestrationController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceSpecialDealTest.java` | com | 8 | 1 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/RealNameBackfillServiceTest.java` | com | 8 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | com | 7 | 11 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java` | com | 7 | 22 | 5 | EnergyController | skip×1、⚠部分 |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | com | 7 | 10 | 0 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideFamilyServiceTest.java` | com | 7 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationIntegrationTest.java` | com | 7 | 0 | 0 | OrchestrationController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/task/TaskCheckinWebhookReminderTaskTest.java` | com | 7 | 0 | 0 | TaskController | — |
+| `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/unit/ArticleRelatedServiceTest.java` | com | 6 | 0 | 0 | ArticleController | — |
+| `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 | 13 | 6 | DailyCheckinController | — |
+| `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/integration/service/GuidePackageTemplateServiceTest.java` | com | 6 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/GuidePlanReviewControllerAuthTest.java` | com | 6 | 1 | 4 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthCheckinCfEarnCallSiteTest.java` | com | 6 | 0 | 2 | HealthCheckinController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanDeleteCascadeTest.java` | com | 6 | 1 | 0 | HealthPlanController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthPlanDeleteControllerTest.java` | com | 6 | 3 | 2 | HealthPlanController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | com | 6 | 0 | 1 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorFavoriteServiceTest.java` | com | 6 | 6 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/MemberPriceResolverTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipPaySwitchTest.java` | com | 6 | 10 | 0 | MembershipController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceFulfillmentMultiModeTest.java` | com | 6 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ReportAnalyzeQuotaServiceTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ReportBlockAssemblerTest.java` | com | 6 | 16 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ReportDateExtractorTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceContentServiceTest.java` | com | 6 | 0 | 0 | ServiceContentController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleApproveTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/util/SpearmanUtilTest.java` | com | 6 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/StatsControllerTest.java` | com | 6 | 10 | 2 | StatsController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` | com | 6 | 0 | 0 | WithdrawalController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTagServiceTest.java` | com | 5 | 1 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionAdjustServiceTest.java` | com | 5 | 3 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/BundlePricingServiceTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerWiringTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CommissionServiceReferralF24Test.java` | com | 5 | 0 | 0 | CommissionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DimensionEnergySyncServiceTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyJoinRequestServiceReferrerBindTest.java` | com | 5 | 0 | 0 | FamilyController | — |
+| `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/HealthPlanLazyBackfillTest.java` | com | 5 | 0 | 0 | HealthPlanController | — |
+| `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/JwtInterceptorLoginRequiredTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/MiniGameServiceTest.java` | com | 5 | 0 | 0 | MiniGameController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/NumSoulCalculatorTest.java` | com | 5 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderComboStockTest.java` | com | 5 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductSkuComboServiceTest.java` | com | 5 | 0 | 0 | ProductSkuController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductUpdateClearTest.java` | com | 5 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/RelationshipQuestionnaireServiceTest.java` | com | 5 | 0 | 0 | RelationshipQuestionnaireController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TaskServiceMinigameTest.java` | com | 5 | 0 | 0 | TaskController | skip×1、⚠部分 |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` | com | 5 | 0 | 0 | UserController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/task/VirtualPayTimeoutTaskTest.java` | com | 5 | 0 | 0 | VirtualPayController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` | com | 4 | 1 | 1 | AdminController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/impl/CfGrowthEarnCallSiteTest.java` | com | 4 | 1 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ChallengeScoreServiceTest.java` | com | 4 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CommissionDistService410Test.java` | com | 4 | 0 | 0 | CommissionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceWealthIncomeTest.java` | com | 4 | 0 | 0 | EnergyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` | com | 4 | 1 | 0 | FamilyController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FortuneServiceTest.java` | com | 4 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | com | 4 | 4 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/GuideModuleIntegrationTest.java` | com | 4 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorMappingServiceTest.java` | com | 4 | 0 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/PointsExchangeServiceTest.java` | com | 4 | 0 | 0 | PointsExchangeController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/impl/PurchaseServiceImplRenewalTest.java` | com | 4 | 5 | 0 | PurchaseController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceTypeServiceTest.java` | com | 4 | 0 | 0 | ServiceTypeController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java` | com | 4 | 2 | 0 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` | com | 4 | 0 | 0 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TeacherLoginTest.java` | com | 4 | 0 | 0 | TeacherController | skip×1、⚠部分 |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/TencentTtsServiceAuthorizationTest.java` | com | 4 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/WishServiceTest.java` | com | 4 | 0 | 0 | WishController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | com | 3 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationListTest.java` | com | 3 | 5 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationRejectTest.java` | com | 3 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AdminFamilyOverviewControllerTest.java` | com | 3 | 0 | 2 | AdminFamilyOverviewController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ArticleAudioServiceChunkFilterTest.java` | com | 3 | 0 | 0 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleCategoryControllerTest.java` | com | 3 | 0 | 1 | ArticleCategoryController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` | com | 3 | 5 | 1 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/CartServiceTest.java` | com | 3 | 0 | 0 | CartController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerMigrationServiceTest.java` | com | 3 | 0 | 0 | — | — |
+| `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 | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceIndicatorsTest.java` | com | 3 | 26 | 0 | HealthReportController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/NormalizeIndicatorPipelineTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/task/OrderTimeoutCancelTaskSpecialDealTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/PaymentServiceORDRoutingTest.java` | com | 3 | 1 | 0 | PaymentController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductDTOMappingTest.java` | com | 3 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductOrderServiceTest.java` | com | 3 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceUpdateExpressFieldTest.java` | com | 3 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/RepeatTaskGeneratorPassThroughTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/ReportParserAdminControllerTest.java` | com | 3 | 0 | 1 | ReportParserAdminController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ReviewCenterSummaryTest.java` | com | 3 | 0 | 0 | ReviewController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleFilterTest.java` | com | 3 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/SpecialPriceControllerTest.java` | com | 3 | 8 | 1 | SpecialPriceController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskProgressUpdateTest.java` | com | 3 | 0 | 0 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleBackfillTest.java` | com | 2 | 0 | 0 | ArticleController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionPipelineMockTest.java` | com | 2 | 36 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionPlanServiceTest.java` | com | 2 | 8 | 0 | AttributionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceTest.java` | com | 2 | 0 | 0 | CfCommissionController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/ConsigneeServiceBackfillTest.java` | com | 2 | 0 | 0 | ConsigneeController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` | com | 2 | 1 | 1 | DailyTaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceFamilyTest.java` | com | 2 | 0 | 0 | EnergyController | — |
+| `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/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/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/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/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 | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/common/TestRoles.java` | com | 0 | 0 | 0 | — | — |
+
+## 五、使用说明
+
+- 本 ledger 由 `discover_tests.py` 生成,可随时重跑刷新。
+- 若需把某缺口/部分覆盖转化为测试任务,走 `tdd_orchestrate.py --add-task <unit.domain.action> --requirement <源> --design <源>` 显式入池(须带溯源锚点)。
+- 不在此 ledger 中发明任何需求键;一切以仓库真实测试源代码为准。