blockers.md 35 KB

测试 → 研发 阻塞台账(正式通道)

纪律:本台账条目经测试负责人 --mark-blocked(或补登记)产生,push 到远端才算送达研发; 解除时由测试用 --clear-blocked 置「已解除」。缺陷详情载体见 test_blockers.md 与各轮巡检报告。

编号 关联键/对象 类型 描述 经办 登记时间 状态
B-1 cfc-backend surefire 13 红 研发 后端套件产物(11-02 08:31–08:39)148 用例中 8 fail + 5 error 长期未修;1315/1491 @Test 无执行记录。需研发修复红例并补跑全量 测试(巡检补登记) 2026-11-03 10:58 待处理
B-2 R5 · admin-auth/login 研发 POST /api/admin-auth/login 未授权/空 body 返回 500(应为 401/403,异常信息泄露),安全语义缺陷。详情见 test_blockers.md R5 测试(巡检补登记) 2026-11-03 10:58 待处理
B-3 R6 · 报告上传 研发 报告上传未做 MIME/扩展名/内容校验,非 PDF 未被拒(非 4xx),恶意文件上传风险。详情见 test_blockers.md R6 测试(巡检补登记) 2026-11-03 10:58 待处理
B-4 F1/F2 · butler envelope / commission 400 研发 §7.1 七条真实 unexpected 缺陷中 F1(butler envelope)、F2(commission 400)复跑确认仍未修复 测试(巡检补登记) 2026-11-03 10:58 待处理
B-5 接口冒烟 REAL_ERR 分型 研发 interface_classify_failures.py 分型出 49 条 REAL_ERR(基于 11-01 轮次)未派单未修复;冒烟通过率停 45%,需研发按分型认领真实错误端点 测试(巡检补登记) 2026-11-03 10:58 待处理
B-6 health.report.createReport 研发 TDD 状态机 RED 停滞(自 11-02 01:06 起):契约级单测已落地并离线实跑 5 例全绿(HealthReportControllerCreateReportTest,commit 81d8883f7 已推 origin/cfclub),实现已在库;缺研发 --mark-yellow 登记,状态机无法推进至 GREEN。更新:2026-11-04 15:20 测试侧复核实跑 测试(巡检更新) 2026-11-03 10:58 待处理
B-7 dan.assessment.getActiveMaterial 研发 TDD 状态机 RED 停滞(自 11-02 01:06 起):契约级单测已落地并离线实跑 3 例全绿(DanAssessmentControllerGetActiveMaterialTest,commit faf3ca174 已推 origin/cfclub),实现已在库;缺研发 --mark-yellow 登记,状态机无法推进至 GREEN。更新:2026-11-04 15:20 测试侧复核实跑 测试(巡检更新) 2026-11-03 10:58 待处理
B-8 CfBalanceControllerTest(P0 编译回归) 研发 commit dfc78e9d3(2026-11-03 23:27)给 CfBalanceController.balance/logs 新增 currentMemberId 参数,但 CfBalanceControllerTest.java(76230e2f4,2026-10-25)未同步 → 7 处编译错误(行 95/113/121/140 调 balance、169/189/202 调 logs),整模块 testCompile 失败,1474 @Test 零执行。需研发补改测试 7 处调用或回退签名 测试(巡检补登记) 2026-11-04 03:49 已解除 → 44b2f0d42(2026-11-05 00:31)重写控制器移除 currentMemberId 再次触发同源编译回归,详见 B-10(待处理)
B-9 guide.trainingPlan.getPlanDetail(鉴权缺口观察) 研发 POST /api/guide/training-plans/detail handler 在控制器层不读取 @RequestAttribute("role"),亦未列入 JwtInterceptor LOGIN_REQUIRED_PATHS,「规划师角色约束」名义成立但任何已认证角色(乃至匿名 userId=-1)均可到达 handler,属潜在越权缺口(同文件 getPlanList 同类观察,TR-1 第 6 点要求测试侧记录)。契约测试已落地(TrainingPlanControllerGetPlanDetailTest,8 例全绿),本条仅作缺陷观察回写,不阻断 RED→YELLOW→GREEN 推进 测试负责人(应 TR-1 登记) 2026-11-04 10:10 待处理
B-10 CfBalanceControllerTest(P0 编译回归·复发) 研发 commit 44b2f0d42(2026-11-05 00:31:53,「chore(sync): 工作区遗留未提交 WIP 收尾同步」)重写 CfBalanceController.balance 为 balance(@RequestAttribute("userId") Long userId)、logs 为 logs(userId, page, size),删除 currentMemberId 参数及 stats/familySummary 方法;但测试 CfBalanceControllerTest(仍停在 c9f9ec948,曾为修复上轮 P0 给测试加上 currentMemberId 实参)未同步 → 仍调 balance(7L, null) / logs(7L, null, 1, 20),实参个数不符 → testCompile 失败,1474 @Test 零执行。需研发改测试 7 处调用去掉 currentMemberId 实参(或回退 44b2f0d42 改写)。本轮(01:05)复跑复现,日志 /d/cfc/.tdd/backend-run-20261105-0105.log。升级(01:36 复跑确认):测试文件已被 44b2f0d42 迁移至 cfc-backend/src/test/java/com/etotem/cfc/unit/CfBalanceControllerTest.java,仍以旧签名调用 → 7 处编译错误(行 95/113/121/140 调 balance(7L,null)、169/189/202 调 logs(7L,null,1,20),控制器现为 balance(userId) 单参 / logs(userId,page,size) 三参)→ mvn -o -B -f cfc-backend/pom.xml -DskipTests=false -Dtest='HealthReportControllerCreateReportTest,DanAssessmentControllerGetActiveMaterialTest,TrainingPlanControllerGetPlanDetailTest' test @ testCompile BUILD FAILURE;全模块 1474 @Test + 16 契约测试(历史 8 轮全绿)全部零执行,4 个 YELLOW 键(createReport/getActiveMaterial/getTree/mapLegacyCode)复验收口亦被连带阻断。优先级 P0(阻断全模块测试验证)。建议研发:改测试 7 处调用(balance(7L) / logs(7L,1,20))或回退 44b2f0d42 测试(01:36 复跑确认补登记) 2026-11-05 01:36 已解除(03:30 复验确认):研发负责人1 正式修复 37f29a5df(2026-11-05 02:30,移除 7 处多余 null 实参与 balance(userId)/logs(userId,page,size) 对齐)已推 origin/cfclub 且 merge-base --is-ancestor 核验通过;测试侧 03:30 在远端基线复跑:testCompile 205 源 0 错、16 契约测试(createReport 5 + getActiveMaterial 3 + getPlanDetail 8)16/16 全绿、CfBalanceControllerTest 8/8 绿(含在全量 204 类/1528 例 91.88% 基线,02:50 批次全量实跑)。复验通道恢复,2 个 YELLOW 键(getActiveMaterial/createReport)测试复验通过
B-11 /api/cf 三端点删除(待确认意图) 研发 44b2f0d42(11-05 00:31,chore(sync) 工作区 WIP 收尾)删除 /api/cf/stats、/api/cf/family-summary、/api/cf/promotion-earnings 及前端 3 个封装(-210 行)。全套 1528 例零转红,即删除行为无任何用例可证伪。该提交标题为"遗留 WIP 收尾同步",具备误覆盖特征。需研发确认:有意精简 / 误覆盖 → 前者补 API_REFERENCE.md 下线记录,后者 revert 并补 3 端点用例 测试(36 轮巡检登记) 2026-11-05 02:48 待处理
B-12 3 类 20 个 @Test 长期 @Disabled 研发/测试 DataMigrationServiceTest(11,依赖 sfms 数据源)、TaskServiceMinigameTest(5,依赖硬编码 userId=1L)、TeacherLoginTest(4,依赖硬编码手机号,测试间数据污染) 均类级 @Disabled;台账 @Test 1545 与实际执行 1528 差 17 例。根因统一为测试数据夹具缺失。需建 seed 脚本/@Sql 夹具后解禁。口径精确化(37 轮):注解 1545 − 20(3 类 @Disabled 内注解)+ 3(surefire 为每个禁用类仍记 1 条 skipped 占位)= 1528,误差 0;已逐类排除「参数化展开」假设(全仓参数化类 注解数=执行数)。 测试(36 轮登记/37 轮精确化) 2026-11-05 02:48 待处理
B-13 3 个 @SpringBootTest 类硬编码 127.0.0.1:3306(环境红根因) 研发/环境 AdminFamilyOverviewControllerTest.java:21-22、service/FamilyAdminOverviewServiceTest、service/UserServiceFamilyNameLinkTest 三处 @SpringBootTest(properties={"spring.datasource.url=jdbc:mysql://127.0.0.1:3306/zxyj…"}) 硬编码本机 MySQL;本机无 MySQL → Connection refused → Failed to load ApplicationContext,8 例每轮必红(37 轮实测异常链:BeanCreationException → primaryDataSource → HikariPool$PoolInitializationException → CommunicationsException → ConnectException)。全仓 grep -rl 127.0.0.1:3306 src/test 命中恰好这 3 类。非池压力(37 轮 Too many connections 出现 0 次)。建议:改 @ActiveProfiles("test") + src/test/resources/application-test.yml 统一指向 192.168.16.251 测试库(池上限 4)。 测试(37 轮巡检登记) 2026-11-05 05:30 待处理
B-14 测试窗口内并发提交(基线漂移) 研发/流程 38 轮全量跑测窗口(06:16→07:15,58:41)内 HEAD 由 345cf745e 前移至 f1b0e3ed5,落入 8660d7dbe(SC-G-06 越权拦截:JwtInterceptor+3 测试类)与 0dce400d2/f1b0e3ed5(switchRole:FamilyMembersController/FamilyMemberService+FamilyUserSwitchRoleTest);4 个测试文件 mtime 07:14:57–07:15:12 晚于 testCompile(Compiling 205 source files)→ 聚合首扫即 源类 208 / 报告 204 / 沉默 4。若不补跑将把 41 例新增用例漏记、并把新特性回归风险误报为「零变更」。已处置:定向补跑 5 类 46/46 绿(testCompile 209 源 0 错)。遗留:其余 199 类未在 f1b0e3ed5 上重验。建议跑测改 git worktree 固定 SHA 或 CI checkout SHA,报告头部固化 rev-parse HEAD 测试(38 轮登记) 2026-11-05 07:25 部分处置(补跑已完成,全量复验待下轮)
B-15 度量脚本丢失且从未入库 测试/度量 discover_tests.py / test_inventory.py 全仓 find 无命中,git log --all 为空 → 从未提交,属本地未跟踪脚本已被清理;历史台账「覆盖 365 / 跨源用例 2731 / @Test 1545」不可复现,跨轮对比失去基准。38 轮改用内联统计(357 控制器 / 1933 @PostMapping / 8 @GetMapping / 204 测试文件 / 1546 @Test)。建议脚本纳入 docs/tdd/tools/ 并提交,报告注明脚本版本 测试(38 轮登记) 2026-11-05 07:25 部分解除(62 轮):docs/tdd/tools/test_report_metrics.py 已落地(聚合/归因/场景/恒等式四类度量,复算一致),但仍无法入库——根因即 .gitignore:70 *.py(见 B-33);discover_tests.py / test_inventory.py 亦未恢复,「覆盖 365 / 跨源用例 2731」依旧不可复现
B-16 根级 integration 套件缺凭据夹具(12 例恒红) 测试 9082 已在线后套件不再 fetch failed,暴露真实根因:tests/integration/plan-chain.spec.js:21-22 依赖 ADMIN_PHONE/ADMIN_PASSWORD(当前为空)→ [0] 前置环境检查 收到空串、[1] 登录 返回 code=500 msg=用户不存在;mini-games-api.spec.js 10 例 Expected 200 / Received 401(无 token)。判为测试侧配置缺口,非生产缺陷。建议新增 tests/.env.test + seed 脚本,globalSetup 内自动登录取 token,CI 注入 API_BASE_URL=http://127.0.0.1:9082 测试(38 轮登记) 2026-11-05 07:25 待处理
B-17 .tdd/state.json 与 08:12 轮报告脱节(新增 2 RED 键未落账) 研发/流程 08:12 轮报告(automation-run-2026-11-05-0812.md)与提交 69f8820d8 说明称新建 task.parent.createTask / task.parent.review 两个 RED 键并落契约测试(39 轮独立实测 7 绿 + 17+15=32 绿,与报告吻合);但本地 .tdd/state.json 仍只有 3 键(health.report.createReport / dan.assessment.getActiveMaterial / guide.trainingPlan.getPlanDetail),updated_at 仍为 2026-11-04 10:14。报告说的 ≠ 状态机记的,看板无法反映真实进展。需走 CLI 补登记(--add-task + --mark-red --commit <sha>),禁止手改 state.json 测试(39 轮巡检登记) 2026-11-05 09:40 待处理
B-18 A 类测试漂移 54 例集中爆发(Mockito 误用 + 断言基线过期) 研发/测试 39 轮全量实测非环境红 112 例/34 类,其中 A 类 54 例/17 类可纯测试侧修复:doNothing() 用于非 void 方法(ArticleControllerTest/PlannerBindInviteFlowTest/DailyCheckinStreakFlowTest)、matcher 混用(ProductControllerTest 3E InvalidUseOfMatchers、ProductOrderServiceFulfillmentMultiModeTest 6E)、桩名过期(ProductOrderControllerTest 6E 打 confirm/实现 confirmReceive)、反射注入已删字段(TaskProgressUpdateTest 3E NoSuchFieldException: platformPointsService)、断言基线漂移(WishControllerTest 文案 childId→memberId;StatsControllerTest/MindFortuneControllerTest 500 vs 5001;HealthDimensionControllerTest 期望 500 实得 200)。批量修完 54 例后 G1 由 92.41% → ≈95.7%,G2 由 112 → 58,是当前性价比最高的一步。精确化(22:13 轮实测,维度合并后首验 28 例 26 绿/2 红):HealthDimensionControllerTest.overview_missingMemberId:58 / history_missingMemberId:217 期望 result.getCode()==500 实得 200——根因=用例调用 controller.overview(params, 1L, 1L) / history(params, 1L, 1L) 误传 currentMemberId=1L,实现 ParamUtils.getLong(params.get("memberId"), currentMemberId) 触发双角色「家长视角 currentMemberId 兜底」(设计行为)→ memberId=1L 非空走正常路径 200。测试装置口径错误,非生产缺陷;修复:第 3 参传 null(或断言兜底 200) 测试(39 轮登记,22:13 轮精确化) 2026-11-05 09:40 — 20:20 轮全量更新:A 类仍为最大单一块,实测 51 例 / 15 类(ArticleControllerTest 9、CfCommissionServiceSettleTest 8、ProductOrderControllerTest 6、ProductOrderServiceFulfillmentMultiModeTest 6、AuthControllerTest 4、ProductControllerTest 3、ProductOrderServiceUpdateExpressFieldTest 3、ArticleWorkflowTest 3、GuideTeamControllerTest 2、WishControllerTest 2,其余 5 类各 1);修完预测 G1 = (1727+51)/1847 = 96.26%,红例 116→65,红类 36→21,为当前最优杠杆 待处理
B-19 cfc-langgraph pytest 长期「未实测」结论已过期,首次实测 19 红 测试/研发 41 轮(11-05 15:19)探活发现 cfc-langgraph/.venv/Scripts/python.exe = Python 3.12.7,pytest 9.2.0 / fastapi / httpx / langgraph 全部可 import → 此前 #28–#40 多轮报告的「无 .venv / 缺 httpx → pytest 47 例未实测」结论过期(度量失真,同 N-1 类)。首次实跑 pytest tests --ignore=tests/qna:43 例 24 绿 / 19 红(55.81%)。19 红分层:C 环境 14 例(401 Authentication Fails, Your api key: ****ocal is invalid → analyze 2 + auto_tag 5 + chat 1 + intent 4;另 report_parse 2 例因用例写死容器路径 /app/cfc/docs/参考资料/*.pdf 在本机 400);A 测试漂移 5 例(test_graph 2:GenerateRequest.respondent_name Field required 而用例仍发 member_name;test_memory 3:MemoryManager.__init__() missing 'embeddings')。另 tests/qna/test_graph.py 收集期 ModuleNotFoundError: No module named 'src.qna' → 整模块 0 例可执行(死资产)。建议:①注入测试 LLM 凭据或对 LLM client 全 mock;②test_report_parse 路径改相对仓库路径;③删/重写 tests/qna/test_graph.py;④pytest 纳入 CI 测试(41 轮巡检登记) 2026-11-05 16:20 待处理
B-20 Playwright 规模扩张至 96 spec 而长期未实测 测试/环境 #40 记录 69 spec / 402 test(),#41 复核为 96 个 spec 文件(+27),但唯一一次实测是 11-05 12:14 execute 档(用户显式授权联网)的 API 级 83 例(66 绿 / 6 红 / 3 跳过 / 8 串行阻塞,91.67%);UI 级因 cfc.iwintrue.com 无前端页面(/ 404)不可跑。此后各轮均记「未授权联网 → 未实测」。风险:spec 持续增长而信号为零,用例腐化不可见(如 12:14 已发现 2 条路径/断言过期)。建议:①本地 9082 在听时改用 playwright.config.api.js(无 globalSetup,不 reset 共享库)纳入每轮;②默认配置的 globalSetup 会 reset-db.sh 重置共享测试库,禁止在共享环境直接跑;③UI 级待补独立前置环境 测试(41 轮登记) 2026-11-05 16:20 待处理
B-21 SC-P-11 契约回归(YELLOW 键首次转红) 研发/测试 42 轮全量实测:TaskControllerReviewTest 由连续 7 轮 17/17 全绿降为 15/17(pendingReview_parent_success_returnsList:176 与 pendingReview_directCall_uniformResultShape:316 均 NPE)。根因=SC-X-22 合入 f14e46f84 在 TaskController.java:197/205 新增 rewardRuleService.attachTaskListEstimate(...),而该测试用 new TaskController() + 手工注入(:80-84)未补 RewardRuleService → 字段 null。性质:A 类(测试夹具未跟进生产新增依赖),生产侧 resolveMemberIdByUser:157/attachTaskListEstimate:193 均有 null 守卫,非生产缺陷。影响:SC-P-11 契约 32 → 30 绿、G8 由「3 红」扩为「5 红」;证明「契约绿无回归网」——无 CI 时绿是瞬时绿。建议:该类补 @Mock RewardRuleService 并注入,同批 grep -l "new TaskController()" src/test 全量排查 测试(42 轮实测登记) 2026-11-05 18:26 已解除(52 轮测试侧自修,2026-11-06 04:5x):测试侧在 TaskControllerReviewTest.java 补 @Mock RewardRuleService + ReflectionTestUtils.setField(controller, "rewardRuleService", ...)(+6 行)后,定向复跑 17/17 全绿(BUILD SUCCESS),并对完整 9 类 79 例契约套件复跑:74 绿 / 3 红(P-2 MapContract 口径·与既往一致)/ 0 错——B-21 的 2 个 NPE 错误清零,G8 契约红由 5 降至 3。同批 new TaskController() 手工注入排查仍建议执行(B-22 关联)
B-22 CF 预估挂载的 N+1 读与鉴权清单无守护 研发/测试 ①N+1:attachTaskListEstimate(RewardRuleService:193)对列表逐条调 estimate(),已挂 6 处(TaskController:109/197/205/358、GuideFamilyTaskController:271/295),命中 /api/tasks/today、/pending-review、/today-parent、规划师任务历史与待审等高频接口;attachTaskEstimate:186 用 catch (Exception) log.warn 静默吞异常,降级不可见。既有 RewardRuleServiceEstimateTest 仅测单条计算,无「N 条任务 → 查询次数」与「降级仍 200」断言。②鉴权清单:/api/reward/estimate 已正确加入 JwtInterceptor.LOGIN_REQUIRED_PATHS:124-127,但 11 例契约测试为 standalone MockMvc,不经拦截器 → 该清单条目零断言覆盖(历史上 SEC-20261031-01 / SC-G-06 均因鉴权清单漂移返工)。建议:补批量查询次数断言 + 降级断言;补对 LOGIN_REQUIRED_PATHS 全条目的「无 token → 401」参数化契约用例 测试(42 轮巡检登记) 2026-11-05 18:26 — 20:20 轮收口(测试侧自处置):JwtInterceptorLoginRequiredPathTest 全量实跑 28/28 全绿,已将 LOGIN_REQUIRED_PATHS 全条目以 @ParameterizedTest + @MethodSource 展开为 27 条「无 token → 401」契约(+1 主用例),历史「鉴权清单零断言守护」缺口闭环;N+1 批量查询断言部分仍未补,保留观察 已解除(清单守护部分)
B-23 SC-X-22 契约测试 15 例未入库 测试/流程 RewardEstimateControllerEstimateTest(11) 与 RewardRuleServiceEstimateTest(4) 参与 43 轮全量执行且 15/15 全绿,但 git ls-files 对 cfc-backend/src/test/java/com/etotem/cfc/controller/reward/、.../service/RewardRuleServiceEstimateTest.java 零命中(git status 为 ??,mtime 17:34/17:42)→ 只存在于主工作区。任何 git clean -fd / 工作区重置都会静默丢失(同类事故已发生:B-15 度量脚本丢失)。且违反「完成 = 已提交 + 工作目录干净」铁律,与 O-3 同源(主工作区本轮仍有 126 项未提交/未跟踪)。建议:git add 两路径 → commit + push origin/cfclub → --clean-check 复核;测试/契约文件入库纳入 DoD 测试(43 轮实测登记) 2026-11-05 21:02 待处理
B-24 跑测时延劣化 +18%,结果零漂移(环境时延) 测试/环境 同码复跑对账:XML 单类耗时总和 1649.3s → 1952.2s(+18.4%),Maven 31:36 → 36:49;用例/F/E/S 完全一致(218 类 1664 例 71F 51E 4S)。增量集中 @SpringBootTest 类:GuideOrder +200s、AIChat +120s、Wish +62s、AdminSpecialPrice +53s;期间 Exception during pool initialization 8 次(3 类硬编码 127.0.0.1:3306,B-13 未修),Too many connections 0 次 → 判为外部依赖时延,非代码劣化。风险:长窗口放大 B-14(窗口内并发提交),CI 时长不可估。建议:容器化固定测试库/Redis + 报告中固化「总耗时 / 单类 Top5」基线(±5% 带) 测试(43 轮实测登记) 2026-11-05 21:02 待处理
B-25 新测试类反射注入已删字段(A 类同源反模式) 测试 02:43 轮全量实测:KnowledgeBaseBackfillTest 9 例 2 错,NoSuchFieldException: productDimensionConfigMapper(KnowledgeBaseBackfillTest.java:220)——该字段已在统一维度合并中移除,测试仍用反射注入。与 TaskProgressUpdateTest 3 例(platformPointsService 反射字段同样已删)同源,合计 5 例。性质:A 类(测试装置未跟进生产重构),非生产缺陷。建议:改用服务当前持有的 Mapper 字段或 @InjectMocks,同批 grep -rn 'getDeclaredField' src/test 全量排查 测试(02:43 轮登记) 2026-11-06 03:40 待处理
B-26 cfc-backend 主工作区 testCompile 阻断(11 个 integration 测试文件 WIP) 研发 主工作区 mvn testCompile 失败:ArticleControllerTest.java:201/215/226 三处编译错误(recordRead 找不到符号,位置 OngoingStubbing<ArticleService>)。根因(20:20 轮细化):WIP 采用 when(articleService).recordRead(eq(1L), isNull(), isNull(), eq(30)).thenReturn(new HashMap<>())——when(T mock) 返回 OngoingStubbing<T>,其无 recordRead 方法,属 Mockito API 误用;主代码 ArticleService.recordRead(Long,Long,Long,int) 返回 Map<String,Object>(ArticleService.java:409),故正确写法为 when(articleService.recordRead(...)).thenReturn(...)(方法调用置于 when(...) 内)。同时已提交基线本身亦为 A 类装置缺陷:3 例用 doNothing().when(...).recordRead(...) 对非 void 方法 stubbing → Only void methods can doNothing()。测试侧已用独立 worktree 干净基线(origin/cfclub e4ce9f80a)旁路完成全量 231 类 1847 例 93.50%,证明非主线回归。登记留痕丢失:本条 19:10 首登后未入库,19:37 工作区文件被回滚覆盖(与 B-15/B-23 同类资产丢失),20:20 轮据实测重建。建议:① 按上述正确写法修 3 处并同批复核 getPublicList/getFeatured 8 处实参个数;② testCompile 复验 0 错后提交推送 测试(59/60 轮实测登记) 2026-11-06 19:10(20:20 细化重建) 待处理
B-27 @Test 恒等式失效(引入 @ParameterizedTest 后口径未修订) 测试 20:20 轮全量实测 @Test 1838 − 20(3 类类级 @Disabled)+ 3(surefire 占位)= 1821,但 surefire 实际执行 1847 例,差 26。根因:cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredPathTest.java:62 引入 @ParameterizedTest + @MethodSource,该类单注解展开 27 例(surefire tests=28 = 1 @Test + 27 展开)。修订后恒等式:@Test − 类级@Disabled + 占位 + Σ(参数化展开数−1) = 执行数(本轮 1838−20+3+26=1847,误差 0)。风险:口径不修正会把新增用例漏记/错记(B-15/B-26 同源度量漂移)。建议把计数脚本 count_identity.py 纳入 docs/tdd/tools/ 并入库 测试(20:20 轮登记) 2026-11-06 20:20 待处理
B-28 测试交付物跨分支丢失(第 59 轮报告 + B-26/O-5 在 cfclub 不可见) 研发/流程 19:41 仓库分支由 feature/report-upload-product-cards 切至 cfclub(HEAD df7f60af5,merge da2727f53+e205656ee);git merge-base --is-ancestor 963bedae7 HEAD = NO → 19:12 提交的第 59 轮报告(docs/tdd/test/automation-run-2026-11-06-1910.md)与 B-26/O-5 台账条目在 cfclub 分支不存在(文件在磁盘上被 checkout 覆盖清除)。内容未真丢(仍在 origin/feature/report-upload-product-cards 祖先链上,merge-base --is-ancestor 963bedae7 origin/feature/... = YES),但主线不可见 → 台账审计断链。与 B-14(窗口内并发提交)/ B-15(脚本丢失)/ B-23(测试文件未入库)同族:测试交付物没有随主线合并机制。建议:① 主理人裁决 git cherry-pick 963bedae7 或合并 feature 分支;② 测试报告/台账提交统一落在 cfclub(主线)分支,避免分支切换即丢失;③ 跑测前记录 git rev-parse --abbrev-ref HEAD 与 HEAD sha,报告中固化 测试(20:20 轮实测登记) 2026-11-06 20:20 待处理
B-29 WIP 测试校准批次被 3 行 Mockito 误用阻断(P0) 研发/测试 主工作区 39 项 WIP(11 后端测试 + 8 pytest + 2 前端 spec)已具备大幅转绿能力:隔离副本带入 WIP 并仅修 3 行后,11 个被改后端类 170 例 48 红 → 6 红(−42),其中 Article/GuideOrder/ProductOrder/Product/GuideTeam/Payment/Family/Auth 8 类清零;pytest 24 绿 → 49 绿(执行口径 96.1%);前端 296 → 313 全绿。合计预测 (2148+67)/2299 = 96.37%,后端 95.78%(越 G1)。唯一阻断:ArticleControllerTest.java:201/215/226 三处 when(articleService).recordRead(...) 应为 when(articleService.recordRead(...))(when(mock) 返回 OngoingStubbing,无 recordRead;ArticleService.recordRead 返回 Map,见 :409)→ 修此 3 行即可编译入库。剩余 6 红:GuideFamilyTask 3(overview/reviewTask/batchReview)+ GuideRolePermission 2(reviewTask/batchReview NPE、计数 0)+ Stats 1(文案「请先创建或加入家庭」)。建议:修 3 行 → mvn test-compile 0 错 → git add 21 个测试文件 + 台账 → push → --clean-check 复核 测试(62 轮实测登记) 2026-11-06 23:10 已解除(65 轮实测转正,2026-11-07 02:15):在隔离树 D:\_wt_r0032@78976243e 代入 21 个 WIP 测试资产 + 上述 3 行修正后,testCompile 232 源 0 错,全量 mvn -o -B clean test 跑出 1847 例 / 1769 绿 / 45F / 29E / 4S = 95.78%(红例 116→74,−42),与 62 轮预测值逐位一致(95.78% / 74 红例 / 前端 313 / pytest 49 绿)。修正后写法:when(articleService.recordRead(eq(1L), isNull(), isNull(), eq(30))).thenReturn(new HashMap<>())(:201/:215/:226)。遗留未闭环部分转入 B-36/G12:21 个测试资产仍为工作区 WIP,未提交入库(测试角色不代提交研发 WIP,待 O-5 裁决)
B-30 场景/用例台账与自动化资产零编号锚点(覆盖不可量化) 测试/需求 实测 215 个用户场景(11 文件)、784 条 TC(异常流 474 = 60.5%),但 TC 编号在 348 个测试资产中出现 0 次(0/784);场景被 Playwright spec 字面引用仅 6 个(2.8%),被用例台账映射 155 个(72.1%)。后果:无法回答「哪些 SRS 场景没有自动化」,历史各轮只能以「用例数/通过率」代替「需求覆盖率」。根因:tests/test-cases/*.md 的 对应 e2e 列与真实文件名脱节(如 e2e/roles/parent/../tasks 非合法路径),资产侧亦无 @TC-* 锚点约定。建议:① 约定每个自动化用例首行注明 TC 编号;② 写反向核对脚本生成「场景→TC→资产」三列缺口清单;③ 按角色分 4 批补锚点,优先 -N 负向 TC(异常流) 测试(62 轮登记) 2026-11-06 23:10 待处理
B-31 application.yml 7 处明文凭据(安全) 研发 cfc-backend/src/main/resources/application.yml 存在 7 处 password/secret/api-key/appsecret 明文赋值(本台账不复制取值),覆盖数据源口令、微信 appsecret 与第三方 key。任何具备仓库读权限者可直取测试/生产凭据;且历史提交已留在 git 历史中。建议:改 ${ENV} 占位 + 本地 .env(gitignore)+ 配置中心/Secret 管理;同时轮换已泄露凭据;CI 加明文凭据扫描(gitleaks 规则集) 测试(62 轮静态扫描登记) 2026-11-06 23:10 待处理
B-32 场景/用例度量口径跨轮漂移(度量不可比) 测试 本轮实测:场景 215、TC 784(异常流 474);上一轮报告记「场景 244、TC 492(异常流 237)」。差异非增长(90 分钟内不可能新增 292 条 TC),而是解析口径不同(是否计入 ### 场景(08/09 butler 17 条)、是否计入 TC-*-N* 负向编号、类型列是否含「权限」判异常)。与 B-15/B-27 同族:度量脚本未入库、口径未固化 → 跨轮数字不可相减。建议:把 _r2135_scene.py 等脚本收进 docs/tdd/tools/ 并入库,报告固定写「口径定义 + 脚本版本」,禁止手算 测试(62 轮登记) 2026-11-06 23:10 部分解除(62 轮自处置):度量脚本已落地 docs/tdd/tools/test_report_metrics.py(聚合 + 逐例归因 + 场景覆盖 + 恒等式,纯只读、带 CLI 参数),本轮数字用该脚本复算完全一致(231 类/1847 例/1727 绿/93.50%/36 红类/116 红例;场景 215、TC 784、异常流 474、TC 锚点 0/784;恒等式 1838−20+3=1821,参数化净增 26 → 1847)。但脚本无法入库:被 .gitignore:70 *.py 全局忽略 → 见 B-33,需放行规则后才算真闭环
B-33 .gitignore:70 *.py 全局忽略 Python 文件 —— 度量脚本「写了就丢」的真正根因 研发/流程 62 轮把度量工具落到 docs/tdd/tools/test_report_metrics.py 后 git add 被拒:git check-ignore -v → .gitignore:70:*.py。这解释了 B-15(discover_tests.py/test_inventory.py 全仓丢失、历史度量不可复现)与 B-32(口径跨轮漂移)为何反复发生:任何 Python 度量/校验脚本在本仓库都不可能入库,只存在于某个工作区,分支切换或清理即消失。影响面:度量脚本、数据 seed 脚本、报告解析脚本(docs/scripts/fingerprint_engine.py 等)同受此规则约束(后者是否被例外放行需核实)。建议:把规则细化为 /*.py(仅忽略仓库根临时脚本)或追加例外 !docs/tdd/tools/*.py、!docs/scripts/**/*.py,再由研发提交一次;测试侧脚本需随之入库。注意:.gitignore 属研发所有,测试角色不代改 测试(62 轮实测登记) 2026-11-06 23:10 待处理
B-34 LangGraph 问卷生成 100% 失败降级(GenerateRequest 缺 prompt_template) 研发 P0 生产缺陷。c3925c97e feat(langgraph): 全部提示词迁移到Java后端可配置 只给 cfc-langgraph/src/schemas/tongue.py:14 的 TongueRequest 加了 prompt_template,未给 src/schemas/questionnaire.py:39 GenerateRequest 加;而 src/graphs/questionnaire.py:39 build_prompt 直接读 req.prompt_template → 每次调用必抛 AttributeError。链路:Java AiGateway:321 恒发送 prompt_template → pydantic 静默丢弃额外字段 → 图节点必抛 → 接口 500 → AiGateway catch 后返回 null → 调用方静默降级模板。即 /api/family/questionnaire 的 AI 生成能力 100% 不可用。c3925c97e 已在 origin/cfclub 祖先链 → 现网同样受影响。65 轮 pytest 实测 2 例必红即此因。修复:GenerateRequest 增 prompt_template: Optional[str] = Field(default=None, ...)(与 TongueRequest:14 对齐);build_prompt 可加 getattr 防御。闭环:pytest tests/test_graph.py 2 例转绿 + /api/v1/questionnaire/generate 返回 200 且 questionnaire_json 非空 + AiGateway 不再打「调用失败」warn 测试(65 轮实测登记) 2026-11-07 02:15 待处理
B-35 DAN 报告解析 A1/A2/B4 仍失效(修复提交未覆盖该版式) 研发 DanReportParseServiceTest 65 轮全量实测 4 例红:testParseA2_standardCoreLiteracyFormat:262(姓名 expected 俊辰 but null)、testParseB4_regression:280(仍走降级 expected false but true)、testParseA1_shouldFallbackToGenericPattern、testParseA1_shouldExtractCognitiveDimensionFromDetailPage(expected not null)。而 c611ec55d fix(dan): 修复 A1/B4 认知维度解析失效 声称已修 → 修复未覆盖这两种版式(testParseA2_regression 同批绿、standardCoreLiteracy 版式红,说明是版式分支漏配)。健康报告解析为核心链路(AGENTS.md「健康报告 PDF 上传与解析」)。建议按真实样本补版式分支 + 回归样本入库。闭环:4 例转绿 + 用 3 份真实报告样本走 /api/health/report/parse 人工比对字段 测试(65 轮实测登记) 2026-11-07 02:15 待处理
B-36 根级黑盒 API 套件由「12 恒红」转为「默认 skip」,接口层覆盖归零 测试/环境 WIP 将 tests/integration/mini-games-api.spec.js:6-11、plan-chain.spec.js:21-22 改为 CFC_API_E2E==='1' && CFC_API_TOKEN 门控(原写死 Bearer test-token 打真服务 → 恒 401/500)。方向正确(消除 12 个伪红),但 65 轮实测 23 例全部 skip、0 执行(Tests: 23 skipped)→ 接口层验收从「假红」变「真空」,且 plan-chain 仍依赖空的 ADMIN_PHONE/ADMIN_PASSWORD。建议:新增 tests/.env.test + seed 账号,globalSetup 自动登录取 token 写入 process.env.CFC_API_TOKEN,CI 注入 API_BASE_URL=http://127.0.0.1:9082。闭环:本地 9082 在听时 CFC_API_E2E=1 npm test 23 例实跑且红例有归因;CI 出绿灯记录 测试(65 轮实测登记) 2026-11-07 02:15 待处理
B-37 sleep.config.tags blank-key 实现缺口(契约测试 1 红,阻断该键转 GREEN) 研发 复验轮(TR-6 派发 10 键复验)SleepConfigTagsMechanismContractTest 9/10 绿 + 1 红:publicValue_blankKey_returnsError:99 期望 blank key(" ")→ 500 但实得 200。实现 PublicConfigController.getValue(L21-28)只查 `key==null isEmpty(),未 reject 全空白串 → blank key 被当作正常查询放行。测试由f11062b42(提交信息注明「21绿/1红 blank-key 缺陷」)引入,属**已知实现缺口、非测试误报**。HealthSleepControllerContractTest12/12 绿不受影响。该键--mark-green已**暂缓**、状态机保持 YELLOW。修复:getValue校验改为key==null