Repository navigation
feat(research): 基于统一证据 bundle 聚合研报 Claim 核验 - #155
Conversation
helsome
left a comment
There was a problem hiding this comment.
这个聚合器切片有价值,但当前实现正好在 #102 最严格的 identity 边界上有两个具体 blocker:
claimId = claim-${idx}取决于遍历/插入顺序;在报告前面新增一个无关 claim 就会让后续 claim 全部换 ID,不满足 #102 的 stable claim IDs。- evidence id 直接用
runId,缺失时用evidence-${existing.length + 1}。前者是运行相关 id、后者是局部序号,都不是可解析到具体 source span / structured fact 的稳定 evidence identity;而 #104/#105 正在提供 canonical Source/Evidence/Claim bundle,继续单独生成这一套会形成冲突契约。
请最小化修正为复用实际统一证据 bundle 中的稳定 claim/evidence IDs(或在该依赖尚未进入 main 前把本 PR 明确 stack 在对应契约之上),并补一个 focused 回归:插入/重排无关 section/claim 后原有 claimId 不变,且返回的 evidenceIds 能 resolve 到同一 evidence item/source。当前测试使用 mock judge + 手工 report,应标为 FIXTURE/MOCK 聚合验证,而不是“端到端”真实生产链;本 PR 是 Refs #102,我不要求为这个增量补付费模型或整个父 Issue 的 REAL-E2E。作者现有 Bun/OS、10/0 focused、108/0 research、全 workspace typecheck 可保留。当前 head Actions 为 action_required,不是质量失败。
新增 folio-evidence-contract/v1 统一契约(core 类型 + shared 投影), 把 FinancialEvidenceEnvelope、EvidenceRef、NewsItem 三套并行证据抽象 投影到同一条 Source → Evidence ↔ Claim 关系链: - core/evidence-contract.ts: EvidenceSource / EvidenceItem / EvidenceClaim / EvidenceBundle 类型,全部 ID 确定性派生(sha256,键序无关), 组装 → 持久化 → 重载全程稳定 - shared/evidence/contract.ts: 四个投影函数(结构化金融事实 / 研究论点 / 新闻 / 通用文档备案)+ buildEvidenceBundle 多对多合并 + 序列化往返守卫 - 结构化金融来源不伪造 canonicalUrl;authority 元数据只在已知时填写; 投影只读输入,现有持久化记录无需迁移 - docs/evidence-contract.md: 身份与生命周期语义文档 对应 helsome#100(契约整合部分;claim verifier / Source Inspector 接入留作 后续增量 PR)
ce51bdc to
39b497c
Compare
104/105已合入;当前实现消费canonical bundle身份,有插入/重排无关section后的稳定ID及source解析回归。focused47/0、research全量121/0与typecheck通过,原自造身份阻断已解决。
helsome
left a comment
There was a problem hiding this comment.
本轮独立源码审查及精确 HEAD focused 47/0 通过。最新main累计组合完整测试1959 pass / 7 skip / 0 fail,全workspace typecheck、i18n通过,secret扫描零命中。仅按本PR声明范围验收,不把离线回归当真实模型/生产API验收。前置104/105已合,采用正常merge保祖先;#102保持开放,后续真实模型端到端验收不由本切片替代。
Refs #102. 本 PR 依赖 #105 的报告证据 bundle 以及 #104 的统一证据身份契约。合并前应以两项前置 PR 的最终契约核对差异,并检查本 PR 当前 head 的 CI。
改了什么
verifyReportClaims从 feat(research): 持久化并重载 Deep Research 报告的统一证据 bundle #105 的buildReportEvidenceBundle(report)获取整份报告的 canonical claims、evidence 和 sources;复用 feat(evidence): 统一 Source → Evidence ↔ Claim 证据契约 #104 的claimId、evidenceId,不在聚合器内另行生成 ID。ClaimVerifier。证据项、来源或摘录不可解析时,以insufficient_evidence收敛;不把 claim 本身当作证据,也不接受 verifier 返回的未知 evidence ID 或未知状态。supported/contradicted结果必须携带非空且可映射的 evidence ID 数组。evidenceIds → evidence item → source解析,以及缺失摘录、错误 ID、未知状态、空或非数组 evidence ID 的保守结果。为什么要改
此前聚合器自行从 report ID、内容或运行 ID 派生 claim/evidence ID,与 #104/#105 的统一契约不一致。使用统一 bundle 后,核验结果中的 ID 可以解析到报告证据;插入或重排其他 section 不会改变既有证据身份。
验证
环境:Bun 1.4.2 / Windows 11。临时 worktree 以 #105
889ad5d(已包含 #10430aeab1)为基线,应用本 PR 的完整专属差异;依赖通过本地已有安装的目录链接提供。本地聚焦验证反映上述叠放结果;远端以 PR 当前 head 的检查结果为准。
范围与依赖
这是全篇 Claim 聚合的增量切片。测试使用手工
ResearchReportfixture 与 mock judge;没有运行真实生产链或付费模型,尚不构成 #102 的真实端到端验证。无可见 UI 变化。