# Diagnosis 信息增益停止契约 Evidence ## 证据 | 来源 | 证据 | 结论 | 是否已汇报 | | --- | --- | --- | --- | | `HarnessEvidenceTools` / request records | Agent-facing Tool 直接使用业务 request 生成 Schema | 要增加 `previous_observation + input` 必须显式演进 Tool Schema | 是 | | `HarnessToolInterceptor` | 曾把完整 `agentResult` 放入 Tool Response | 必须拆分控制视图与模型观察 | 是 | | `RunContext` / `DiagnosisHarnessCore.startRun` | 结构不可变 + 线程安全 handle | 进展 tracker 放 RunContext,不扩 Redis 枚举 | 是 | | `CanonicalInvocationStore` | 仅 begin/find/markReady/markError | tracker 只存 identity,结束时投影 | 是 | | `RagResultProjector` | 只按 evidence 空否生成状态 | 需兼容 `relevanceLevel/relevance_level` | 是 | | `DiagnosisReleaseUseCase` / `EvidenceGuard` | 强制 draft 非空且空 analysis=`ANALYSIS_MISSING` | 与合法无结论冲突,需统一 Release | 是 | | `ChatApplicationUseCase.recoverBudgetExhaustion` | 未提交预算 Fallback 绕过 Release | 迁移意图到 Diagnosis Release | 是 | | 前端 `app.js` | 已渲染 observed_facts/sources/limitations/next_steps | 不新增公开 SSE 字段 | 是 | | 真实 E2E(实施前) | 多轮空转后 `BUDGET_EXHAUSTED`/`INTERNAL_FAILURE` | 需要信息增益停止契约 | 是 | | 真实 E2E(实施后) | `iss016-final-20260726-a` → `MISSING_REQUIRED_CONTEXT` FALLBACK | 未知 Query 可正常业务结束 | 是 | | Token/拒绝审计 E2E | 9 次 `INVALID_PROGRESS_PROTOCOL` 拒绝不累计 NO_GAIN | 需独立协议错误阈值与 STOP | 是 | ## Evidence-driven 结论 - 结论:Tool Envelope 是 L3 模型侧协议变更,业务 request 在 interceptor 解包后保持不变。 - 证据:三个 FunctionToolCallback inputType、adapter bridge 只收业务 JSON。 - 风险:框架 Schema/拦截器假设不匹配。 - 用户确认:不需要(技术事实) - 结论:协议错误不得累计为 `NO_GAIN`,必须独立 `PROGRESS_PROTOCOL_VIOLATED`。 - 证据:真实审计 9 次协议拒绝 + 13 Agent 轮次;OpenSpec design 6.1。 - 风险:只返回通用错误码不足以自修复。 - 用户确认:已通过 Task 8 OpenSpec 与实现收口 - 结论:Release 是业务 Fallback 唯一决策入口;Application 不重建业务内容。 - 证据:`DiagnosisReleaseUseCase` 统一路径 + Application 窄化预算终态持久化。 - 用户确认:已确认 ## 实现期补充证据 - Draft 合同失败窄化降级:非法 Draft 丢弃;仅当 ProgressSnapshot 有已验真 facts 时发 `INSUFFICIENT_EVIDENCE`。 - Task 8 focused tests:tracker / interceptor / release / agent-loop / config 全部通过。