14 KiB
Chat Diagnosis StateGraph Cleanup, Final Acceptance And Documentation Decisions
Entry Summary
- 问题:ISS-011 运行时已切换且测试体系已收敛,但旧 Hook/ThreadLocal/service死代码、当前架构文档和最终 live 证据尚未闭环。
- 期望:阶段 5完成清理、文档、自动化回归、eval、Maven E2E、日志/DB 验收、Issue 归档和独立提交。
- 分档:complex;接口影响 L2 内部删除 + 文档/demo 验收增强,外部 API/DB 协议不变。
- Change:
chat-diagnosis-stategraph-cleanup-docs。 - 授权:用户已明确要求直接实现;本阶段按此前规则执行唯一最终 E2E。
Context Sources
- ISS-011 阶段 5、测试策略、协议影响、验收标准和冻结决策。
- 阶段 0–4 OpenSpec archives、devflow acceptance 与提交
581daff、42ba204、1460dd1、99e490f、208a231。 - 全仓
VerifierInputHook/VerifierContextHolder/ToolTraceSummaryService定义与引用搜索。 mvp/architecture/README.md列出的 current docs、mvp/eval/README.md、mvp/demo/scripts/checklist。mvp-demoprofile、payment-timeout request、scripts/query_mysql.py和 logs/ 现有布局。
Question Pool
| # | 维度 | 问题 | 模式 | 状态 |
|---|---|---|---|---|
| Q1 | 清理 | 旧 Hook/ThreadLocal/trace summary service 是否还有生产消费者? | evidence-driven | 已解决 |
| Q2 | 文档 | 哪些旧引用应更新,哪些历史材料应保留? | evidence-driven | 已解决 |
| Q3 | E2E | 最终 live 场景如何绑定唯一 session/run 并证明 Graph 路径? | evidence-driven | 已解决 |
| Q4 | 日志/DB | 如何避免用旧日志/latest DB 记录冒充当前证据? | evidence-driven | 已解决 |
| Q5 | 验收 | 何时允许启动 Maven、是否需要日志和 DB 查询? | user-interview(用户最新规则) | 已确认 |
| Q6 | 关闭 | 何时把 ISS-011 从 active 移到 archived? | evidence-driven | 已解决 |
Evidence-driven Findings
- Q1:旧闭包只有
VerifierInputHook -> VerifierContextHolder + ToolTraceSummaryService,以及ToolTraceSummaryServiceTest;ChatService/Graph/Trace/Eval 均无引用,可整体删除。 - 实现前规格校正:
ChatVerifierPromptContractTest和DiagnosisGraphTestSuiteStructureTest必须保留旧类型名称的负向字符串断言;这不构成 executable reference。OpenSpec 已收紧为无定义/import/实例化/type-use,允许负向 guard literal。 - Q2:current architecture index 仍列
agent-orchestration.md等为当前真理源,因此必须更新;mvp/issues/design-notes、archived issues、历史 eval fixtures 保留时间点/兼容语义,不做大规模重写。 - Q3:
run-interview-demo-check.ps1已用 Chat response runId 查询 exact Trace/feedback,最适合扩展run.orchestrationTracefail-fast 和 summary,不另建重复脚本。 - Q4:E2E 使用唯一 timestamp sessionId;日志记录启动前 byte/time 边界并按 session/run 搜索;DB 所有核心查询带 exact sessionId/runId,另查询错误 ownership count。
- Q6:只有实现、回归、eval、live E2E、日志、DB 和 OpenSpec门禁全部通过后,Issue checkbox 才可完成并移动到 archived。
User-interview Confirmation
| 问题 | 用户原话 | 状态 | OpenSpec 回写 |
|---|---|---|---|
| Q5 最终验收节奏 | “端到端只在最后阶段全部完成后才验证……日志在log文件夹,项目库有查询数据库的py工具” | 已确认 | proposal |
Grill-with-docs Result
- Session/Run/Trace 术语保持不变;新增强调
orchestration_trace是 Run 路由摘要,不属于 self-evaluation 或日志。 - StateGraph、Workflow/Node Contract/Chat Integration 属于实现/测试架构术语,不修改业务 glossary。
- 当前文档必须使用 explicit Gatekeeper Node、verified-only Verifier 和 bounded evidence retry;历史设计笔记仍可描述当时 Hook 架构。
- 删除旧闭包是阶段 0 已冻结单轨迁移的自然收尾,不形成新的难逆转权衡,无需 ADR。
Discover Status
devflow/index.md:命中阶段 0–4 archives。- 接口影响:L2 内部类型删除;外部 API/DTO/DB/Prompt/状态语义无变化。
- E2E 入口/脚本/日志/DB 工具已定位;真实执行留到 Apply 最后。
- 未解决问题:0。
- Draft 产物:proposal + decisions;尚未生成 design/spec/tasks,尚未删除代码或启动应用。
Architecture Audit
Module and evidence map
ChatController -> ChatService -> ChatDiagnosisGraphRuntime -> DiagnosisRealGraphActionsFactory -> explicit Nodes -> DiagnosisGraphResultMapper -> DiagnosisRun/Trace 是唯一当前 Chat链。旧 VerifierInputHook -> ToolTraceSummaryService/VerifierContextHolder 已从主链断开,删除不改变输入/输出或持久化。阶段 5新增的 demo script assertion只消费 exact Trace run.orchestrationTrace,DB/log检查是验收消费者,不成为运行时业务依赖。
| 模块 | 所有权 | 阶段 5动作 |
|---|---|---|
| Graph/Chat runtime | 路由、Node、Run 生命周期 | 不改行为,仅回归 |
| Legacy Hook closure | 旧 Sequential Verifier payload | 整体删除 |
| Current architecture docs | 当前实现真理源 | 更新 StateGraph/verified-only/trace |
| Historical docs/fixtures | 时间点/兼容记录 | 保留,不冒充当前实现 |
| Demo check | live Chat/Trace/feedback executable contract | 增加 exact orchestration trace fail-fast |
| logs/MySQL | live运行证据 | 只读本次 session/run |
| ISS/OpenSpec/devflow | 生命周期与交接 | 所有门禁通过后归档 |
Lifecycle and failure ownership
- 自动化门禁失败:不启动 live Maven,修复代码/测试/规格后重跑。
- live startup失败:应用未 ready,不执行 demo/DB成功声明,先读启动输出和新日志诊断。
- Chat/Trace/feedback失败:保留 exact response/run证据,ISS保持 active。
- log ERROR:逐条分类;未解释 ERROR阻塞验收。
- DB不一致:以 exact run为准,不能用 API成功掩盖 persistence偏差。
- finally:无论成功失败都停止本轮进程并确认端口,不扩大到未知已有进程。
Consumer and compatibility audit
- 外部 API/DTO/DB consumer无迁移;demo summary仅加字段。
- Trace UI/eval 对历史
tool_trace_summary的读取保留,旧 fixture不批量迁移。 - current docs消费者将看到新 StateGraph架构;历史链接仍可追溯 old Hook设计。
- Issue move只改变文档位置/index,代码/运行时不依赖该路径。
Cross-artifact alignment
| 上游 → 下游 | 检查内容 | 状态 |
|---|---|---|
| brief/proposal → proposal | cleanup、current docs、demo、regression、live/log/DB、Issue closure | 已对齐 |
| proposal → design | 删除闭包、current/history边界、顺序、identity、日志/DB、cleanup | 已对齐 |
| design → specs/tasks | 负向 literal例外、E2E字段、exact evidence、进程清理、Issue gate | 已对齐 |
| specs → tasks | 每条 requirement有可执行 cleanup/docs/test/live/log/DB/closure slice | 已对齐 |
Audit result
审计确认阶段 5不需要新运行时抽象或 DB migration;主要风险来自外部 live状态和证据归属,已通过 unique session/run、log boundary、exact DB queries和process ownership缓解。规格误把负向名称 literal 当 executable reference 的 gap 已修正。接口影响 L2,cross-artifact gap=0,无新 ADR。
Commit Gate
- schema:spec-driven;proposal/design/2 delta specs/tasks 全部 done,applyRequires=
tasks已满足。 - OpenSpec:当前 change strict pass;16 个主 specs strict pass。
- Cross-artifact:4/4 已对齐,gap=0;负向 guard literal例外已写入 proposal/design/spec/tasks。
- Question pool:5 个 evidence-driven 已解决,1 个 user-interview 已由用户原话确认,无未决项。
- Interface impact:L2 internal type removal + demo/docs enhancement;外部协议/DB无变化。
- Preflight:
git diff --check通过;尚未删除代码、修改 current docs/script或启动应用。 - 结论:Draft OpenSpec 达到可执行状态,创建
.committed后进入 Apply。
Apply Progress
Legacy closure removal
- 已删除
VerifierInputHook、VerifierContextHolder、ToolTraceSummaryService和ToolTraceSummaryServiceTest,四个路径均不存在。 rg对src/main、src/test的旧类型扫描仅命中ChatVerifierPromptContractTest和DiagnosisGraphTestSuiteStructureTest中的负向守卫字符串;无定义、import、实例化、继承或类型依赖。- 删除后 focused 回归覆盖 Executor parser、Gatekeeper service/node、VerifiedInput、Verifier、Composer、Fallback、Workflow、Node Contract、Chat integration、Trace、result mapper 和结构契约:14 suites / 82 tests,0 failure、0 error、0 skipped。
mvn -q -DskipTests test-compile通过;Graph/shared protocol 真理源保留,Spring 当前链路所需类型可完整编译。
Current docs and demo contract
- architecture index、编排、session/trace、current MVP、evidence pipeline、quality gates、feedback、retrieval 和 eval 文档已切换为 bounded StateGraph、显式 Gatekeeper/Verified Input、verified-only Verifier、有限重试/Fallback 和 Run-owned
orchestration_trace。 - current-doc scan 对
SequentialAgent、旧 Hook/ThreadLocal/service 及旧测试类名为 0 命中;tool_trace_summary仅剩 4 处,均明确标注为旧 Run/fixture 只读兼容,不是当前 Verifier 输入。 - interview demo check 绑定 Chat 返回的 exact runId,校验 Chat/Trace ownership、Run CHAT/SUCCESS、Agent/tool/self-evaluation、Graph trace 六个字段和 feedback success;summary 新增 orchestration version、final node、termination reason、degraded、transition count 和 evidence retry count。
- PowerShell parser 语法检查通过;
InterviewDemoScriptContractTest2 tests 通过,覆盖 exact runId URL/response、orchestration fail-fast 和 summary 字段。
Final deterministic gates
- authoritative/focused regression:39 suites / 157 tests,0 failure、0 error、0 skipped;覆盖三层 Graph、全部 Graph Node/router/trace builder、Chat/Trace/Gatekeeper/Composer、Controller、Repository、schema、feedback/tool recorder 和 demo contract。
- fixed diagnosis eval:12/12 passed,verdict distribution 为 PASS=5、LOW_CONFID=6、REJECT=1;same-baseline diff 无 regression、0 items。
mvn -q -DskipTests test-compile通过;当前 change strict 通过,16 个主 specs strict 全部通过。git diff --check、legacy executable refs、current-doc stale refs 和 unexpected schema change 检查全部通过。- focused 回归日志中的 Graph ERROR/exception stack trace 来自
ChatServiceGraphIntegrationTest对 FAILED/no-answer/unhandled failure 的显式契约用例,Maven exit 0,不是未解释的 live ERROR。
Live failure diagnosis and correction
-
首次 live identity:sessionId=
iss-011-stage5-20260717140450,runId=run-6db680f8-f764-49d1-995f-0e55a4b05a06。demo contract 在 exact Tracerun.orchestrationTrace=null处 fail-fast,未提交 feedback;Run 为CHAT/FAILED,步骤/工具均为 0。 -
新日志根因:
DiagnosisOrchestrationTraceBuilder收到类名相同但 classloader identity 不同的OrchestrationEvent,instanceof失败并抛出orchestration events contain unsupported value。这是 Spring Boot DevTools live classloader 才暴露的 Graph state 表示缺陷,单元 JVM 未复现。 -
冲突分类:代码偏离/运行时兼容 bug,OpenSpec 对 non-empty orchestration trace 和 live Maven startup 的要求正确,不修改验收口径。
-
RED:新增 portable event map builder 回归,修复前 1 test error;GREEN:Graph state 的 production/test actions 改存 classloader-neutral Map,builder兼容 local record/Map,Node/Workflow assertions 改读 Map。
-
修复后先运行 5-suite Graph/Node/Runtime/Chat integration focused gate,再运行完整 39 suites / 157 tests,全部 0 failure/error/skipped;首次 Maven 进程链已按 ownership 停止,9900 已释放。
-
第二个 live blocker 为外层 Graph
RunnableConfig的 resume metadata 被原样传给内层 ReactAgent,触发Resume request without a configured checkpoint saver。回归先证明 nested config 与 outer config 同一且含HUMAN_FEEDBACK,再改为保留 sessionId/runId、剔除 resume/state-update/checkpoint 控制信息的独立配置;5 suites / 50 tests 和随后完整 39 suites / 157 tests 通过,临时[DEBUG-ISS011-NODE]探针已删除且源码扫描为 0。 -
2026-07-17 的一次长请求在工具执行期间遭遇外部 MySQL 瞬时
Connection is closed,留下精确RUNNING失败尝试;仓库查询工具随后证明数据库恢复且 serverwait_timeout=28800。该失败未被当作验收通过,失败 Run 保留为真实审计记录。
Accepted live E2E
- 启动:
mvn spring-boot:run "-Dspring-boot.run.profiles=mvp-demo";启动前 9900 空闲,隐藏进程链为 cmd25080-> Maven Java17860-> app Java10732,readiness 后执行固定 payment-timeout demo。 - identity:sessionId=
iss-011-stage5-20260720015557,runId=run-808ac38f-3ad0-4462-a6d0-ed50d8686473;Chat/Trace exact identity 一致,answer 长度 109,feedback request success。 - Trace:Run=
CHAT/SUCCESS,8 AgentSteps、12 ToolInvocations,self-evaluation 非空;stategraph-v1,final node=fallback,termination=fallback_completed,degraded=true,3 transitions,evidence retry count=0。 - Fallback 原因是 Gatekeeper LOW_CONFID 且本轮模型输出缺少
source_invocation_id;这是按冻结契约执行的安全降级,answer 非空且未绕过 Gatekeeper,日志/DB 均可审计。 - 最终日志发生跨日 rollover:7 月 20 日 active
application.log/chat.log全部属于本轮;application-error.log最后写入仍为 7 月 17 日。本轮rg " ERROR "对 application/chat 为 0,新增 error-file bytes 为 0;session/run、Graph 75964ms、evaluation、exact Trace 和 useful feedback 均有关联日志。 - MySQL:V012
orchestration_trace为 nullable JSON;exact Run answer=109、duration=75964、token=111802、steps=8、tools=12、evaluation len=8822、trace len=438、feedback=useful;JSON 路由与 Trace 完全一致。 - ownership:AgentStep 8、ToolInvocation 12,各自 distinct session/run=1、wrong owner=0;唯一 session 下 wrong run/step/tool 均为 0。
- cleanup:只停止 PID
10732/17860/25080,最终 9900 已释放,无剩余 owned process。