8.8 KiB
8.8 KiB
Chat Diagnosis StateGraph Test Suite Decisions
Entry Summary
- 问题:阶段 1–3 的安全覆盖已充足,但测试命名/组织仍是逐步实现产物,尚未形成 ISS-011 指定的 Workflow、Node Contract、Chat Integration 三层权威体系。
- 期望:阶段 4只重构测试结构并补齐矩阵,不改变生产行为;归档并提交后才进入阶段 5。
- 分档:complex(路径矩阵广、涉及旧安全测试退役,但接口影响为 L1 test-only)。
- Change:
chat-diagnosis-stategraph-test-suite。 - 授权:用户已要求直接实现,阶段门禁与阶段 5 才 live E2E 的约束不变。
Context Sources
- ISS-011 阶段 4、测试策略和验收标准。
chat-diagnosis-stategraph-design-freeze的 test migration requirement。- 阶段 1–3 archive/acceptance 和当前 119-test focused baseline。
DiagnosisGraphRoutingTest、各 Node tests、DiagnosisRealGraphIntegrationTest、ChatDiagnosisGraphRuntimeTest、ChatServiceGraphIntegrationTest。VerifierInputHookTest、protocol parser tests、ExecutorGatekeeperServiceTest与 Trace/Controller/Repository/Eval tests。
Question Pool
| # | 维度 | 问题 | 模式 | 状态 |
|---|---|---|---|---|
| Q1 | 术语 | Workflow、Node Contract、Chat Integration 的职责边界是什么? | evidence-driven | 已解决 |
| Q2 | 边界 | 是否把所有现有 Graph unit tests 合并成三个巨型类? | evidence-driven | 已解决 |
| Q3 | 旧测试 | VerifierInputHookTest 在显式 Graph Gatekeeper 后应保留、改写还是删除? |
evidence-driven | 已解决 |
| Q4 | 验收 | 如何证明阶段 4矩阵完整且没有恢复固定 Sequential 顺序? | evidence-driven | 已解决 |
| Q5 | 阶段 | 是否允许为测试可测性改生产代码或执行 live E2E? | user-interview(既有冻结规则) | 已确认 |
Evidence-driven Findings
- Q1:Issue 已明确三类测试;现有
DiagnosisGraphRoutingTest对应 Workflow,分散 Node/Protocol tests 对应 Node Contract,ChatServiceGraphIntegrationTest对应外部生命周期。 - Q2:现有细粒度测试失败定位清晰,全部合并会制造大文件;应保留专用 unit tests,同时新增/重命名三层权威入口并共享夹具。
- Q3:生产 Graph Verifier 已不注册 Hook,Hook test 仍验证 raw/full-trace/ThreadLocal payload,与 verified-only 生产协议冲突;parser/Gatekeeper/投影行为已有独立 tests,故阶段 4删除 Hook test,生产类型留到阶段 5。
- Q4:以 Issue 必需路径清单建立 requirement-to-test matrix;source check 禁止
SequentialAgent/VerifierInputHookTest成为新 suite 依赖,并运行保留安全回归。
User-interview Confirmation
| 问题 | 用户原话/既有确认 | 状态 | OpenSpec 回写 |
|---|---|---|---|
| Q5 阶段边界 | “端到端只在最后阶段全部完成后才验证;每个阶段如果有必要添加单元测试验收的话,就加” | 已确认 | proposal |
Grill-with-docs Result
- 术语不进入业务 glossary:Workflow/Node Contract/Integration 是测试架构术语,不改变 Session、Run、Trace、Gatekeeper 或 evidence gap 领域定义。
- 具体场景压力测试:同 session 多 run 属于 Chat Integration;Gatekeeper REJECT/LOW_CONFID 与 retry exhaustion 属于 Workflow;failed binding 过滤与 verified-only payload 属于 Node Contract。
- 旧 Hook test 的有效行为已分别迁移到
ExecutorEvidenceParserTest、ExecutorGatekeeperServiceTest、GatekeeperNodeTest和VerifiedInputNodeTest;删除不会丢失安全真理源。 - 没有难以逆转的新架构取舍,不创建 ADR;测试组织可以在保持行为矩阵的前提下继续演进。
Discover Status
devflow/index.md:命中阶段 0–3 archive。- 生产调用链:阶段 3 已冻结且测试阶段默认不修改。
- 接口影响:L1 test-only;无 API/DTO/DB/Prompt/运行时消费者变化。
- 未解决问题:0。
- Draft 产物:proposal + decisions;尚未生成 design/spec/tasks,尚未修改测试代码。
Architecture Audit
Test ownership map
ISS-011 path matrix -> DiagnosisGraphWorkflowTest -> ScriptedDiagnosisGraphActions -> real DiagnosisGraphFactory 负责控制流;Node/protocol contracts -> DiagnosisGraphNodeContractTest + focused component tests -> real Node actions/parsers/Gatekeeper 负责安全投影;public lifecycle -> ChatServiceGraphIntegrationTest -> Run repositories/Eval/Trace mapping 负责外部行为。Controller、Repository、Trace、Eval 和 protocol tests 是三层体系的下游安全消费者,不应被重写成 Graph 内部顺序断言。
Data and lifecycle ownership
- Workflow fixtures 只拥有脚本状态、调用计数和 events,不创建 Session/Run。
- Node Contract fixtures 只拥有 invoker input/output 和 mock Gatekeeper current-run result,不持久化生产实体。
- Chat Integration fixtures 只观察 ChatService public result 和 current Run persistence,不推断内部 Node 次序。
VerifierInputHookTest删除后不产生数据契约缺口:Executor parser、Gatekeeper、passed-binding projection 各自已有单一测试所有者。
Coupling risks
- 最大风险是 Workflow 与 Node Contract 都断言完整路径而重复;设计将 Fake route matrix 与 real-node input/security matrix分开。
ScriptedDiagnosisGraphActions是唯一 Fake topology fixture;不新增第二套 Graph builder。- 测试-only阶段禁止
src/maindiff,避免为测试便利扩大 production API。 - 类重命名使用 Git rename,旧名称仅允许出现在 OpenSpec/devflow迁移说明中。
Cross-artifact alignment
| 上游 → 下游 | 检查内容 | 状态 |
|---|---|---|
| brief/proposal → proposal | 三层体系、旧 Hook test退役、保留安全回归、阶段 5 E2E 延期 | 已对齐 |
| proposal → design | rename-not-copy、职责归属、production diff=0、rollback | 已对齐 |
| design → specs/tasks | Workflow/Node/Integration矩阵、Hook test删除、source inventory和验证门禁 | 已对齐 |
| specs → tasks | 每类 scenario 均有 rename、补缺、回归或静态验收任务 | 已对齐 |
Audit result
架构审计未发现业务 glossary、阶段 0–3 specs 或生产行为冲突。新 capability 只描述测试验证系统,modified design-freeze requirement 完整保留并细化旧测试替换边界。接口影响保持 L1,cross-artifact gap=0,无需回写生产 spec 或创建 ADR。
Commit Gate
- schema:spec-driven;proposal/design/2 delta specs/tasks 全部 done,applyRequires=
tasks已满足。 - OpenSpec:当前 change strict pass;15 个主 specs strict pass。
- Cross-artifact:4/4 已对齐,gap=0。
- Question pool:4 个 evidence-driven 已查证,1 个 user-interview 由用户既有原话确认,无未决项。
- Interface impact:L1 test-only;design 有独立影响/回滚章节,默认
src/maindiff=0。 - Preflight:
git diff --check通过,当前仅 Draft OpenSpec/devflow 与根目录计划文件,无测试/生产代码修改。 - 结论:Draft OpenSpec 达到可执行状态,创建
.committed后进入 Apply。
Apply Completion
DiagnosisGraphRoutingTest已以 Git rename 演进为DiagnosisGraphWorkflowTest;所有 scripted run 统一断言 events 与真实 sequence 完全一致。DiagnosisRealGraphIntegrationTest已演进为DiagnosisGraphNodeContractTest;补齐合法工具失败限制、partial-pass REJECT 和 Verifier invalid 无伪 verdict。- Workflow 显式断言 Gatekeeper ceiling 将模型 PASS 限制为 LOW_CONFID 且不触发 evidence retry,以及第二次 LOW_CONFID 不再补证据。
ChatServiceGraphIntegrationTest增加 SessionContextHolder finally cleanup 断言;public Run/Trace/Eval/multi-run 覆盖保持。VerifierInputHookTest已删除;生产 Hook/ThreadLocal 类型未修改,留待阶段 5清理。- 新增
DiagnosisGraphTestSuiteStructureTest,保证三个权威类存在、Sequential/Hook实现测试不存在且权威测试不引用旧实现。
Verification Summary
- 新权威层:4 suites / 43 tests,0 failures/errors/skipped。
- 完整保留安全回归:31 suites / 126 tests,0 failures/errors/skipped。
- Maven test compilation:通过。
- OpenSpec:当前 change strict pass;主 specs 15/15 strict pass。
- 静态门禁:
git diff --check通过;required authoritative classes=3;legacy tests=0;scripted fixture definitions=1;src/maindiff=0。 - 按阶段门禁未运行 Maven live E2E、未检查
logs/、未执行scripts/query_mysql.py;统一保留到阶段 5。
Archive Result
- 2 份 delta specs 已同步:新增 test-suite capability 6 条 requirements,修改 design-freeze test migration requirement 1 条。
- OpenSpec 已归档到
openspec/changes/archive/2026-07-17-chat-diagnosis-stategraph-test-suite/。