Files

128 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Context
ISS-011 的运行时和测试迁移已经完成:复杂 Chat 通过真实 Diagnosis StateGraph,Graph Nodes 使用显式 RunnableConfig/verified state,Run 保存 orchestration trace,三层权威 tests 已建立。剩余工作跨越代码清理、current docs、demo script、eval、live process、日志、数据库和 Issue 生命周期,必须按“静态/自动化先完成,live E2E 最后执行”的顺序收口。
全仓引用证明旧闭包为 `VerifierInputHook -> VerifierContextHolder + ToolTraceSummaryService`,外加 `ToolTraceSummaryServiceTest`。新 Graph 不依赖该闭包。current architecture docs 仍描述 Sequential/Hook/full trace;历史 issues/design-notes/fixtures 则应保留当时语义或历史兼容数据。
## Goals / Non-Goals
**Goals:**
- 删除旧闭包且保持 Graph parser/Gatekeeper/projection/evaluation 行为。
- 把 architecture index 声明的 current docs、active eval/demo docs 与真实 StateGraph/Run trace 对齐。
- 让 interview demo check 将 exact `run.orchestrationTrace` 作为强制验收字段和 summary 输出。
- 运行确定性 Graph/test/eval gates,再启动 Maven 完成唯一最终 live E2E。
- 对本次 E2E 的日志和数据库做 exact session/run 证据核验并清理进程。
- 全部通过后关闭/归档 ISS-011 和阶段 5 OpenSpec。
**Non-Goals:**
- 不修改 Graph 路由、Prompt、公开 API、DTO 或 DB schema。
- 不重写历史 archived/design-note 文档和 legacy eval fixtures。
- 不删除 UI/eval 对历史 `tool_trace_summary` 的兼容读取。
- 不治理仓库凭据、外部基础设施或其他 active issues。
## Decisions
### 1. 删除完整旧闭包,不留下空壳 Hook
删除 `VerifierInputHook.java`、`VerifierContextHolder.java`、`ToolTraceSummaryService.java` 和 `ToolTraceSummaryServiceTest.java`。保留空类或 deprecated wrapper 会继续让维护者误认为存在第二条 Verifier 输入路径,也会让 Spring component 扫描注册无消费者 service。
删除前后以全仓 definition/import/instantiation/type-use 搜索、test compilation、Graph suite、Gatekeeper/protocol tests 证明闭包;负向契约 test 可保留名称字符串,任何可执行类型依赖都视为 cleanup blocker。
### 2. current docs 改为显式 StateGraph,历史 docs 保留
必须更新:
- `mvp/architecture/README.md`
- `agent-orchestration.md`
- `session-trace-lifecycle.md`
- `current-mvp-architecture.md`
- `executor-evidence-pipeline-refactor.md`
- `harness-quality-gates.md`
- `feedback-architecture.md`
- `retrieval-observability.md`
- `mvp/eval/README.md`
- `mvp/demo/README.md` / trace checklist
历史 archived issues/design-notes 和 legacy fixtures不批量替换:它们记录演进阶段或兼容旧 Trace。current docs 若提到 `tool_trace_summary`,只能标注为历史读取兼容,不能描述为新 Verifier 输入/持久化源。
### 3. Demo script 是 final E2E executable contract
扩展 `run-interview-demo-check.ps1`:
1. 从 Chat response 获取 runId。
2. 查询 exact Trace。
3. 要求 `trace.data.run.orchestrationTrace` 非空。
4. 要求 version/final_node/termination_reason 非空,transitions 为数组。
5. 把 finalNode、terminationReason、degraded、transitionCount、evidenceRetryCount 写入 summary。
6. 保留 feedback 和 Prompt/Gatekeeper summary。
脚本必须 fail fast,不能用 session self-evaluation 或日志合成缺失的 Graph trace。
### 4. 自动化门禁先于 live E2E
顺序固定:cleanup source check → docs/script tests → Graph/Chat/Trace/Gatekeeper/Composer/Controller/Repository tests → diagnosis eval baseline/diff → test compilation → OpenSpec/static gates → live startup/E2E → logs → DB → process cleanup。
在 live 前发现的失败按 OpenSpec/code/test/documentation分类;live 后失败使用 diagnose loop,以 exact run evidence 定位,不通过放宽断言绕过。
### 5. Live E2E 使用唯一 identity 和可回收后台 Maven
- sessionId:`iss-011-stage5-<timestamp>`。
- Maven:`spring-boot:run` + `mvp-demo` profile,后台 hidden process,stdout/stderr 写入 `target/` 临时文件。
- readiness:轮询 9900,最长明确超时,不阻塞超过 60 秒且持续汇报。
- 执行:复用 interview demo script,输出写入 `target/iss-011-stage5-output/`,避免覆盖已提交 demo sample。
- 最终:停止应用进程树,确认 9900 无监听,删除临时启动/output文件。
如果 9900 启动前已被其他进程占用,先识别而不是杀掉未知进程;只有本轮启动的 PID 可被清理。
### 6. 日志与数据库证据只认本次 Run
启动前记录 `logs/application.log`、`application-error.log`、`chat.log` 长度和时间;E2E 后只读新增片段,并搜索 sessionId/runId、Graph执行、Flyway/JPA 和 ERROR。测试阶段写入的旧日志不计入 live 证据。
数据库通过 `scripts/query_mysql.py` 执行 read-only queries:
- `SHOW COLUMNS ... orchestration_trace`。
- exact `diagnosis_run` status/flow/answer/metrics/self_evaluation/orchestration trace/feedback。
- JSON_EXTRACT version/final_node/termination_reason/degraded/evidence_retry_count。
- exact run AgentStep/ToolInvocation count 和 distinct ownership。
- wrong session ownership count=0。
所有查询必须带 E2E sessionId/runId 或 schema column 条件;不接受全局 latest 代替。
### 7. Issue 归档是最后一个实现动作
E2E/log/DB 任一失败时 ISS-011 保持 active。全部通过后更新验收 checkbox和状态,将文件 move 到 `mvp/issues/archived/`,并把 issues index 从 active 移到 archived。OpenSpec archive 在 Issue move 后执行,Git commit 是阶段 5最后门禁。
## Interface Impact
- 等级:L2 内部类型删除 + demo/docs 增强。
- 外部 `/api/chat`、Trace、feedback、DB schema 和 JSON 字段:不变。
- 内部消费者:旧 Hook/ThreadLocal/service 无消费者,删除无需迁移调用点。
- Demo script 行为:新增 fail-fast orchestration trace contract和 summary 字段;旧 Chat/Trace/feedback outputs保留。
- 回滚:revert 阶段 5代码/文档;DB/生产数据无变更。E2E产生的 demo Run 是正常审计数据,不执行破坏性回滚。
## Risks / Trade-offs
- [隐藏反射/配置消费者未被 rg发现] → test compilation + Spring startup 是最终验证;发现即恢复并修正规格。
- [文档仍有历史术语] → current docs 白名单扫描;history/design-notes允许但索引明确非当前真理源。
- [live LLM 输出波动] → mock logs/metrics提供稳定工具证据;Graph允许安全 Fallback,但验收仍要求非空真实 orchestration trace和一致 Run生命周期。
- [外部 DB/Redis/Milvus/LLM不可用] → readiness/log/DB diagnose;不伪造通过,不修改验收口径。
- [停止进程误伤] → 只记录和终止本轮 Maven/Java PID,结束后用端口复核。
- [E2E output覆盖仓库样例] → 输出放 target临时目录,证据摘要提炼进 devflow 后删除临时文件。
## Migration Plan
1. 删除旧闭包,运行 source/test compilation/Graph安全回归。
2. 更新 current docs 和 demo script/checklist,增加静态脚本契约 test。
3. 运行完整 focused tests、diagnosis eval baseline/diff、OpenSpec/static gates。
4. Maven `mvp-demo` startup,运行 unique session E2E。
5. 检查新增日志片段和 exact DB数据,停止进程、清理临时文件。
6. 更新/移动 ISS-011,回填 devflow,archive OpenSpec,独立提交。
运行时回滚为 Git revert;数据库 V012列和 E2E Run可安全保留。
## Open Questions
无。清理闭包、current/history docs边界、E2E身份/证据和 Issue关闭门禁均已确定。