_r95_agg.json 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174
  1. {
  2. "backend": {
  3. "classes": 328,
  4. "tests": 2753,
  5. "failures": 104,
  6. "errors": 11,
  7. "skipped": 4,
  8. "time": 3084.024000000004,
  9. "passed": 2634,
  10. "pass_rate": 95.68,
  11. "pass_rate_ex_env": 95.68,
  12. "red_classes": 31,
  13. "red_cases": 115,
  14. "env_red_cases": 0,
  15. "nonenv_red_cases": 115,
  16. "time_sum_s": 3084.0,
  17. "reds": [
  18. {
  19. "class": "GuheEvidenceIsolateContractTest",
  20. "F": 11,
  21. "E": 0,
  22. "env": false,
  23. "tests": 12
  24. },
  25. {
  26. "class": "GuheNoPathMapContractTest",
  27. "F": 10,
  28. "E": 0,
  29. "env": false,
  30. "tests": 10
  31. },
  32. {
  33. "class": "GuheKbVersionSenseContractTest",
  34. "F": 9,
  35. "E": 0,
  36. "env": false,
  37. "tests": 11
  38. },
  39. {
  40. "class": "CfCommissionServiceSettleTest",
  41. "F": 8,
  42. "E": 0,
  43. "env": false,
  44. "tests": 12
  45. },
  46. {
  47. "class": "EnergySystemFlowTest",
  48. "F": 6,
  49. "E": 0,
  50. "env": false,
  51. "tests": 7
  52. },
  53. {
  54. "class": "GuheV2RouteContractTest",
  55. "F": 6,
  56. "E": 0,
  57. "env": false,
  58. "tests": 8
  59. },
  60. {
  61. "class": "PlannerBindInviteFlowTest",
  62. "F": 4,
  63. "E": 1,
  64. "env": false,
  65. "tests": 9
  66. },
  67. {
  68. "class": "GuheGateStrainBlockContractTest",
  69. "F": 5,
  70. "E": 0,
  71. "env": false,
  72. "tests": 6
  73. },
  74. {
  75. "class": "GuheLowSideAggregateContractTest",
  76. "F": 5,
  77. "E": 0,
  78. "env": false,
  79. "tests": 6
  80. },
  81. {
  82. "class": "GuheShellGuardContractTest",
  83. "F": 5,
  84. "E": 0,
  85. "env": false,
  86. "tests": 7
  87. },
  88. {
  89. "class": "DimensionScoreServiceImplTest",
  90. "F": 0,
  91. "E": 4,
  92. "env": false,
  93. "tests": 6
  94. },
  95. {
  96. "class": "ArticleAutoTagServiceTest",
  97. "F": 4,
  98. "E": 0,
  99. "env": false,
  100. "tests": 8
  101. },
  102. {
  103. "class": "GuheLowSideNoSupplementContractTest",
  104. "F": 4,
  105. "E": 0,
  106. "env": false,
  107. "tests": 6
  108. },
  109. {
  110. "class": "GuhePageTailCleanContractTest",
  111. "F": 4,
  112. "E": 0,
  113. "env": false,
  114. "tests": 6
  115. },
  116. {
  117. "class": "GuheVersionSplitContractTest",
  118. "F": 4,
  119. "E": 0,
  120. "env": false,
  121. "tests": 5
  122. },
  123. {
  124. "class": "DimensionRegistryMapContractTest",
  125. "F": 3,
  126. "E": 0,
  127. "env": false,
  128. "tests": 7
  129. },
  130. {
  131. "class": "GrowthRecordSyncFlowTest",
  132. "F": 1,
  133. "E": 2,
  134. "env": false,
  135. "tests": 10
  136. },
  137. {
  138. "class": "ArticleWorkflowTest",
  139. "F": 3,
  140. "E": 0,
  141. "env": false,
  142. "tests": 14
  143. },
  144. {
  145. "class": "GuheKbFieldExposeContractTest",
  146. "F": 3,
  147. "E": 0,
  148. "env": false,
  149. "tests": 6
  150. },
  151. {
  152. "class": "ServiceRoleApproveTest",
  153. "F": 0,
  154. "E": 2,
  155. "env": false,
  156. "tests": 6
  157. },
  158. {
  159. "class": "MindFortuneControllerTest",
  160. "F": 1,
  161. "E": 0,
  162. "env": false,
  163. "tests": 1
  164. },
  165. {
  166. "class": "DailyCheckinStreakFlowTest",
  167. "F": 0,
  168. "E": 1,
  169. "env": false,
  170. "tests": 6
  171. },
  172. {
  173. "class": "GuideModuleIntegrationTest",
  174. "F": 0,
  175. "E": 1,
  176. "env": false,
  177. "tests": 4
  178. },
  179. {
  180. "class": "OrchestrationEngineTest",
  181. "F": 1,
  182. "E": 0,
  183. "env": false,
  184. "tests": 8
  185. },
  186. {
  187. "class": "OrchestrationIntegrationTest",
  188. "F": 1,
  189. "E": 0,
  190. "env": false,
  191. "tests": 7
  192. },
  193. {
  194. "class": "MembershipPaySwitchTest",
  195. "F": 1,
  196. "E": 0,
  197. "env": false,
  198. "tests": 6
  199. },
  200. {
  201. "class": "PaymentServiceORDRoutingTest",
  202. "F": 1,
  203. "E": 0,
  204. "env": false,
  205. "tests": 3
  206. },
  207. {
  208. "class": "UserServiceWechatLoginContractTest",
  209. "F": 1,
  210. "E": 0,
  211. "env": false,
  212. "tests": 6
  213. },
  214. {
  215. "class": "UserServiceWechatLoginTest",
  216. "F": 1,
  217. "E": 0,
  218. "env": false,
  219. "tests": 5
  220. },
  221. {
  222. "class": "TaskPlanServiceTest",
  223. "F": 1,
  224. "E": 0,
  225. "env": false,
  226. "tests": 4
  227. },
  228. {
  229. "class": "TeamProfitCronContractTest",
  230. "F": 1,
  231. "E": 0,
  232. "env": false,
  233. "tests": 22
  234. }
  235. ]
  236. },
  237. "attr": [
  238. {
  239. "class": "MindFortuneControllerTest",
  240. "case": "testGetTodayFortuneWithoutAuth",
  241. "kind": "F",
  242. "type": "AssertionError",
  243. "msg": "JSON path \"$.code\" expected:<401> but was:<400>",
  244. "prod_frames": 0
  245. },
  246. {
  247. "class": "DimensionRegistryMapContractTest",
  248. "case": "map_unknownLegacy_returnsNullData",
  249. "kind": "F",
  250. "type": "AssertionError",
  251. "msg": "JSON path \"$.data\"\nExpected: null\n but: was \"unknown_legacy_xyz\"",
  252. "prod_frames": 0
  253. },
  254. {
  255. "class": "DimensionRegistryMapContractTest",
  256. "case": "map_emptyLegacy_returnsNullData",
  257. "kind": "F",
  258. "type": "AssertionError",
  259. "msg": "JSON path \"$.data\"\nExpected: null\n but: was \"\"",
  260. "prod_frames": 0
  261. },
  262. {
  263. "class": "DimensionRegistryMapContractTest",
  264. "case": "map_missingLegacy_returnsBadRequest",
  265. "kind": "F",
  266. "type": "AssertionError",
  267. "msg": "Status expected:<400> but was:<200>",
  268. "prod_frames": 0
  269. },
  270. {
  271. "class": "DailyCheckinStreakFlowTest",
  272. "case": "childDeletesCheckin_Success",
  273. "kind": "E",
  274. "type": "MockitoException",
  275. "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n doNothing().\n doThrow(new RuntimeException())\n .when(mock).someVoidMethod();\nAbove means:\nsomeVoidMethod() does noth",
  276. "prod_frames": 0
  277. },
  278. {
  279. "class": "EnergySystemFlowTest",
  280. "case": "parentQueriesEnergyLogs_Success",
  281. "kind": "F",
  282. "type": "AssertionFailedError",
  283. "msg": "expected: <200> but was: <500>",
  284. "prod_frames": 0
  285. },
  286. {
  287. "class": "EnergySystemFlowTest",
  288. "case": "childExchangesWishWithEnergy_Success",
  289. "kind": "F",
  290. "type": "AssertionFailedError",
  291. "msg": "expected: <200> but was: <500>",
  292. "prod_frames": 0
  293. },
  294. {
  295. "class": "EnergySystemFlowTest",
  296. "case": "childExchangesWithInsufficientEnergy_Fails",
  297. "kind": "F",
  298. "type": "AssertionFailedError",
  299. "msg": "expected: <true> but was: <false>",
  300. "prod_frames": 0
  301. },
  302. {
  303. "class": "EnergySystemFlowTest",
  304. "case": "userWithoutFamily_Fails",
  305. "kind": "F",
  306. "type": "AssertionFailedError",
  307. "msg": "expected: <500> but was: <5001>",
  308. "prod_frames": 0
  309. },
  310. {
  311. "class": "EnergySystemFlowTest",
  312. "case": "parentGetsEnergyOverview_Success",
  313. "kind": "F",
  314. "type": "AssertionFailedError",
  315. "msg": "expected: <200> but was: <500>",
  316. "prod_frames": 0
  317. },
  318. {
  319. "class": "EnergySystemFlowTest",
  320. "case": "taskCompletionGrantsEnergy_Success",
  321. "kind": "F",
  322. "type": "AssertionFailedError",
  323. "msg": "expected: <200> but was: <500>",
  324. "prod_frames": 0
  325. },
  326. {
  327. "class": "GrowthRecordSyncFlowTest",
  328. "case": "parentUploadsHealthReport_Success",
  329. "kind": "E",
  330. "type": "NullPointerException",
  331. "msg": "java.lang.NullPointerException",
  332. "prod_frames": 0
  333. },
  334. {
  335. "class": "GrowthRecordSyncFlowTest",
  336. "case": "parentCreatesRecordWithoutChild_Fails",
  337. "kind": "F",
  338. "type": "AssertionFailedError",
  339. "msg": "expected: <true> but was: <false>",
  340. "prod_frames": 0
  341. },
  342. {
  343. "class": "GrowthRecordSyncFlowTest",
  344. "case": "parentCreatesRecordWithOrder_Success",
  345. "kind": "E",
  346. "type": "NullPointerException",
  347. "msg": "java.lang.NullPointerException",
  348. "prod_frames": 0
  349. },
  350. {
  351. "class": "GuideModuleIntegrationTest",
  352. "case": "testGuidePackageCreationFlow",
  353. "kind": "E",
  354. "type": "DataIntegrityViolationException",
  355. "msg": "### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'platform_fee' at row 1\n### The error may exist in com/etotem/cfc/",
  356. "prod_frames": 0
  357. },
  358. {
  359. "class": "PlannerBindInviteFlowTest",
  360. "case": "parentConfirmsBind_Success",
  361. "kind": "F",
  362. "type": "AssertionFailedError",
  363. "msg": "expected: <200> but was: <403>",
  364. "prod_frames": 0
  365. },
  366. {
  367. "class": "PlannerBindInviteFlowTest",
  368. "case": "guideViewsBoundFamilies_Success",
  369. "kind": "F",
  370. "type": "AssertionFailedError",
  371. "msg": "expected: not <null>",
  372. "prod_frames": 0
  373. },
  374. {
  375. "class": "PlannerBindInviteFlowTest",
  376. "case": "parentBindsSameGuideTwice_Fails",
  377. "kind": "F",
  378. "type": "AssertionFailedError",
  379. "msg": "expected: <400> but was: <403>",
  380. "prod_frames": 0
  381. },
  382. {
  383. "class": "PlannerBindInviteFlowTest",
  384. "case": "parentUnbindsGuide_Success",
  385. "kind": "E",
  386. "type": "MockitoException",
  387. "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n doNothing().\n doThrow(new RuntimeException())\n .when(mock).someVoidMethod();\nAbove means:\nsomeVoidMethod() does noth",
  388. "prod_frames": 0
  389. },
  390. {
  391. "class": "PlannerBindInviteFlowTest",
  392. "case": "completeInviteBindFlow_Success",
  393. "kind": "F",
  394. "type": "AssertionFailedError",
  395. "msg": "expected: <200> but was: <403>",
  396. "prod_frames": 0
  397. },
  398. {
  399. "class": "OrchestrationEngineTest",
  400. "case": "testOnTaskFailed_FoundNode_ThenMarkFailedAndEvaluateFlow",
  401. "kind": "F",
  402. "type": "AssertionFailedError",
  403. "msg": "expected: \"manual_fail\"\n but was: null",
  404. "prod_frames": 0
  405. },
  406. {
  407. "class": "OrchestrationIntegrationTest",
  408. "case": "testEvaluateFlow_AndNode_AllCompleted_Triggered",
  409. "kind": "F",
  410. "type": "AssertionError",
  411. "msg": "Expecting actual:\n \"failed\"\nto be in:\n [\"in_progress\", \"pending\"]",
  412. "prod_frames": 0
  413. },
  414. {
  415. "class": "ArticleWorkflowTest",
  416. "case": "reDraft_notRejected_pending",
  417. "kind": "F",
  418. "type": "AssertionFailedError",
  419. "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>",
  420. "prod_frames": 0
  421. },
  422. {
  423. "class": "ArticleWorkflowTest",
  424. "case": "reDraft_notRejected_draft",
  425. "kind": "F",
  426. "type": "AssertionFailedError",
  427. "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>",
  428. "prod_frames": 0
  429. },
  430. {
  431. "class": "ArticleWorkflowTest",
  432. "case": "reDraft_notRejected_published",
  433. "kind": "F",
  434. "type": "AssertionFailedError",
  435. "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>",
  436. "prod_frames": 0
  437. },
  438. {
  439. "class": "CfCommissionServiceSettleTest",
  440. "case": "settle_F03a发放_自动创建感恩记录",
  441. "kind": "F",
  442. "type": "WantedButNotInvoked",
  443. "msg": "Wanted but not invoked:\noctopusEffectRecordMapper.insert(<any>);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_F03a发放_自动创建感恩记录(CfCommissionServiceSettleTest.java:419)\nActually, the",
  444. "prod_frames": 0
  445. },
  446. {
  447. "class": "CfCommissionServiceSettleTest",
  448. "case": "settle_同家庭引荐人跳过_顺延到下一级拿F03a",
  449. "kind": "F",
  450. "type": "WantedButNotInvoked",
  451. "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n 1020L,\n \"F03a\",\n 1L,\n <any>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_同家庭引荐人跳过_顺延到下一级拿F03a(CfCommissionServ",
  452. "prod_frames": 0
  453. },
  454. {
  455. "class": "CfCommissionServiceSettleTest",
  456. "case": "settle_商品订单实付与分润基数分离",
  457. "kind": "F",
  458. "type": "WantedButNotInvoked",
  459. "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n 1010L,\n \"F03a\",\n 1L,\n <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_商品订单实付与分润基数分离(CfCommis",
  460. "prod_frames": 0
  461. },
  462. {
  463. "class": "CfCommissionServiceSettleTest",
  464. "case": "settle_两级销售奖_F03a按团队档位_F03b按自身档位",
  465. "kind": "F",
  466. "type": "WantedButNotInvoked",
  467. "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n 1010L,\n \"F03a\",\n 1L,\n <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_两级销售奖_F03a按团队档位_F03b按自",
  468. "prod_frames": 0
  469. },
  470. {
  471. "class": "CfCommissionServiceSettleTest",
  472. "case": "settle_档位比例超规则上限_按上限封顶",
  473. "kind": "F",
  474. "type": "WantedButNotInvoked",
  475. "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n 1010L,\n \"F03a\",\n 1L,\n <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_档位比例超规则上限_按上限封顶(CfComm",
  476. "prod_frames": 0
  477. },
  478. {
  479. "class": "CfCommissionServiceSettleTest",
  480. "case": "settle_落P点消费日志_基数与订单对应",
  481. "kind": "F",
  482. "type": "WantedButNotInvoked",
  483. "msg": "Wanted but not invoked:\nppointConsumptionLogMapper.insert(\n <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_落P点消费日志_基数与订单对应(CfCommissionServiceSettleTest.j",
  484. "prod_frames": 0
  485. },
  486. {
  487. "class": "CfCommissionServiceSettleTest",
  488. "case": "settle_最多两级_第三级引荐人不发放",
  489. "kind": "F",
  490. "type": "WantedButNotInvoked",
  491. "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n 1010L,\n \"F03a\",\n 1L,\n <any>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_最多两级_第三级引荐人不发放(CfCommissionServiceSet",
  492. "prod_frames": 0
  493. },
  494. {
  495. "class": "CfCommissionServiceSettleTest",
  496. "case": "settle_推荐人分润只走earnByRule_不再写旧分佣流水",
  497. "kind": "F",
  498. "type": "WantedButNotInvoked",
  499. "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n <any long>,\n <any string>,\n <any long>,\n <any>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_推荐人分润只走earnByRule_",
  500. "prod_frames": 0
  501. },
  502. {
  503. "class": "DimensionScoreServiceImplTest",
  504. "case": "getHealthDimension_trendUp_whenScoreIncreasedBy5OrMore",
  505. "kind": "E",
  506. "type": "NoSuchElementException",
  507. "msg": "No value present",
  508. "prod_frames": 0
  509. },
  510. {
  511. "class": "DimensionScoreServiceImplTest",
  512. "case": "getHealthDimension_trendStable_whenNoHistory",
  513. "kind": "E",
  514. "type": "NoSuchElementException",
  515. "msg": "No value present",
  516. "prod_frames": 0
  517. },
  518. {
  519. "class": "DimensionScoreServiceImplTest",
  520. "case": "getHealthDimension_trendDown_whenScoreDecreasedBy5OrMore",
  521. "kind": "E",
  522. "type": "NoSuchElementException",
  523. "msg": "No value present",
  524. "prod_frames": 0
  525. },
  526. {
  527. "class": "DimensionScoreServiceImplTest",
  528. "case": "getHealthDimension_trendStable_whenScoreChangeLessThan5",
  529. "kind": "E",
  530. "type": "NoSuchElementException",
  531. "msg": "No value present",
  532. "prod_frames": 0
  533. },
  534. {
  535. "class": "MembershipPaySwitchTest",
  536. "case": "createOrderWithPayType_virtualEnabled_configMissing_returnsNull",
  537. "kind": "F",
  538. "type": "AssertionFailedError",
  539. "msg": "expected: <null> but was: <{levelCode=FAMILY, amount=131400, orderNo=ORD17941626330060059610, payType=wechat, wechatPayParams={}, groupNo=null, totalPeriods=1, status=pending, periodNo=1}>",
  540. "prod_frames": 0
  541. },
  542. {
  543. "class": "PaymentServiceORDRoutingTest",
  544. "case": "unknownPrefix_routesToHandlePaymentCallback",
  545. "kind": "F",
  546. "type": "AssertionFailedError",
  547. "msg": "expected: <SUCCESS> but was: <FAIL>",
  548. "prod_frames": 0
  549. },
  550. {
  551. "class": "UserServiceWechatLoginContractTest",
  552. "case": "wechatLogin_NewOpenid_CreatesParentUserWithFamily",
  553. "kind": "F",
  554. "type": "AssertionFailedError",
  555. "msg": "expected: <jwt-token-1> but was: <null>",
  556. "prod_frames": 0
  557. },
  558. {
  559. "class": "UserServiceWechatLoginTest",
  560. "case": "首次微信登录_自动建档默认家长并创建家庭与成员",
  561. "kind": "F",
  562. "type": "AssertionFailedError",
  563. "msg": "expected: not <null>",
  564. "prod_frames": 0
  565. },
  566. {
  567. "class": "ArticleAutoTagServiceTest",
  568. "case": "toggleStatus_标签非空_不调度自动打标",
  569. "kind": "F",
  570. "type": "NeverWantedButInvoked",
  571. "msg": "threadPoolTaskExecutor.execute(\n <any java.lang.Runnable>\n);\nNever wanted here:\n-> at com.etotem.cfc.unit.ArticleAutoTagServiceTest.toggleStatus_标签非空_不调度自动打标(ArticleAutoTagServiceTest.java:74)\nBut ",
  572. "prod_frames": 0
  573. },
  574. {
  575. "class": "ArticleAutoTagServiceTest",
  576. "case": "toggleStatus_发布且标签为空_调度自动打标",
  577. "kind": "F",
  578. "type": "TooManyActualInvocations",
  579. "msg": "threadPoolTaskExecutor.execute(\n <any java.lang.Runnable>\n);\nWanted 1 time:\n-> at com.etotem.cfc.unit.ArticleAutoTagServiceTest.toggleStatus_发布且标签为空_调度自动打标(ArticleAutoTagServiceTest.java:65)\nBut wa",
  580. "prod_frames": 0
  581. },
  582. {
  583. "class": "ArticleAutoTagServiceTest",
  584. "case": "auditArticle_审核通过且标签为空_调度自动打标",
  585. "kind": "F",
  586. "type": "TooManyActualInvocations",
  587. "msg": "threadPoolTaskExecutor.execute(\n <any java.lang.Runnable>\n);\nWanted 1 time:\n-> at com.etotem.cfc.unit.ArticleAutoTagServiceTest.auditArticle_审核通过且标签为空_调度自动打标(ArticleAutoTagServiceTest.java:103)\nBut",
  588. "prod_frames": 0
  589. },
  590. {
  591. "class": "ArticleAutoTagServiceTest",
  592. "case": "publishByUser_家庭可见直接发布且标签为空_调度自动打标",
  593. "kind": "F",
  594. "type": "TooManyActualInvocations",
  595. "msg": "threadPoolTaskExecutor.execute(\n <any java.lang.Runnable>\n);\nWanted 1 time:\n-> at com.etotem.cfc.unit.ArticleAutoTagServiceTest.publishByUser_家庭可见直接发布且标签为空_调度自动打标(ArticleAutoTagServiceTest.java:138",
  596. "prod_frames": 0
  597. },
  598. {
  599. "class": "GuheEvidenceIsolateContractTest",
  600. "case": "lowSideRules_exposesRecommendationBasisEvidenceCodes",
  601. "kind": "F",
  602. "type": "AssertionFailedError",
  603. "msg": "[guhe.gate.evidenceIsolate] AttributionLowSideRules 缺少 EVIDENCE_PUB 常量:T11(G-3)要求证据码隔离常量(可进推荐依据的 PUB/KB、存在性记录 COM、「未核实」标注),当前未落地。 ==> expected: not <null>",
  604. "prod_frames": 0
  605. },
  606. {
  607. "class": "GuheEvidenceIsolateContractTest",
  608. "case": "tagEvidence_pubKb_unchanged",
  609. "kind": "F",
  610. "type": "AssertionFailedError",
  611. "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#tagEvidence 未实现(G-3 证据码隔离未落地,T11)",
  612. "prod_frames": 0
  613. },
  614. {
  615. "class": "GuheEvidenceIsolateContractTest",
  616. "case": "canEnterRecommendationBasis_unverified_false",
  617. "kind": "F",
  618. "type": "AssertionFailedError",
  619. "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#canEnterRecommendationBasis 未实现(G-3 证据码隔离未落地,T11)",
  620. "prod_frames": 0
  621. },
  622. {
  623. "class": "GuheEvidenceIsolateContractTest",
  624. "case": "tagEvidence_unknownOrBlank_markedUnverified",
  625. "kind": "F",
  626. "type": "AssertionFailedError",
  627. "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#tagEvidence 未实现(G-3 证据码隔离未落地,T11)",
  628. "prod_frames": 0
  629. },
  630. {
  631. "class": "GuheEvidenceIsolateContractTest",
  632. "case": "isExistenceRecordOnly_com_true_pubFalse",
  633. "kind": "F",
  634. "type": "AssertionFailedError",
  635. "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#isExistenceRecordOnly 未实现(G-3 证据码隔离未落地,T11)",
  636. "prod_frames": 0
  637. },
  638. {
  639. "class": "GuheEvidenceIsolateContractTest",
  640. "case": "canEnterRecommendationBasis_com_false",
  641. "kind": "F",
  642. "type": "AssertionFailedError",
  643. "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#canEnterRecommendationBasis 未实现(G-3 证据码隔离未落地,T11)",
  644. "prod_frames": 0
  645. },
  646. {
  647. "class": "GuheEvidenceIsolateContractTest",
  648. "case": "lowSideRules_exposesComAndUnverifiedMarkers",
  649. "kind": "F",
  650. "type": "AssertionFailedError",
  651. "msg": "[guhe.gate.evidenceIsolate] AttributionLowSideRules 缺少 EVIDENCE_COM 常量:T11(G-3)要求证据码隔离常量(可进推荐依据的 PUB/KB、存在性记录 COM、「未核实」标注),当前未落地。 ==> expected: not <null>",
  652. "prod_frames": 0
  653. },
  654. {
  655. "class": "GuheEvidenceIsolateContractTest",
  656. "case": "canEnterRecommendationBasis_pubKb_true",
  657. "kind": "F",
  658. "type": "AssertionFailedError",
  659. "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#canEnterRecommendationBasis 未实现(G-3 证据码隔离未落地,T11)",
  660. "prod_frames": 0
  661. },
  662. {
  663. "class": "GuheEvidenceIsolateContractTest",
  664. "case": "lowSideRules_exposesEvidenceIsolateRuleCode",
  665. "kind": "F",
  666. "type": "AssertionFailedError",
  667. "msg": "[guhe.gate.evidenceIsolate] AttributionLowSideRules 缺少 RULE_EVIDENCE_ISOLATE 规则码:T11(G-3)要求独立「证据码隔离」合规规则——低侧机制证据标 PUB/KB;COM 只作存在性记录;未核实编号标「未核实」。当前仅落地 G-1 三规则(association_only / no_causal_bridge / no_",
  668. "prod_frames": 0
  669. },
  670. {
  671. "class": "GuheEvidenceIsolateContractTest",
  672. "case": "gate_exposesTagEvidence",
  673. "kind": "F",
  674. "type": "AssertionFailedError",
  675. "msg": "[guhe.gate.evidenceIsolate] AttributionComplianceGate 缺少 tagEvidence(1 参) 方法:T11(G-3)证据码隔离契约要求门禁暴露该确定性方法,当前未落地(仅 G-1 的 enforceLowSide / scan / merge 已实现)。 ==> expected: <true> but was: <false>",
  676. "prod_frames": 0
  677. },
  678. {
  679. "class": "GuheEvidenceIsolateContractTest",
  680. "case": "isolateForRecommendation_filtersComAndUnverified",
  681. "kind": "F",
  682. "type": "AssertionFailedError",
  683. "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#isolateForRecommendation 未实现(G-3 证据码隔离未落地,T11)",
  684. "prod_frames": 0
  685. },
  686. {
  687. "class": "GuheGateStrainBlockContractTest",
  688. "case": "strainBlockRules_exposesStrainBlockRuleCode",
  689. "kind": "F",
  690. "type": "AssertionFailedError",
  691. "msg": "[guhe.gate.strainBlock] 规则层(AttributionLowSideRules / AttributionComplianceGate)缺少 \"no_strain_recommendation\" 规则码常量:T6(G-2)要求独立「16S 粒度拦截 / 菌株级推荐阻断」规则码,区别于 T5 的 association_only/no_causal_bridge/no_pre",
  692. "prod_frames": 0
  693. },
  694. {
  695. "class": "GuheGateStrainBlockContractTest",
  696. "case": "attributionModel_exposesGranularityDimension",
  697. "kind": "F",
  698. "type": "AssertionFailedError",
  699. "msg": "[guhe.gate.strainBlock] 归因模型(IndicatorReading/MemberAttribution)未暴露粒度(granularity)维度:T6(G-2)按「granularity != strain」拦菌株号推荐,需在读数/归因结论上区分「菌株级(strain)」与「菌属级/16S(非 strain,默认)」粒度。当前模型无 granularity 字段、无 str",
  700. "prod_frames": 0
  701. },
  702. {
  703. "class": "GuheGateStrainBlockContractTest",
  704. "case": "scan_strainNumberProductRecommendation_flagsStrainBlockViolation",
  705. "kind": "F",
  706. "type": "AssertionFailedError",
  707. "msg": "[guhe.gate.strainBlock] L5 scan 未将「含菌株号的商品推荐」回扫为 no_strain_recommendation 违规:T6(G-2)要求 granularity != strain 时禁菌株号推荐,scan 应识别「长双歧杆菌 BB536」等菌株号。当前 scan 仅回扫 G-1 的「缺X桥接 + 处方化」,未落地菌株号识别(实际命中=0 条)。 ==> exp",
  708. "prod_frames": 0
  709. },
  710. {
  711. "class": "GuheGateStrainBlockContractTest",
  712. "case": "complianceGate_exposesEnforceStrainBlockEntry",
  713. "kind": "F",
  714. "type": "AssertionFailedError",
  715. "msg": "[guhe.gate.strainBlock] AttributionComplianceGate 缺少 enforceStrainBlock(...) 门禁入口:T6(G-2)要求在 L4 出结论前按粒度拦「含菌株号的商品推荐」,与已落地的 enforceLowSide(G-1)同构。当前门禁仅 enforceLowSide + scan,未落地 T6 菌株级拦截入口。 ==> expected",
  716. "prod_frames": 0
  717. },
  718. {
  719. "class": "GuheGateStrainBlockContractTest",
  720. "case": "enforceStrainBlock_16SGranularityWithStrainNumberProduct_flagsViolation",
  721. "kind": "F",
  722. "type": "AssertionFailedError",
  723. "msg": "[guhe.gate.strainBlock] 16S 粒度下含菌株号的商品推荐未被拦(AttributionComplianceGate 缺少 enforceStrainBlock 入口):T6(G-2)要求 granularity != strain 时禁生成含菌株号的商品推荐,「推荐含长双歧杆菌 BB536 的产品」应在门禁被识别为 G-2 菌株级拦截违规。当前未落地。",
  724. "prod_frames": 0
  725. },
  726. {
  727. "class": "GuheKbFieldExposeContractTest",
  728. "case": "speciesInfo_escherichia_lowSideImpact_exposed",
  729. "kind": "F",
  730. "type": "AssertionFailedError",
  731. "msg": "[guhe.kb.fieldExpose] 菌种综合信息「埃希氏菌属」偏低侧影响 应为非空(契约 §2.2,T10 L2-3 入 L2 查询返回);当前=null ==> expected: <true> but was: <false>",
  732. "prod_frames": 0
  733. },
  734. {
  735. "class": "GuheKbFieldExposeContractTest",
  736. "case": "aidefansiEcoli_colonizationNote_exposed",
  737. "kind": "F",
  738. "type": "AssertionFailedError",
  739. "msg": "[guhe.kb.fieldExpose] 平台知识库缺少「艾德范思」来源知识(契约 §2.2 艾德范思大肠杆菌 健康定植说明);艾德范思品牌未落地。 ==> expected: <true> but was: <false>",
  740. "prod_frames": 0
  741. },
  742. {
  743. "class": "GuheKbFieldExposeContractTest",
  744. "case": "bacteriaGenus_highLowImpact_exposed",
  745. "kind": "F",
  746. "type": "AssertionFailedError",
  747. "msg": "[guhe.kb.fieldExpose] 菌属功能库[埃希氏菌属] 偏高影响 应为非空(契约 §2.2 既有键补齐,T10 L2-3 入 L2 查询返回);当前= ==> expected: <true> but was: <false>",
  748. "prod_frames": 0
  749. },
  750. {
  751. "class": "GuheKbVersionSenseContractTest",
  752. "case": "extensionModule_hasElevenSubkeys",
  753. "kind": "F",
  754. "type": "AssertionFailedError",
  755. "msg": "[guhe.kb.versionSense] getSection(谷禾2026新版扩展知识) 为空,无法验证 11 子键(T9)。 ==> expected: not <null>",
  756. "prod_frames": 0
  757. },
  758. {
  759. "class": "GuheKbVersionSenseContractTest",
  760. "case": "extensionModule_containsLowSidePatchSubkey",
  761. "kind": "F",
  762. "type": "AssertionFailedError",
  763. "msg": "[guhe.kb.versionSense] getSection(谷禾2026新版扩展知识) 为空,无法验证低侧补丁块(§2.2)。 ==> expected: not <null>",
  764. "prod_frames": 0
  765. },
  766. {
  767. "class": "GuheKbVersionSenseContractTest",
  768. "case": "upgradeScript_repeatRun_idempotentNoAccumulation",
  769. "kind": "F",
  770. "type": "AssertionFailedError",
  771. "msg": "[guhe.kb.versionSense] 升级脚本(importFromClasspath)运行后 getSection(谷禾2026新版扩展知识) 应非空。T9 ③:重复运行只覆盖不累积。 ==> expected: not <null>",
  772. "prod_frames": 0
  773. },
  774. {
  775. "class": "GuheKbVersionSenseContractTest",
  776. "case": "unifiedKbService_getVersion_containsGuhe2026_2",
  777. "kind": "F",
  778. "type": "AssertionFailedError",
  779. "msg": "[guhe.kb.versionSense] UnifiedKnowledgeBaseService.getVersion() 应含 +guhe2026.2(当前=2.0)。T9:KB 服务读取并暴露版本感知标记。 ==> expected: <true> but was: <false>",
  780. "prod_frames": 0
  781. },
  782. {
  783. "class": "GuheKbVersionSenseContractTest",
  784. "case": "lowSidePatch_containsJudgmentConcepts",
  785. "kind": "F",
  786. "type": "AssertionFailedError",
  787. "msg": "[guhe.kb.versionSense] getSection(谷禾2026新版扩展知识) 为空,无法验证低侧补丁块内容(§2.2)。 ==> expected: not <null>",
  788. "prod_frames": 0
  789. },
  790. {
  791. "class": "GuheKbVersionSenseContractTest",
  792. "case": "unifiedKbService_moduleKeys_registerExtensionModule",
  793. "kind": "F",
  794. "type": "AssertionFailedError",
  795. "msg": "[guhe.kb.versionSense] UnifiedKnowledgeBaseService.MODULE_KEYS 应注册「谷禾2026新版扩展知识」(当前 12 个模块均不含)。T9:注册后 KB 服务加载时才会读取并暴露。 ==> expected: <true> but was: <false>",
  796. "prod_frames": 0
  797. },
  798. {
  799. "class": "GuheKbVersionSenseContractTest",
  800. "case": "seedJson_metaVersion_containsGuhe2026_2",
  801. "kind": "F",
  802. "type": "AssertionFailedError",
  803. "msg": "[guhe.kb.versionSense] 统一知识库.json 版本应含 +guhe2026.2(当前=2.0)。契约:3.0+guhe2026.2(主)/ 3.1+guhe2026.2(专家),T9 L2-1 ①。 ==> expected: <true> but was: <false>",
  804. "prod_frames": 0
  805. },
  806. {
  807. "class": "GuheKbVersionSenseContractTest",
  808. "case": "seedJson_containsExtensionModule",
  809. "kind": "F",
  810. "type": "AssertionFailedError",
  811. "msg": "[guhe.kb.versionSense] 统一知识库.json 顶层应含「谷禾2026新版扩展知识」(当前只有 12 个模块)。T9:KB 读取并暴露扩展知识(§2.2)。 ==> expected: <true> but was: <false>",
  812. "prod_frames": 0
  813. },
  814. {
  815. "class": "GuheKbVersionSenseContractTest",
  816. "case": "unifiedKbService_getSection_extensionModule_notNull",
  817. "kind": "F",
  818. "type": "AssertionFailedError",
  819. "msg": "[guhe.kb.versionSense] UnifiedKnowledgeBaseService.getSection(谷禾2026新版扩展知识) 应非空。T9:KB 服务读取并暴露扩展块(L2-1 ②)。 ==> expected: not <null>",
  820. "prod_frames": 0
  821. },
  822. {
  823. "class": "GuheLowSideAggregateContractTest",
  824. "case": "schemaSql_hasCrossCaseAggregateTable",
  825. "kind": "F",
  826. "type": "AssertionFailedError",
  827. "msg": "[guhe.p3.lowSideAggregate] schema.sql 缺少跨案例聚合承载表(表名应含 attribution_case,如 attribution_case_strategies),用于沉淀跨案例「同条件致病菌低侧」应对方案。T15:低侧口径并入既有 P3 聚合口径。当前聚合承载表未落地。 ==> expected: <true> but was: <false>",
  828. "prod_frames": 0
  829. },
  830. {
  831. "class": "GuheLowSideAggregateContractTest",
  832. "case": "aggregateService_hasAggregateEntryMethod",
  833. "kind": "F",
  834. "type": "AssertionFailedError",
  835. "msg": "[guhe.p3.lowSideAggregate] 跨案例聚合服务类不存在,无法验证聚合入口方法(T15)。当前实现未落地。",
  836. "prod_frames": 0
  837. },
  838. {
  839. "class": "GuheLowSideAggregateContractTest",
  840. "case": "aggregateResult_supportsSameReadingSameStrategy",
  841. "kind": "F",
  842. "type": "AssertionFailedError",
  843. "msg": "[guhe.p3.lowSideAggregate] 跨案例聚合服务类不存在,无法验证同策略聚类语义(T15)。当前实现未落地。",
  844. "prod_frames": 0
  845. },
  846. {
  847. "class": "GuheLowSideAggregateContractTest",
  848. "case": "aggregateService_classExists",
  849. "kind": "F",
  850. "type": "AssertionFailedError",
  851. "msg": "[guhe.p3.lowSideAggregate] service/attribution 等候选包无跨案例聚合服务类(类名应含 CaseAggregate/CrossCase/CaseStrategy/LowSideAggregate 任一)。T15:低侧口径并入既有 P3 聚合口径,可检索「同条件致病菌低侧」应对方案。当前跨案例聚合实现未落地。 ==> expected: <true> bu",
  852. "prod_frames": 0
  853. },
  854. {
  855. "class": "GuheLowSideAggregateContractTest",
  856. "case": "constantPackage_exposesLowSideReadingKey",
  857. "kind": "F",
  858. "type": "AssertionFailedError",
  859. "msg": "[guhe.p3.lowSideAggregate] constant 等候选包应暴露「条件致病菌低侧判读补充(人工)」判读口径常量(§2.2 KB 新增子键),作为跨案例聚合口径的事实锚点。T15:低侧口径并入既有 P3 聚合口径。当前判读口径常量未落地。 ==> expected: <true> but was: <false>",
  860. "prod_frames": 0
  861. },
  862. {
  863. "class": "GuheLowSideNoSupplementContractTest",
  864. "case": "lowSideNode_exposesNoSupplementFlag",
  865. "kind": "F",
  866. "type": "AssertionFailedError",
  867. "msg": "[guhe.lowSide.noSupplement] AttributionComplianceGate.LowSideNode 缺少 isNoSupplement() 节点级禁补菌标记:T4 要求「偏低」归因节点在源头即标注不推荐补菌,而非仅门禁事后回扫。 ==> expected: <true> but was: <false>",
  868. "prod_frames": 0
  869. },
  870. {
  871. "class": "GuheLowSideNoSupplementContractTest",
  872. "case": "interpret_lowSideEColi_meaningCarriesNoSupplementRedline",
  873. "kind": "F",
  874. "type": "AssertionFailedError",
  875. "msg": "[guhe.lowSide.noSupplement] 偏低大肠杆菌节点干预含义应携带「偏低不推荐补菌」口径(T4 L4-3,无成熟证据支持缺X→补X),实际为:「大肠杆菌 偏离 → 与肠道环境/营养缺口相关,先医后补」。当前仅产通用「先医后补」,未落地 T4 源头禁补菌。 ==> expected: <true> but was: <false>",
  876. "prod_frames": 0
  877. },
  878. {
  879. "class": "GuheLowSideNoSupplementContractTest",
  880. "case": "lowSideRules_exposesNoSupplementRuleCode",
  881. "kind": "F",
  882. "type": "AssertionFailedError",
  883. "msg": "[guhe.lowSide.noSupplement] AttributionLowSideRules 缺少 RULE_NO_SUPPLEMENT 规则码:T4(L4-3)要求独立「低位补菌红线」——无成熟证据支持「缺大肠杆菌→补大肠杆菌」。当前仅落地 T5 的 no_causal_bridge,未区分「引擎不产出补菌建议」与「文本回扫」。 ==> expected: not <null>",
  884. "prod_frames": 0
  885. },
  886. {
  887. "class": "GuheLowSideNoSupplementContractTest",
  888. "case": "lowSideRules_exposesNoSupplementHintWording",
  889. "kind": "F",
  890. "type": "AssertionFailedError",
  891. "msg": "[guhe.lowSide.noSupplement] AttributionLowSideRules 缺少 NO_SUPPLEMENT_HINT 口径常量:T4 要求「偏低不推荐补菌」显式口径(无成熟证据支持缺X→补X),供 L4 引擎与报告侧引用,而非仅通用「先医后补」。 ==> expected: not <null>",
  892. "prod_frames": 0
  893. },
  894. {
  895. "class": "GuheNoPathMapContractTest",
  896. "case": "mediationChain_gutFloraWisdom_ladderLockedWording",
  897. "kind": "F",
  898. "type": "AssertionFailedError",
  899. "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#mediationChain 未实现(T14 五维 no_path 映射未落地)",
  900. "prod_frames": 0
  901. },
  902. {
  903. "class": "GuheNoPathMapContractTest",
  904. "case": "attribute_gutFloraReading_wealthNoPenalty_red",
  905. "kind": "F",
  906. "type": "AssertionFailedError",
  907. "msg": "菌群观测对「富」维 no_path:异常菌群读数不应使富维扣分(保持基数 78.0),实际 66.8 ==> expected: <78.0> but was: <66.8>",
  908. "prod_frames": 0
  909. },
  910. {
  911. "class": "GuheNoPathMapContractTest",
  912. "case": "isNoPath_gutFloraMind_false",
  913. "kind": "F",
  914. "type": "AssertionFailedError",
  915. "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#isNoPath 未实现(T14 五维 no_path 映射未落地)",
  916. "prod_frames": 0
  917. },
  918. {
  919. "class": "GuheNoPathMapContractTest",
  920. "case": "isNoPath_gutFloraWealth_true",
  921. "kind": "F",
  922. "type": "AssertionFailedError",
  923. "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#isNoPath 未实现(T14 五维 no_path 映射未落地)",
  924. "prod_frames": 0
  925. },
  926. {
  927. "class": "GuheNoPathMapContractTest",
  928. "case": "isNoPath_gutFloraAction_true",
  929. "kind": "F",
  930. "type": "AssertionFailedError",
  931. "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#isNoPath 未实现(T14 五维 no_path 映射未落地)",
  932. "prod_frames": 0
  933. },
  934. {
  935. "class": "GuheNoPathMapContractTest",
  936. "case": "isNoPath_gutFloraBody_false",
  937. "kind": "F",
  938. "type": "AssertionFailedError",
  939. "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#isNoPath 未实现(T14 五维 no_path 映射未落地)",
  940. "prod_frames": 0
  941. },
  942. {
  943. "class": "GuheNoPathMapContractTest",
  944. "case": "mediationChain_gutFloraMind_ladderLockedWording",
  945. "kind": "F",
  946. "type": "AssertionFailedError",
  947. "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#mediationChain 未实现(T14 五维 no_path 映射未落地)",
  948. "prod_frames": 0
  949. },
  950. {
  951. "class": "GuheNoPathMapContractTest",
  952. "case": "noPathMap_gutFlora_wealthAndActionMarked",
  953. "kind": "F",
  954. "type": "AssertionFailedError",
  955. "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#noPathMap 未实现(T14 五维 no_path 映射未落地)",
  956. "prod_frames": 0
  957. },
  958. {
  959. "class": "GuheNoPathMapContractTest",
  960. "case": "attribute_gutFloraReading_actionNoPenalty_red",
  961. "kind": "F",
  962. "type": "AssertionFailedError",
  963. "msg": "菌群观测对「行」维 no_path:异常菌群读数不应使行维扣分(保持基数 70.0),实际 58.8 ==> expected: <70.0> but was: <58.8>",
  964. "prod_frames": 0
  965. },
  966. {
  967. "class": "GuheNoPathMapContractTest",
  968. "case": "attribute_lowSideGutFlora_weakExcludesWealthAndAction_red",
  969. "kind": "F",
  970. "type": "AssertionFailedError",
  971. "msg": "非身维遮挡:菌群低侧读数不应使「行」成弱维(no_path),weak=[身, 行] ==> expected: <false> but was: <true>",
  972. "prod_frames": 0
  973. },
  974. {
  975. "class": "GuhePageTailCleanContractTest",
  976. "case": "l1Layer_declaresTailAssertRegex",
  977. "kind": "F",
  978. "type": "AssertionFailedError",
  979. "msg": "[guhe.l1.pageTailClean] L1 接入归一化层应声明残段断言正则常量(静态 String 常量,值含 /16\\d 即 \\d{1,3}/16\\d 模式,用于校验层断言物种库条目不含 \\d{1,3}/16\\d,T12/L1-2)。当前无残段断言正则,无法对清洗结果做「残段 0 命中」的程序化校验。 ==> expected: <true> but was: <false>",
  980. "prod_frames": 0
  981. },
  982. {
  983. "class": "GuhePageTailCleanContractTest",
  984. "case": "l1Layer_providesTailCleanEntry",
  985. "kind": "F",
  986. "type": "AssertionFailedError",
  987. "msg": "[guhe.l1.pageTailClean] L1 接入归一化层(PdfParseService / ReportParserDispatchService / ReportFingerprintService / ParsedReportResult)应提供分页残段清洗执行入口(方法名含 TableTailClean / PageTail / StripTail,如 stripTableTai",
  988. "prod_frames": 0
  989. },
  990. {
  991. "class": "GuhePageTailCleanContractTest",
  992. "case": "l1Layer_providesTailCleanAssertEntry",
  993. "kind": "F",
  994. "type": "AssertionFailedError",
  995. "msg": "[guhe.l1.pageTailClean] L1 接入归一化层应提供残段清洗校验断言入口(方法名含 AssertTailClean / ValidateTail / AssertClean),断言清洗后产物「残段 0 命中」(§2.1 清洗后 76 条、残段 0 命中;T12/L1-2 校验层断言)。当前无残段断言步骤,无法验证清洗效果。 ==> expected: <true> but wa",
  996. "prod_frames": 0
  997. },
  998. {
  999. "class": "GuhePageTailCleanContractTest",
  1000. "case": "l1Layer_declaresPageTailMarker",
  1001. "kind": "F",
  1002. "type": "AssertionFailedError",
  1003. "msg": "[guhe.l1.pageTailClean] L1 接入归一化层应声明 _PAGE_TAIL 残段标记常量(静态 String 常量,字段名/值含 PAGE_TAIL / 分页 / 残段,值含残段样例 34/167),作为分页表拼接残段的识别依据(§2.1 / T12)。当前无残段标记常量,残段无法被识别与清洗。 ==> expected: <true> but was: <false>",
  1004. "prod_frames": 0
  1005. },
  1006. {
  1007. "class": "GuheShellGuardContractTest",
  1008. "case": "l1Layer_recognizesEmptyShell26",
  1009. "kind": "F",
  1010. "type": "AssertionFailedError",
  1011. "msg": "[guhe.l1.shellGuard] L1 层应识别空壳签名 26 键(静态 int 常量 26,曾误用艾德范思提取器仅产 26 键),判为空壳后换正确提取器(T13)。当前无空壳签名检测,26 键空壳将不被识别。 ==> expected: <true> but was: <false>",
  1012. "prod_frames": 0
  1013. },
  1014. {
  1015. "class": "GuheShellGuardContractTest",
  1016. "case": "l1Layer_declaresGuheV2KeyBoundary32",
  1017. "kind": "F",
  1018. "type": "AssertionFailedError",
  1019. "msg": "[guhe.l1.shellGuard] L1 层应声明 guhe_v2 总键数 32(静态 int 常量 32,§2.1 旧 21 键 + 11 增量键),以区分完整 guhe_v2 报告(32 键)与空壳(不足 32 键)。当前无 32 键边界(T13/L1-4)。 ==> expected: <true> but was: <false>",
  1020. "prod_frames": 0
  1021. },
  1022. {
  1023. "class": "GuheShellGuardContractTest",
  1024. "case": "l1Layer_declaresIncrementalKeys11",
  1025. "kind": "F",
  1026. "type": "AssertionFailedError",
  1027. "msg": "[guhe.l1.shellGuard] L1 层应声明增量 11 键基准(静态 String 键集合常量 size=11 且字段名含 KEY/KEYS/INCREMENTAL/增量,或静态 int 常量 11),作为 guhe_v2 解析后校验『增量 11 键齐全』的基准(§2.1 旧 21 键 + 11 增量键 = 32 键)。当前无增量键基准,无法判定空壳(T13/L1-4)。 ==> ex",
  1028. "prod_frames": 0
  1029. },
  1030. {
  1031. "class": "GuheShellGuardContractTest",
  1032. "case": "dispatchService_providesShellGuardEntry",
  1033. "kind": "F",
  1034. "type": "AssertionFailedError",
  1035. "msg": "[guhe.l1.shellGuard] ReportParserDispatchService 应提供空壳守卫入口(方法名含 Shell / KeyComplete / ValidateKeys / AssertKeys,如 guardShell),在 guhe_v2 解析后校验增量 11 键齐全(T13/L1-4)。当前 parseReport 仅做 指纹→专用解析器/LLM 兜底,无空壳检测",
  1036. "prod_frames": 0
  1037. },
  1038. {
  1039. "class": "GuheShellGuardContractTest",
  1040. "case": "l1Layer_addressesCorrectExtractor",
  1041. "kind": "F",
  1042. "type": "AssertionFailedError",
  1043. "msg": "[guhe.l1.shellGuard] L1 层(ReportParserDispatchService / ReportFingerprintService / PdfParseService)应寻址正确提取器(静态 String 常量值含 \"extract_guhe_v2\"),在空壳(26 键)检测到时切换用正确提取器(T13『空壳→换正确提取器』)。当前无 extract_guhe_v2 ",
  1044. "prod_frames": 0
  1045. },
  1046. {
  1047. "class": "GuheV2RouteContractTest",
  1048. "case": "routeLayer_registersTriggerWord_firmicutesBacteroidetesRatio",
  1049. "kind": "F",
  1050. "type": "AssertionFailedError",
  1051. "msg": "[guhe.l1.guheV2Route] L1 指纹路由层应可寻址 guhe_v2 触发词锚点「厚壁菌比拟杆菌比值」(静态 String 常量值含之,T7 指纹识别特征,§2.1)。当前 src/main 无此触发词,32 键 guhe_v2 新版报告无法被指纹识别路由。 ==> expected: <true> but was: <false>",
  1052. "prod_frames": 0
  1053. },
  1054. {
  1055. "class": "GuheV2RouteContractTest",
  1056. "case": "routeLayer_providesGuheV2KeyCountSelfCheck",
  1057. "kind": "F",
  1058. "type": "AssertionFailedError",
  1059. "msg": "[guhe.l1.guheV2Route] L1 路由层应提供 guhe_v2 <b>32 键自检</b>入口(方法名含 keyCount/selfCheck,或静态 int 常量名含 GUHE_V2 且值为 32)。契约:旧 21 键打底 + 11 增量键 = 32 键,路由/解析后须自检键数齐全(T7 键数自检 32 键,§2.1)。当前无自检入口,32 键报告键数完整性无法保证。 ==> e",
  1060. "prod_frames": 0
  1061. },
  1062. {
  1063. "class": "GuheV2RouteContractTest",
  1064. "case": "routeLayer_declaresRouteChainOrder",
  1065. "kind": "F",
  1066. "type": "AssertionFailedError",
  1067. "msg": "[guhe.l1.guheV2Route] L1 指纹路由层应声明判定链顺序常量(值含 aidefansi→beijing→guhe_v2→standard 完整链),保证 guhe_v2 在 beijing 之后、standard 之前被判定(T7/L1-1,§2.1)。当前未声明,32 键新版报告可能被误判为标准格式而丢失增量 11 键。 ==> expected: <true> but wa",
  1068. "prod_frames": 0
  1069. },
  1070. {
  1071. "class": "GuheV2RouteContractTest",
  1072. "case": "routeLayer_registersTriggerWord_diseaseSimilarAssessment",
  1073. "kind": "F",
  1074. "type": "AssertionFailedError",
  1075. "msg": "[guhe.l1.guheV2Route] L1 指纹路由层应可寻址 guhe_v2 触发词锚点「疾病相似评估」(静态 String 常量值含之,T7 指纹识别特征,§2.1)。当前 src/main 无此触发词,32 键 guhe_v2 新版报告无法被指纹识别路由。 ==> expected: <true> but was: <false>",
  1076. "prod_frames": 0
  1077. },
  1078. {
  1079. "class": "GuheV2RouteContractTest",
  1080. "case": "routeLayer_registersTriggerWord_subhealthAndDietUnreasonable",
  1081. "kind": "F",
  1082. "type": "AssertionFailedError",
  1083. "msg": "[guhe.l1.guheV2Route] L1 指纹路由层应可寻址 guhe_v2 触发词锚点「亚健康及营养饮食不合理」(静态 String 常量值含之,T7 指纹识别特征,§2.1)。当前 src/main 无此触发词,32 键 guhe_v2 新版报告无法被指纹识别路由。 ==> expected: <true> but was: <false>",
  1084. "prod_frames": 0
  1085. },
  1086. {
  1087. "class": "GuheV2RouteContractTest",
  1088. "case": "routeLayer_registersGuheV2Stage",
  1089. "kind": "F",
  1090. "type": "AssertionFailedError",
  1091. "msg": "[guhe.l1.guheV2Route] L1 指纹路由层(PdfParseService / ReportFingerprintService / ReportParserDispatchService)应注册判定阶段「guhe_v2」(静态 String 常量值含之),使判定链 aidefansi→beijing→guhe_v2→standard 的阶段可寻址(T7/L1-1)。当前 src",
  1092. "prod_frames": 0
  1093. },
  1094. {
  1095. "class": "GuheVersionSplitContractTest",
  1096. "case": "l1Layer_addressesGuheV2DedicatedParser",
  1097. "kind": "F",
  1098. "type": "AssertionFailedError",
  1099. "msg": "[guhe.l1.versionSplit] L1 层(ReportParserDispatchService / ReportFingerprintService)应寻址 guhe_v2 专用解析器(字符串常量值含 \"extract_guhe_v2\"),使 32 键 guhe_v2 报告进入专用解析分支,**不落入** unknown→LLM 兜底(T8 禁把 32 键误判成路由错误)。当前 g",
  1100. "prod_frames": 0
  1101. },
  1102. {
  1103. "class": "GuheVersionSplitContractTest",
  1104. "case": "l1Layer_declaresLegacy21KeyBoundary",
  1105. "kind": "F",
  1106. "type": "AssertionFailedError",
  1107. "msg": "[guhe.l1.versionSplit] L1 层应声明 21/32 键数边界(静态 int 常量 21 与 32 并存),以区分旧 21 键与原 v5 流程、32 键走 guhe_v2(§2.1 旧 21 键 + 11 增量 = 32 键)。当前无键数边界标记,旧 21 键无法与 guhe_v2 隔离,存在被强套 guhe_v2 风险(T8 禁把旧 21 键强套 guhe_v2)。 ==> ",
  1108. "prod_frames": 0
  1109. },
  1110. {
  1111. "class": "GuheVersionSplitContractTest",
  1112. "case": "parsedReportResult_exposesGuheV2FormatMarker",
  1113. "kind": "F",
  1114. "type": "AssertionFailedError",
  1115. "msg": "[guhe.l1.versionSplit] ParsedReportResult 应暴露 guhe_v2 格式版本标记(静态字符串常量值为 \"guhe_v2\"),使新版 32 键格式与旧 beijing/guhe 可区分(§2.1 判定链 aidefansi→beijing→guhe_v2→standard)。当前实现仅 beijing/guhe,格式版本分流未落地。 ==> expected:",
  1116. "prod_frames": 0
  1117. },
  1118. {
  1119. "class": "GuheVersionSplitContractTest",
  1120. "case": "dispatchService_providesFormatVersionSplitEntry",
  1121. "kind": "F",
  1122. "type": "AssertionFailedError",
  1123. "msg": "[guhe.l1.versionSplit] ReportParserDispatchService 应提供按报告格式版本分流入口(方法名含 FormatVersion / VersionSplit,如 routeByFormatVersion),按『报告格式版本』分流:32 键→guhe_v2 提取器、旧 21 键→原 v5 流程(T8/L1-3)。当前 parseReport 仅做 指纹→专用",
  1124. "prod_frames": 0
  1125. },
  1126. {
  1127. "class": "ServiceRoleApproveTest",
  1128. "case": "planner_已有同手机号admin则更新不重复插入",
  1129. "kind": "E",
  1130. "type": "NullPointerException",
  1131. "msg": "java.lang.NullPointerException",
  1132. "prod_frames": 0
  1133. },
  1134. {
  1135. "class": "ServiceRoleApproveTest",
  1136. "case": "planner_通过后写teacher_status并创建admins记录",
  1137. "kind": "E",
  1138. "type": "NullPointerException",
  1139. "msg": "java.lang.NullPointerException",
  1140. "prod_frames": 0
  1141. },
  1142. {
  1143. "class": "TaskPlanServiceTest",
  1144. "case": "applyAndActivate_无active实例时新建并置active",
  1145. "kind": "F",
  1146. "type": "AssertionFailedError",
  1147. "msg": "expected: <100> but was: <null>",
  1148. "prod_frames": 0
  1149. },
  1150. {
  1151. "class": "TeamProfitCronContractTest",
  1152. "case": "refundWithinCooling_cancelAllRecordsFundsNotPaid",
  1153. "kind": "F",
  1154. "type": "AssertionFailedError",
  1155. "msg": "冷静期内订单退款:对应 team_share_record / team_award_record 全部 cancelled、资金不发放(§8.2),cancelled=0 ==> expected: <true> but was: <false>",
  1156. "prod_frames": 0
  1157. }
  1158. ],
  1159. "identity": {
  1160. "at_test": 2741,
  1161. "parameterized_methods": 1,
  1162. "disabled_classes": [
  1163. "DataMigrationServiceTest",
  1164. "TaskServiceMinigameTest",
  1165. "TeacherLoginTest"
  1166. ],
  1167. "disabled_inner": 20,
  1168. "placeholders": 3,
  1169. "base_executed": 2724,
  1170. "actual_executed": 2753,
  1171. "param_expansion_net": 29
  1172. },
  1173. "silent_missing": []
  1174. }