evidence-report-closedloop-evd7-20261107.md 12 KB

EVD-7R 报告闭环批次(23 SC)三类流执行证据 / 验收记录

归属:契约补建 P0「报告闭环 · 23 SC」· 会话:EVD-7R(重派)· 日期:2026-11-07 开工包:docs/tdd/orchestration/report-closedloop-kickoff-20261106.md 本记录仅补执行证据/复验,未写任何业务实现代码(防假 RED)——全部改动仅限测试类 + 本证据文档。 载体:纯 Mockito 契约 JUnit 测试(无 Spring / 无 DB / 无网络)+ LangGraph 结构契约 pytest(无 LLM / 无网络 / 无 DB)。

1. 执行证据总览

类别 载体 执行结果 说明
契约测试(本地实跑) cfc-backend/src/test/java/com/etotem/cfc/unit/ 11 类 82/82 通过,0 失败 0 错误 纯 Mockito,surefire:test 实跑,surefire 报告在 target/surefire-reports/
LangGraph 结构契约(本地实跑) cfc-langgraph/tests_contract/test_growth_report_contract.py 8/8 通过 结构/路由契约,monkeypatch ChatOpenAI + report tools + get_prompt,无 LLM/网络/DB
Git 真值 git merge-base --is-ancestor 2af4829b1 origin/cfclub exit 0(是祖先) 基线 2af4829b1 为 origin/cfclub 祖先;origin/cfclub 后续推进至 b3a975111 已快进合并

说明:本次执行窗口内 origin/cfclub 由其他在途任务(EVD-8R/9/10/11/12R/13)推进了 18 个提交(2af4829b1..b3a975111), 均不触碰本批新增测试文件路径;已 git merge origin/cfclub(快进)后再提交本批证据,保证提交落在最新基线上。

2. JUnit 契约测试执行证据(本地,确定性)

命令:cd cfc-backend && mvn -DskipTests test-compile 后 mvn -DskipTests=false -Dtest='<11 类>' surefire:test → 退出码 0

测试类 Tests run Failures Errors 覆盖 SC
HealthReportAuditContractTest 8 0 0 SC-P-67 / SC-T-03 / SC-T-23 / SC-X-13 / SC-X-02
ReportViewPermissionContractTest 11 0 0 SC-C-06 / SC-P-24 / SC-P-25 / SC-X-10
ReportShareGrantContractTest 11 0 0 SC-P-84
ReportTransferContractTest 11 0 0 SC-X-13 / SC-X-02
DanReportUploadContractTest 11 0 0 SC-T-11 / SC-T-12 / SC-C-07 / SC-P-39
AssessmentComparisonContractTest 6 0 0 SC-T-21 / SC-P-24
GlobalSearchScP82ContractTest 5 0 0 SC-P-82
ReportParserAdminContractTest 5 0 0 SC-A-02 / SC-A-16
ReportConfirmRefreshFiveDimContractTest 3 0 0 SC-P-91
ReportDietRecommendContractTest 8 0 0 SC-P-26
ReportParserProviderConnectContractTest 3 0 0 SC-S-09
合计 82 0 0 23 SC

surefire 输出(最后一次,逐类):

Tests run: 8,  Failures: 0, Errors: 0, Skipped: 0 - HealthReportAuditContractTest
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0 - ReportViewPermissionContractTest
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0 - ReportShareGrantContractTest
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0 - ReportTransferContractTest
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0 - DanReportUploadContractTest
Tests run: 6,  Failures: 0, Errors: 0, Skipped: 0 - AssessmentComparisonContractTest
Tests run: 5,  Failures: 0, Errors: 0, Skipped: 0 - GlobalSearchScP82ContractTest
Tests run: 5,  Failures: 0, Errors: 0, Skipped: 0 - ReportParserAdminContractTest
Tests run: 3,  Failures: 0, Errors: 0, Skipped: 0 - ReportConfirmRefreshFiveDimContractTest
Tests run: 8,  Failures: 0, Errors: 0, Skipped: 0 - ReportDietRecommendContractTest
Tests run: 3,  Failures: 0, Errors: 0, Skipped: 0 - ReportParserProviderConnectContractTest
合计: 82 run, 0 failures, 0 errors

3. LangGraph 结构契约执行证据(本地,确定性)

命令:cd cfc-langgraph && .\.venv\Scripts\python.exe -m pytest tests_contract\test_growth_report_contract.py -q

8 passed in 21.12s

覆盖:

  • SC-B-04 报告智能解读:analysis_graph.create_analysis_graph 离线全链路运行——gather_data 经三个报告工具 (get_report_detail / get_survey_data / get_dimension_scores)收集报告/问卷/维度数据,analyze 节点组装 ANALYSIS_SYSTEM_PROMPT + 数据上下文后由 ChatOpenAI 桩返回解读;AnalysisState 状态形状含 report_id/user_id/focus/report_data/survey_data/dimension_scores/analysis/recommendations。
  • SC-B-11 报告细节追问:IntentClassifier.classify 将报告追问("报告里的免疫力指标再解释一下")路由到 Intent.ANALYSIS;LLM 异常降级 Intent.CHAT、未知输出降级 Intent.CHAT(不抛错不误判)。
  • 权限流:CLASSIFY_PROMPT 含报告解读路由规则(analysis / 报告解读),意图路由不区分角色,属公开教练入口。

4. 23 SC → 证据映射(三类流)

SC 角色 场景 证据(正常/异常/权限) 载体
SC-A-02 平台运营 报告解析中台(类型/聚类) ✅/✅/✅ ReportParserAdminContractTest
SC-A-16 平台运营 报告解析自学习/未知类型标注 ✅/✅/✅ ReportParserAdminContractTest
SC-B-04 AI 教练 成长报告智能解读 ✅/—/✅ tests_contract/test_growth_report_contract.py
SC-B-11 AI 教练 报告细节追问 ✅/✅/✅ tests_contract/test_growth_report_contract.py
SC-C-06 孩子 查看能量与报告(只读) ✅/✅/✅ ReportViewPermissionContractTest
SC-C-07 孩子 查看 DAN 测评报告 ✅/✅/✅ DanReportUploadContractTest
SC-P-24 家长 多报告管理/对比 ✅/✅/✅ AssessmentComparisonContractTest + ReportViewPermissionContractTest
SC-P-25 家长 报告趋势查看 ✅/✅/✅ ReportViewPermissionContractTest
SC-P-26 家长 基于报告饮食推荐 ✅/✅/✅ ReportDietRecommendContractTest
SC-P-39 家长 查看测评结果(DAN 报告) ✅/✅/✅ DanReportUploadContractTest
SC-P-67 家长 报告代传(家长替孩子/他人代传) ✅/✅/✅ HealthReportAuditContractTest
SC-P-82 家长 全局搜索(报告/方案/任务/商品) ✅/✅/✅ GlobalSearchScP82ContractTest
SC-P-84 家长 分享报告/方案给家人或规划师 ✅/✅/✅ ReportShareGrantContractTest
SC-P-91 家长 健康报告入库刷新五维评分 ✅/✅/✅ ReportConfirmRefreshFiveDimContractTest
SC-S-09 商品服务商 报告解析服务接入(对接解析中台) ✅/✅/✅ ReportParserProviderConnectContractTest
SC-T-03 规划师 代传报告 + 确认入库(上传报告) ✅/✅/✅ HealthReportAuditContractTest
SC-T-11 规划师 DAN 报告上传与解析 ✅/✅/✅ DanReportUploadContractTest
SC-T-12 规划师 DAN 八类报告查看 ✅/✅/✅ DanReportUploadContractTest
SC-T-21 规划师 报告对比分析 ✅/✅/✅ AssessmentComparisonContractTest
SC-T-23 规划师 报告代传(规划师代客户传) ✅/✅/✅ HealthReportAuditContractTest
SC-X-02 跨角色 报告闭环(上传→解析→入库→查看) ✅/✅/✅ HealthReportAuditContractTest + ReportTransferContractTest
SC-X-10 跨角色 报告对比趋势闭环(对比→趋势→重算) ✅/✅/✅ ReportViewPermissionContractTest
SC-X-13 跨角色 报告代传跨角色闭环(代传→归属校验) ✅/✅/✅ ReportTransferContractTest + HealthReportAuditContractTest

三类流 = 正常流(主链路成功)/ 异常流(非法参数、空数据、异常吞掉、越权拦截)/ 权限流(角色隔离、归属校验、公开入口无鉴权)。 「—」表示该能力键无独立异常态(SC-B-04 解读图无输入时走"暂无数据"降级,已由状态形状 + 分析节点离线运行覆盖)。

5. 契约路径语义映射说明

开工包中给出的若干字面契约路径在代码库中不存在,本批已按真实实现语义映射(映射理由随行注明):

开工包字面路径 实际实现映射 理由
/api/health/report/proxy-upload(SC-P-67/T-03/T-23) HealthReportAuditContractTest 覆盖报告代传确认入库(auditConfirm) 代传/确认入库同一 Result 契约,按代传+审计确认流验证
/api/health/report/{compare,trend}(SC-P-24/P-25/T-21/X-10) AssessmentComparisonContractTest + ReportViewPermissionContractTest(getReportIndicatorsWithPrevious 多报告对比 + 趋势 + 权限隔离) compare/trend 共享指标对比引擎,按指标集对比/趋势 + 可见性权限验证
/api/health/report/share(SC-P-84) ReportShareGrantContractTest(ReportMemberPermissionService.grant/revoke 分享权限授予/撤销) 分享权限为成员级授予/撤销,无独立 share 端点
/api/health/report/refresh-dim(SC-P-91) ReportConfirmRefreshFiveDimContractTest(DimensionScoreService.refreshFromGutReport 报告入库刷新五维) 刷新五维走维度引擎而非独立端点
/api/search/global(SC-P-82) GlobalSearchScP82ContractTest(McpToolRegistry 各 search_* 工具聚合搜索) 全局搜索为 MCP 工具注册表聚合,无独立端点
/api/provider/report-parse/connect(SC-S-09) ReportParserProviderConnectContractTest(ReportParserController.listTypeLinks = POST /api/report-parser/types/links) API_REFERENCE.md 明确该端点为未实现(ProviderController 不存在,O-7 判定不派发);服务商可见"报告解析接入"真实契约为类型↔商品链接(is_active=1 AND linked_product_id IS NOT NULL)

上述映射均在各自契约测试类的 Javadoc 中注明,与 docs/superpowers/api/API_REFERENCE.md 的「未实现端点」清单一致 (/api/health/report/{compare,trend,diet,share,refresh-dim}、/api/search/global、/api/provider/report-parse/connect 均列未实现/未落端点)。

6. Git 真值

  • 基线:2af4829b1(本批开工时 origin/cfclub HEAD)
  • 校验:git merge-base --is-ancestor 2af4829b1 origin/cfclub → exit 0(基线上游存在,真值成立)
  • 执行窗口内 origin/cfclub 推进至 b3a975111(18 个提交,其他在途任务),已 git merge origin/cfclub 快进合并,WIP 未受影响
  • 本批新增提交:见 git log --oneline -1(提交信息含 EVD-7R + SC 列表 + 汇总)

7. 提交文件清单

  • cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportAuditContractTest.java(SC-P-67/T-03/T-23/X-13/X-02)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/ReportViewPermissionContractTest.java(SC-C-06/P-24/P-25/X-10)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/ReportShareGrantContractTest.java(SC-P-84)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/ReportTransferContractTest.java(SC-X-13/X-02)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/DanReportUploadContractTest.java(SC-T-11/T-12/C-07/P-39)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/AssessmentComparisonContractTest.java(SC-T-21/P-24)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/GlobalSearchScP82ContractTest.java(SC-P-82)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/ReportParserAdminContractTest.java(SC-A-02/A-16)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/ReportConfirmRefreshFiveDimContractTest.java(SC-P-91)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/ReportDietRecommendContractTest.java(SC-P-26)
  • cfc-backend/src/test/java/com/etotem/cfc/unit/ReportParserProviderConnectContractTest.java(SC-S-09,本次新增)
  • cfc-langgraph/tests_contract/test_growth_report_contract.py(SC-B-04/B-11,本次新增;置于 tests_contract/ 避免 tests/conftest.py 引入 app.main→faster_whisper→ctranslate2 原生 DLL 依赖)
  • docs/tdd/dev/evidence-report-closedloop-evd7-20261107.md(本记录)

8. EVD-7 后续补强(2026-11-07)

EVD-7 在 EVD-7R 契约 JUnit 基础上补建 API 级 e2e 三类流,详见 docs/tdd/test/automation-run-evd7-report-closedloop-2026-11-07.md:

  • 新增 tests/e2e/api/report-closedloop-contract.spec.js(25 用例:正常流 8 / 异常流 9 / 权限流 8)。
  • 执行环境:本地 cfc-backend @ 9082 + 测试库 192.168.16.251:3306/zxyj(远端 cfc.iwintrue.com 本窗口 DNS 不可解析)。
  • 实测结果:e2e 25/25 通过(10.5s);同日复跑本批 11 类契约 JUnit → 82/82 通过。
  • 未修改任何 src/main 业务实现;仅新增测试资产与证据文档。