# CFC · TDD 覆盖台账(自动发现 · 不发明) > 生成依据:`tdd-orchestrator/scripts/discover_tests.py` 对 `cfc-backend` 的只读扫描。 > **本仓库模式**:TDD 编排器在 CFC 的定位是 **发现 / 格式化 / 跟踪已有测试**, > **不创建测试用例、不发明需求缺口**。所有数据来自仓库真实测试源代码。完整明细见 `docs/tdd/test/discovery.md`。 > **跨源测试用例总台账(含 `tests/` 目录下的结构化用例 / Playwright / Python)见 `docs/tdd/test/inventory.md`**——每条均标注**来源锚点**,进度回写落在 `.tdd/test-progress.json` 侧车(不破坏原结构)。 ## SRS 能力键(TDD 池源) > CFC 采用「发现模式」:**不在本文档播种任何 `⏳` 虚构缺口键**。 > 能力键池由 `discovery.md` 的真实覆盖缺口(uncovered / partial 控制器)推导; > 若要把某缺口转化为测试任务,走 `tdd_orchestrate.py --add-task --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 --out docs/tdd/test/discovery.md` - 本台账与 `discovery.md` 均为只读扫描产物,不改动任何源码。 ## 六、跨源测试用例总台账(含 `tests/` 目录 · 标注来源) > 此前仅扫了 `cfc-backend/src/test/java`,漏掉了仓库根 `tests/` 下的一整套测试资产。 > 现已由 `tdd-orchestrator/scripts/test_inventory.py` 全源编目,产出 `docs/tdd/test/inventory.md`。 - **结构化测试用例** `tests/test-cases/*.md`:**678 条**(TC-A-01 等全局唯一编号,正常流/异常流/权限流三类),每条自带 `对应 e2e` 与 `关联需求/设计(控制器)`;来源锚点 = `tests/test-cases/<文件>.md#`。 - **Playwright** `tests/**/*.spec.js`:**70 文件 / 411 用例**(e2e + integration + api 冒烟)。 - **Python(pytest)** `cfc-langgraph/tests` + `tools/xaf_agent_hub/tests`:**12 文件 / 55 用例**。 - **Java 后端测试** `cfc-backend/src/test/java`:**182 文件 / 1371 @Test**(方法级覆盖见 `discovery.md`)。 - **用户场景** `tests/user-scenarios/*.md`:**8 文件**(上游输入,201 个场景 SC-角色-NN)。 - **合计 950 条编目锚点 / 2515 个用例·方法**,每条均带**来源锚点**。 ### 回写进展机制(不破坏原项目结构) 进度**不写回** `tests/` 与 `cfc-backend/src/test/java` 下的原始测试文件,而是落在本地侧车 `.tdd/test-progress.json`(与 `config.json` 同目录,本地不推送): ```json // .tdd/test-progress.json { "schema": "tdd-test-progress/v1", "sources": [ { "anchor", "source_type", "source_path", "local_id", ...meta }, ... ], "progress": { "": { "status":"pass|fail|executed|blocked|untracked", "at":ISO, "by":"", "note":"" } } } ``` - `anchor` = `source_path#local_id`(如 `tests/test-cases/admin.md#TC-A-01`、`tests/e2e/admin-panel.spec.js#<用例标题>`、`cfc-langgraph/tests/test_intent.py#test_classify_chat`)。 - 回写时**仅更新 `progress[anchor]`**;原始 `.md/.spec.js/.py` 一律不动,原项目结构零侵入。 - 用 `test_inventory.py --emit-progress` 可(重新)播种 anchors(保留已有 progress)。若需团队共享进度,可将该侧车移到 `docs/tdd/` 并推送(默认留本地,呼应 config 本地化约定)。