feat(graph): complete stategraph cleanup and acceptance
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# MVP Issues 索引
|
||||
|
||||
**更新日期**:2026-07-16
|
||||
**更新日期**:2026-07-20
|
||||
**状态**:按活跃问题、设计笔记、RAG 问题集和已归档问题整理
|
||||
|
||||
## 目录约定
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
| 名称 | 标题 | 严重程度 | 状态 | 文件 |
|
||||
|---|---|---|---|---|
|
||||
| ISS-011 | Chat 诊断 StateGraph 编排改造 | 高 | 待实现 | [active/ISS-011-chat-diagnosis-stategraph-orchestration.md](active/ISS-011-chat-diagnosis-stategraph-orchestration.md) |
|
||||
| ISS-003 | MVP 设计与实现 Review 收敛 | 高 | 待规划 | [active/ISS-003-mvp-design-implementation-review.md](active/ISS-003-mvp-design-implementation-review.md) |
|
||||
| ISS-004 | Executor 域级检索水位控制 | 低 | 待规划 | [active/ISS-004-executor-domain-hard-limit.md](active/ISS-004-executor-domain-hard-limit.md) |
|
||||
| executor-evidence-attribution-hallucination | Executor 证据归因幻觉 | 高 | 待规划 | [active/executor-evidence-attribution-hallucination.md](active/executor-evidence-attribution-hallucination.md) |
|
||||
@@ -53,6 +52,7 @@
|
||||
|
||||
| 名称 | 标题 | 状态 | 文件 |
|
||||
|---|---|---|---|
|
||||
| ISS-011 | Chat 诊断 StateGraph 编排改造 | 已归档 | [archived/ISS-011-chat-diagnosis-stategraph-orchestration.md](archived/ISS-011-chat-diagnosis-stategraph-orchestration.md) |
|
||||
| ISS-001 | Executor 重复召回同一文档 | 已修复 | [archived/ISS-001-duplicate-retrieval.md](archived/ISS-001-duplicate-retrieval.md) |
|
||||
| ISS-002 | Executor 无约束重复调用 lookup_knowledge | 已修复 | [archived/ISS-002-executor-unconstrained-lookup.md](archived/ISS-002-executor-unconstrained-lookup.md) |
|
||||
| ISS-005 | 证据链补齐与降级契约收敛 | 已归档 | [archived/ISS-005-evidence-trace-hardening.md](archived/ISS-005-evidence-trace-hardening.md) |
|
||||
|
||||
+56
-55
@@ -1,8 +1,9 @@
|
||||
# ISS-011 Chat 诊断 StateGraph 编排改造
|
||||
|
||||
**状态**:待实现
|
||||
**状态**:已归档
|
||||
**严重程度**:高
|
||||
**发现时间**:2026-07-16
|
||||
**完成时间**:2026-07-20
|
||||
**来源**:OnCall / Agent 编排模拟面试、当前 Chat 复杂诊断调用链复核
|
||||
**预计实施周期**:2–3 个工作日
|
||||
|
||||
@@ -871,69 +872,69 @@ Eval baseline
|
||||
|
||||
### 编排
|
||||
|
||||
- [ ] 每次进入 Planner 阶段时,INVALID_OUTPUT / RETRYABLE_FAILED 最多触发一次技术重试。
|
||||
- [ ] Planner NON_RETRYABLE_FAILED 或当前阶段第二次技术失败直接进入 Fallback。
|
||||
- [ ] Planner 技术重试不增加 `evidence_retry_count`,补证据重新进入 Planner 时重置当前阶段的 `planner_retry_count`。
|
||||
- [ ] Executor FAILED / TOOL_BLOCKED 后不会执行 Gatekeeper 和 Verifier。
|
||||
- [ ] Executor INVALID_OUTPUT 不重试,不执行 Gatekeeper、Verifier 和模型 Composer。
|
||||
- [ ] TOOL_BLOCKED 只用于工具层明确阻断且不存在合法 Executor 输出的场景。
|
||||
- [ ] 工具空结果或工具失败后仍形成合法 Executor 输出时状态为 COMPLETED,并继续 Gatekeeper。
|
||||
- [ ] Executor 合法 no-evidence 会继续执行 Gatekeeper 和 Verifier。
|
||||
- [ ] Gatekeeper REJECT 直接进入 Fallback,不执行 Verifier。
|
||||
- [ ] Gatekeeper LOW_CONFID 且零条已验真 binding 时直接进入 Fallback。
|
||||
- [ ] Gatekeeper LOW_CONFID 且存在已验真 binding 时,Verifier 只接收通过校验的 binding。
|
||||
- [ ] Gatekeeper PASS 和可继续的 LOW_CONFID 都经过 Verifier Input Builder。
|
||||
- [ ] Verifier 只接收通过 binding 对应的 `verified_evidence`,不接收完整 `tool_trace_summary`。
|
||||
- [ ] 未被 Executor 引用或未通过 Gatekeeper 的工具结果不能进入 Verifier 输入。
|
||||
- [ ] Gatekeeper LOW_CONFID 路径的 `effective_verdict` 不得升级为 PASS。
|
||||
- [ ] Gatekeeper 原始 pass/fail + severity 正确标准化为 PASS / LOW_CONFID / REJECT,未知状态安全映射为 REJECT。
|
||||
- [ ] Verifier 执行状态与诊断 verdict 分离,任何失败状态不得出现在 model/effective verdict 中。
|
||||
- [ ] Composer 和 Graph 条件边只读取 `effective_verdict`。
|
||||
- [ ] Verifier INVALID_OUTPUT / RETRYABLE_FAILED 使用相同 verified input 最多技术重试一次,且不重新执行 Gatekeeper、Executor 或工具。
|
||||
- [ ] Composer INVALID_OUTPUT / RETRYABLE_FAILED 使用相同安全输入最多技术重试一次,且不重新执行 Verifier 或前序节点。
|
||||
- [ ] Verifier 第二次技术失败或 NON_RETRYABLE_FAILED 的 Fallback 不输出 Executor claim。
|
||||
- [ ] Composer 第二次技术失败或 NON_RETRYABLE_FAILED 使用确定性安全模板。
|
||||
- [ ] `verifier_retry_count`、`composer_retry_count` 和 `evidence_retry_count` 互相独立。
|
||||
- [ ] Verifier LOW_CONFID 最多触发一次 Planner 补证据。
|
||||
- [ ] LOW_CONFID 补证据循环受一次补查上限和 Graph recursion limit 限制。
|
||||
- [ ] Gatekeeper verdict ceiling 导致的 LOW_CONFID 不触发补证据。
|
||||
- [ ] 无法从 `facts_checked` 提取有效 `evidence_gaps` 时不触发补证据。
|
||||
- [ ] 第二轮 Planner 只输出增量计划,不扩大诊断范围或重复成功查询。
|
||||
- [ ] 第二轮 Executor 只执行增量查询,但输出完整 `executor_evidence_v2` 快照,而不是仅输出新增片段。
|
||||
- [ ] 第二轮完整快照包含需要保留的第一轮可信 claims,并由 Gatekeeper 对全部 binding 重新验真。
|
||||
- [ ] Java 编排层不对两轮 claim 文本进行语义合并。
|
||||
- [ ] Composer 技术重试耗尽或不可重试失败时使用固定模板结束。
|
||||
- [x] 每次进入 Planner 阶段时,INVALID_OUTPUT / RETRYABLE_FAILED 最多触发一次技术重试。
|
||||
- [x] Planner NON_RETRYABLE_FAILED 或当前阶段第二次技术失败直接进入 Fallback。
|
||||
- [x] Planner 技术重试不增加 `evidence_retry_count`,补证据重新进入 Planner 时重置当前阶段的 `planner_retry_count`。
|
||||
- [x] Executor FAILED / TOOL_BLOCKED 后不会执行 Gatekeeper 和 Verifier。
|
||||
- [x] Executor INVALID_OUTPUT 不重试,不执行 Gatekeeper、Verifier 和模型 Composer。
|
||||
- [x] TOOL_BLOCKED 只用于工具层明确阻断且不存在合法 Executor 输出的场景。
|
||||
- [x] 工具空结果或工具失败后仍形成合法 Executor 输出时状态为 COMPLETED,并继续 Gatekeeper。
|
||||
- [x] Executor 合法 no-evidence 会继续执行 Gatekeeper 和 Verifier。
|
||||
- [x] Gatekeeper REJECT 直接进入 Fallback,不执行 Verifier。
|
||||
- [x] Gatekeeper LOW_CONFID 且零条已验真 binding 时直接进入 Fallback。
|
||||
- [x] Gatekeeper LOW_CONFID 且存在已验真 binding 时,Verifier 只接收通过校验的 binding。
|
||||
- [x] Gatekeeper PASS 和可继续的 LOW_CONFID 都经过 Verifier Input Builder。
|
||||
- [x] Verifier 只接收通过 binding 对应的 `verified_evidence`,不接收完整 `tool_trace_summary`。
|
||||
- [x] 未被 Executor 引用或未通过 Gatekeeper 的工具结果不能进入 Verifier 输入。
|
||||
- [x] Gatekeeper LOW_CONFID 路径的 `effective_verdict` 不得升级为 PASS。
|
||||
- [x] Gatekeeper 原始 pass/fail + severity 正确标准化为 PASS / LOW_CONFID / REJECT,未知状态安全映射为 REJECT。
|
||||
- [x] Verifier 执行状态与诊断 verdict 分离,任何失败状态不得出现在 model/effective verdict 中。
|
||||
- [x] Composer 和 Graph 条件边只读取 `effective_verdict`。
|
||||
- [x] Verifier INVALID_OUTPUT / RETRYABLE_FAILED 使用相同 verified input 最多技术重试一次,且不重新执行 Gatekeeper、Executor 或工具。
|
||||
- [x] Composer INVALID_OUTPUT / RETRYABLE_FAILED 使用相同安全输入最多技术重试一次,且不重新执行 Verifier 或前序节点。
|
||||
- [x] Verifier 第二次技术失败或 NON_RETRYABLE_FAILED 的 Fallback 不输出 Executor claim。
|
||||
- [x] Composer 第二次技术失败或 NON_RETRYABLE_FAILED 使用确定性安全模板。
|
||||
- [x] `verifier_retry_count`、`composer_retry_count` 和 `evidence_retry_count` 互相独立。
|
||||
- [x] Verifier LOW_CONFID 最多触发一次 Planner 补证据。
|
||||
- [x] LOW_CONFID 补证据循环受一次补查上限和 Graph recursion limit 限制。
|
||||
- [x] Gatekeeper verdict ceiling 导致的 LOW_CONFID 不触发补证据。
|
||||
- [x] 无法从 `facts_checked` 提取有效 `evidence_gaps` 时不触发补证据。
|
||||
- [x] 第二轮 Planner 只输出增量计划,不扩大诊断范围或重复成功查询。
|
||||
- [x] 第二轮 Executor 只执行增量查询,但输出完整 `executor_evidence_v2` 快照,而不是仅输出新增片段。
|
||||
- [x] 第二轮完整快照包含需要保留的第一轮可信 claims,并由 Gatekeeper 对全部 binding 重新验真。
|
||||
- [x] Java 编排层不对两轮 claim 文本进行语义合并。
|
||||
- [x] Composer 技术重试耗尽或不可重试失败时使用固定模板结束。
|
||||
|
||||
### 证据和安全
|
||||
|
||||
- [ ] Gatekeeper 规则语义不放宽。
|
||||
- [ ] Verifier 只消费已验真证据。
|
||||
- [ ] no-evidence 不得表达为已排除或问题不存在。
|
||||
- [ ] REJECT 降级不泄漏 Executor 原始答案和未验证根因。
|
||||
- [ ] Executor INVALID_OUTPUT、Gatekeeper REJECT 和零条可信 binding 的固定 Fallback 不输出任何 Executor claim。
|
||||
- [ ] 前置验证失败 Fallback 只展示校验状态、工具执行概况、诊断限制和人工复核建议。
|
||||
- [x] Gatekeeper 规则语义不放宽。
|
||||
- [x] Verifier 只消费已验真证据。
|
||||
- [x] no-evidence 不得表达为已排除或问题不存在。
|
||||
- [x] REJECT 降级不泄漏 Executor 原始答案和未验证根因。
|
||||
- [x] Executor INVALID_OUTPUT、Gatekeeper REJECT 和零条可信 binding 的固定 Fallback 不输出任何 Executor claim。
|
||||
- [x] 前置验证失败 Fallback 只展示校验状态、工具执行概况、诊断限制和人工复核建议。
|
||||
|
||||
### 数据与审计
|
||||
|
||||
- [ ] Graph 使用 runId 作为 threadId。
|
||||
- [ ] Agent step、tool invocation 和 self_evaluation 仍绑定正确 runId。
|
||||
- [ ] `orchestration_trace` 只写入当前 diagnosis run,不污染其他 run 或 session 级数据。
|
||||
- [ ] `orchestration_trace` 不包含 Prompt、模型思考、工具原文和 Graph State 快照。
|
||||
- [ ] `orchestration_trace.transitions` 由有界 `orchestration_events` 生成,与实际节点执行顺序一致。
|
||||
- [ ] 可处理异常发生时,已经产生的 orchestration events 能够 best-effort 写入当前 run。
|
||||
- [ ] Trace 能展示实际节点路径、重试原因和终止原因。
|
||||
- [ ] 每个新 StateGraph Chat run 的 `run.orchestrationTrace` 非空,且顶层和兼容 `session` 投影不重复该字段。
|
||||
- [ ] Run 最终状态、答案、耗时、Token 和工具调用数正确回填。
|
||||
- [ ] 所有成功生成安全响应的终止路径将 Run 标记为 SUCCESS,并通过 verdict 或 `orchestrationTrace.degraded` 表达质量。
|
||||
- [ ] 只有未处理异常、持久化失败或无法生成安全响应时将 Run 标记为 FAILED。
|
||||
- [x] Graph 使用 runId 作为 threadId。
|
||||
- [x] Agent step、tool invocation 和 self_evaluation 仍绑定正确 runId。
|
||||
- [x] `orchestration_trace` 只写入当前 diagnosis run,不污染其他 run 或 session 级数据。
|
||||
- [x] `orchestration_trace` 不包含 Prompt、模型思考、工具原文和 Graph State 快照。
|
||||
- [x] `orchestration_trace.transitions` 由有界 `orchestration_events` 生成,与实际节点执行顺序一致。
|
||||
- [x] 可处理异常发生时,已经产生的 orchestration events 能够 best-effort 写入当前 run。
|
||||
- [x] Trace 能展示实际节点路径、重试原因和终止原因。
|
||||
- [x] 每个新 StateGraph Chat run 的 `run.orchestrationTrace` 非空,且顶层和兼容 `session` 投影不重复该字段。
|
||||
- [x] Run 最终状态、答案、耗时、Token 和工具调用数正确回填。
|
||||
- [x] 所有成功生成安全响应的终止路径将 Run 标记为 SUCCESS,并通过 verdict 或 `orchestrationTrace.degraded` 表达质量。
|
||||
- [x] 只有未处理异常、持久化失败或无法生成安全响应时将 Run 标记为 FAILED。
|
||||
|
||||
### 工程质量
|
||||
|
||||
- [ ] 新 Graph 测试覆盖所有分支。
|
||||
- [ ] `ChatServiceSequentialAgentTest` 已由新测试替换。
|
||||
- [ ] 不保留长期重复的 Sequential 和 Graph 两套实现。
|
||||
- [ ] 数据库 schema 仅新增 `diagnosis_run.orchestration_trace` nullable JSON 字段。
|
||||
- [ ] `/api/chat` 和证据协议不变;Trace API 仅在 `run` 对象新增必有的 `orchestrationTrace` 字段。
|
||||
- [x] 新 Graph 测试覆盖所有分支。
|
||||
- [x] `ChatServiceSequentialAgentTest` 已由新测试替换。
|
||||
- [x] 不保留长期重复的 Sequential 和 Graph 两套实现。
|
||||
- [x] 数据库 schema 仅新增 `diagnosis_run.orchestration_trace` nullable JSON 字段。
|
||||
- [x] `/api/chat` 和证据协议不变;Trace API 仅在 `run` 对象新增必有的 `orchestrationTrace` 字段。
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user