归属:契约补建 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)。
| 类别 | 载体 | 执行结果 | 说明 |
|---|---|---|---|
| 契约测试(本地实跑) | 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(快进)后再提交本批证据,保证提交落在最新基线上。
命令: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
命令:cd cfc-langgraph && .\.venv\Scripts\python.exe -m pytest tests_contract\test_growth_report_contract.py -q
8 passed in 21.12s
覆盖:
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。IntentClassifier.classify 将报告追问("报告里的免疫力指标再解释一下")路由到
Intent.ANALYSIS;LLM 异常降级 Intent.CHAT、未知输出降级 Intent.CHAT(不抛错不误判)。CLASSIFY_PROMPT 含报告解读路由规则(analysis / 报告解读),意图路由不区分角色,属公开教练入口。| 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 解读图无输入时走"暂无数据"降级,已由状态形状 + 分析节点离线运行覆盖)。
开工包中给出的若干字面契约路径在代码库中不存在,本批已按真实实现语义映射(映射理由随行注明):
| 开工包字面路径 | 实际实现映射 | 理由 |
|---|---|---|
/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均列未实现/未落端点)。
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 列表 + 汇总)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(本记录)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 不可解析)。src/main 业务实现;仅新增测试资产与证据文档。