feat(api)!: memory single chain — async MemoryService, strict eval closure

Route all memory ingest/retrieve/enrichment/compaction through async MemoryService.
Remove legacy sync memory implementations (ingest/retrieve/compaction); Celery and
memoir Phase2 call asyncio.run into MemoryService-backed helpers.

Memoir Phase1 batch ingest uses MemoryService.ingest_transcripts_batch; drop chapters.
evidence_bundle_json mirror (Alembic 0015). Evaluation uses snapshot/link-only bundles;
raise EvidenceClosureMissing instead of partial/fallback lineage tiers.

Split memoir state into NarrativeCoverageState and InterviewControlState; delete the
_interview_meta_store adapter layer. Remove rolling-query and recent-fact fallback
settings from config and evidence assembly.

Update judges, docs, tests, and PlaygroundPage alignment.

Made-with: Cursor
This commit is contained in:
Kevin
2026-04-30 14:11:46 +08:00
parent ac436b87a2
commit 71fbd39e32
53 changed files with 953 additions and 2448 deletions

View File

@@ -688,7 +688,6 @@ class EvalJudgeManualService:
trace_svc = EvalTraceService(self._db)
def _chapter_evidence_notes(
lineage_tier: str,
evidence_summary: str,
truncated: bool,
dropped: list[str],
@@ -696,7 +695,7 @@ class EvalJudgeManualService:
drops = ",".join(dropped[:12]) if dropped else ""
return (
"严格按文档打分;真实性、事实覆盖率、可追溯性以本章节绑定的证据闭包为准。"
f" lineage_tier={lineage_tier}evidence_summary={evidence_summary}"
f" evidence_summary={evidence_summary}"
f" prompt_truncated={truncated}dropped_sections={drops or 'none'}"
)
@@ -792,7 +791,6 @@ class EvalJudgeManualService:
structured_evidence=formatted.structured_evidence,
reference_memoir_markdown=baseline_excerpt,
evidence_notes=_chapter_evidence_notes(
cb2.lineage_tier,
formatted.evidence_summary,
fm.truncated,
fm.dropped_sections,
@@ -819,7 +817,6 @@ class EvalJudgeManualService:
"title": ch.title,
"order_index": ch.order_index,
"baseline_title": bl.title if bl else None,
"lineage_tier": cb2.lineage_tier,
"evidence_summary": formatted.evidence_summary,
"evidence_trace": cb2.model_dump(),
"format_meta": fm.model_dump(),
@@ -917,7 +914,6 @@ class EvalJudgeManualService:
trace_svc = EvalTraceService(self._db)
def _chapter_evidence_notes(
lineage_tier: str,
evidence_summary: str,
truncated: bool,
dropped: list[str],
@@ -925,7 +921,7 @@ class EvalJudgeManualService:
drops = ",".join(dropped[:12]) if dropped else ""
return (
"严格按文档打分;真实性、事实覆盖率、可追溯性以本章节绑定的证据闭包为准。"
f" lineage_tier={lineage_tier}evidence_summary={evidence_summary}"
f" evidence_summary={evidence_summary}"
f" prompt_truncated={truncated}dropped_sections={drops or 'none'}"
)
@@ -1017,7 +1013,6 @@ class EvalJudgeManualService:
md = payload["md"]
bl = payload["bl"]
ev_notes = _chapter_evidence_notes(
cb2.lineage_tier,
formatted.evidence_summary,
fm.truncated,
fm.dropped_sections,
@@ -1084,7 +1079,6 @@ class EvalJudgeManualService:
"title": ch.title,
"order_index": ch.order_index,
"baseline_title": bl.title if bl else None,
"lineage_tier": cb2.lineage_tier,
"evidence_summary": formatted.evidence_summary,
"evidence_trace": cb2.model_dump(),
"format_meta": fm.model_dump(),