3.8 KiB
3.8 KiB
Phase 4 Evidence: Feedback and Case Library Run Binding
Scope
Phase 4 implements run-scoped feedback and run-based automatic case creation:
- Feedback request accepts preferred
runId. - Feedback validates run/session ownership.
- Missing
runIdfalls back to the latest run and returnsfallbackToLatestRun=trueplus the boundrunId. - New feedback persists to
diagnosis_run.feedback. - Useful feedback creates or reuses
case_libraryfromdiagnosis_run.queryanddiagnosis_run.answer. - New automatic
case_library.diagnosis_idvalues storerun_id; oldsession_idvalues remain supported through the legacyDiagnosisSessionpath.
Focused Tests
Focused tests:
mvn -q "-Dtest=FeedbackServiceTest,CaseLibraryServiceTest,FeedbackControllerTest" test
Result: passed.
Coverage:
- exact
sessionId + runIdfeedback updates the specified run; - missing
runIdbinds to latest run and returnsfallbackToLatestRun=true; - wrong-session
runIdfails without saving feedback or case data; - useful feedback creates a case from the run;
- case creation is idempotent by
diagnosis_id; - legacy
DiagnosisSessioncase creation still storesdiagnosis_id=session_id; FeedbackControllerpassesrequest.runIdtoFeedbackService.
E2E Feedback API Check
Maven startup:
mvn spring-boot:run -Dspring-boot.run.profiles=mvp-demo
Captured artifacts:
target/e2e/phase4-mvn-20260710-2016.out.logtarget/e2e/phase4-mvn-20260710-2016.err.logtarget/e2e/phase4-feedback-exact-run.jsontarget/e2e/phase4-feedback-fallback-latest.jsontarget/e2e/phase4-feedback-wrong-session.jsontarget/e2e/phase4-summary.json
The Maven process was stopped after evidence collection.
Inputs reused the Phase 3 E2E session:
sessionId = e2e-phase3-codex-20260710-1912
run1 = run-fdccbe21-e050-4f92-a741-a062aef59644
run2 = run-a9b883ab-9cab-4eec-accf-38129bd2eb94
API responses:
exact run feedback:
status=200
runId=run-fdccbe21-e050-4f92-a741-a062aef59644
fallbackToLatestRun=false
caseId=428b0cf8-d3b4-4f8a-a82e-4e815999d3ff
legacy fallback feedback:
status=200
runId=run-a9b883ab-9cab-4eec-accf-38129bd2eb94
fallbackToLatestRun=true
caseId=null
wrong-session feedback:
status=400
success=false
message=runId does not belong to sessionId
Log evidence from phase4-mvn-20260710-2016.out.log:
反馈已记录: sessionId=e2e-phase3-codex-20260710-1912, runId=run-fdccbe21-e050-4f92-a741-a062aef59644, feedback=useful, fallbackToLatestRun=false, caseId=428b0cf8-d3b4-4f8a-a82e-4e815999d3ff反馈已记录: sessionId=e2e-phase3-codex-20260710-1912, runId=run-a9b883ab-9cab-4eec-accf-38129bd2eb94, feedback=not_useful, fallbackToLatestRun=true, caseId=null
Database Inspection
Queried through scripts/query_mysql.py.
diagnosis_run.feedback:
run-a9b883ab-9cab-4eec-accf-38129bd2eb94 | feedback=not_useful | status=SUCCESS
run-fdccbe21-e050-4f92-a741-a062aef59644 | feedback=useful | status=SUCCESS
case_library:
case_id=428b0cf8-d3b4-4f8a-a82e-4e815999d3ff
diagnosis_id=run-fdccbe21-e050-4f92-a741-a062aef59644
source_type=AUTO
title=支付接口最近出现超时,请结合知识库、日志和指标判断可能原因,并给出修复建议。
No automatic case was created for the fallback not_useful feedback on run2.
Final Gate
The final Phase 4 gate was rerun after document review follow-up:
mvn -q clean test-compile
mvn -q "-Dtest=FeedbackServiceTest,CaseLibraryServiceTest,FeedbackControllerTest,DiagnosisTraceServiceTest,ChatControllerTest" test
openspec validate session-run-trace-isolation --strict
git diff --check
Result: passed.
Conclusion
Phase 4 satisfies run-scoped feedback, observable latest-run fallback, run-based useful case creation, and transitional old-data compatibility for case_library.diagnosis_id.