8.5 KiB
8.5 KiB
Decisions: single-react-aci-tool-contracts
规模与入口
- 分档:standard。
- 入口:ISS-014 阶段 1,前置
single-react-design-freeze已 Archive 并由 Git commit58c3910固化。 - 目标:冻结三类 evidence Tool 的 Agent-facing ACI 契约,不接入新运行链路。
Context
devflow/index.md命中single-react-design-freeze、modular-rag-pipeline和evidence-trace-hardening。devflow/glossary/CONTEXT.md已定义 Diagnosis Harness、Invocation Status、Evidence Status 与 Evidence Tools。- 阶段 0 已确认
tool_call_id使用框架 ID、两套状态语义分离、阶段串行门禁和阶段 6B 才公开切换。 - 未发现根目录旧
CONTEXT.md与 glossary 冲突。
Question Pool
| 维度 | 问题 | 模式 | 证据与结论 | 状态 |
|---|---|---|---|---|
| 术语 | invocation lifecycle 与 evidence result 是否使用同一状态? | evidence-driven | ISS-014 5.2、阶段 0 contract 明确分离;分别复用 InvocationStatus 与 EvidenceStatus。 |
已解决并汇报 |
| 术语 | tool_call_id 由谁生成、从哪里取得? |
evidence-driven | Spring AI AssistantMessage.ToolCall.id() 与 Alibaba ToolCallRequest.getToolCallId() 提供框架 ID;普通 ToolContext 不自动加入该 ID。Harness 不生成第二套 ID。 |
已解决并汇报 |
| 边界 | 阶段 1 是否直接改旧 RAG/日志执行签名与返回值? | evidence-driven | ISS-014 阶段 1 只冻结 Contract,投影在阶段 3B、公开切换在阶段 6B;本阶段只新增契约代码和测试。 | 已解决并汇报 |
| 边界 | 日志阶段是否实现真实 CLS/MCP 或保留 Topic discovery? | evidence-driven | ISS-014 8.1 明确继续 Mock、删除 Agent 侧 discovery、真实适配器不在本 Issue 提前设计。 | 已解决并汇报 |
| 验收 | 如何证明契约已冻结且有界? | evidence-driven | 对三类独立 DTO 做精确 JSON、不可变集合、状态和描述泄漏测试;不以旧 Tool 集成测试代替。 | 已解决并汇报 |
| 技术 | 框架 ID 能否在后续 Harness 边界取得? | evidence-driven | 本地依赖 Spring AI Alibaba 1.1.2.0 暴露 ToolInterceptor.interceptToolCall(ToolCallRequest, ToolCallHandler),request 含 toolCallId。 |
已解决并汇报 |
Grill 结论
- 术语、边界、验收三类问题均已由代码、依赖 API、阶段 0 档案和 ISS-014 证明。
- 没有需要新增用户偏好或风险取舍的
user-interview问题;不代理确认任何新方向。 grill-with-docs要求的代码可证问题已先查证;结论已向用户汇报。- Proposal 已回写框架 ID 接入点、旧运行链路不切换、Mock 边界和 L2 接口影响。
已确认决策
- DTO 放在 Harness 的 Tool Contract 边界,复用阶段 0 的共享状态枚举,不在旧
dto包继续堆叠协议。 - 三类结果只携带
evidence_status,canonical invocation 的status保持独立;阶段 1 通过测试冻结枚举,不提前定义存储实现。 - Tool description 使用代码常量冻结,后续 Tool adapter 注册时复用;旧
@Tool注解本阶段不改,避免提前改变运行行为。 - RAG 输入仅保留
query;日志输入仅保留逻辑topic/query/lookback_minutes;MySQL 输入仅保留逻辑data_source/sql/params。 - 日志
source_kind首版固定支持MOCK契约值,但保留 enum 扩展位置给后续真实适配器 change 审查。
能力与工具限制
- Discover 能力来源:
sm-flow+grill-with-docs。 - 仓库要求的
codebase-retrieval和 LSP 工具在当前工具集中不可用;已用rg引用搜索、源码阅读和本地依赖javap补足事实核对。该限制不改变契约方向,但后续 Apply 仍需通过编译和引用测试验证。
Cross-artifact 对齐
| 链路 | 状态 | 结论 |
|---|---|---|
| brief 目标/范围/非目标 -> proposal | 已对齐 | 三类 DTO、状态、框架 ID、短描述和不切旧运行链路均有对应。 |
| proposal 范围/约束/承诺 -> design | 已对齐 | 包边界、ID 来源、record/defensive copy、三类 Schema 和迁移顺序均已设计。 |
| design 决策/接口影响/风险 -> specs/tasks | 已对齐 | L2 边界、字段、状态、描述、Mock provenance 和运行不切换均有可验证 requirement 与任务。 |
| specs 可观察行为 -> tasks | 已对齐 | 每类 Contract 都有实现与独立测试,另有状态、回归和 diff scope 验证。 |
Architecture Audit
- 能力来源:
zoom-out,以项目 glossary 的 Diagnosis Harness、Evidence Tools、Invocation Status 和 Evidence Status 术语审计。 - 当前输入到输出链路仍为
ChatController/ChatService或AiOpsService -> ReactAgent -> LookupKnowledgeTool/QueryLogsTools -> 旧结果,新契约没有运行消费者。 - 未来链路为
Diagnosis Agent -> Alibaba ToolInterceptor/Harness -> typed Request -> adapter/store/projector -> bounded Result -> Agent observation,阶段 1 只占有 typed contract 边界。 - 数据所有权保持明确:框架拥有
tool_call_id,canonical invocation 拥有生命周期,Tool-specific result 拥有证据语义与有界内容。 - 主要耦合风险是新旧契约短期并存被误当成已迁移;通过独立包、无旧调用方修改和后续阶段门禁控制,无 ADR 冲突。
Commit Gate Preflight
- proposal、design、specs、tasks 文件完整,OpenSpec CLI 状态为 complete。
- strict validation:
openspec validate single-react-aci-tool-contracts --strict通过。 - question pool 中没有未汇报的 evidence-driven 结论或未确认的 user-interview 问题。
- 接口影响为 L2,当前运行消费者零变更;阶段 6B 的 L4 切换保持独立。
- cross-artifact 四段对齐无 gap,架构审计未发现需要回写的新实现约束。
- Apply 已由用户对 ISS-014 全阶段的持续授权覆盖;仍严格限制在本 Committed OpenSpec tasks 内。
Pre-apply Research
参考实现
src/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java:确认旧 RAG 暴露LookupResult、ContextPack 和检索 Trace,本阶段不改。src/main/java/com/superbiz/agent/agent/tool/QueryLogsTools.java:确认旧日志输入包含 region/logTopic/limit、存在 Topic discovery 和 mutable nested DTO,本阶段不改。src/test/java/com/superbiz/agent/tool/LookupKnowledgeToolTest.java:现有 RAG 行为回归基线。src/test/java/com/superbiz/agent/agent/tool/QueryLogsToolsTest.java:现有 Mock 日志行为回归基线。src/main/java/com/superbiz/agent/harness/contract/*.java:Java 17 record、Jackson snake_case 和共享状态枚举风格。
技术栈清单
- 请求/响应标准:Java 17 record + Jackson
@JsonProperty,集合构造时 defensive copy。 - Tool 定义:当前使用 Spring AI
@Tool,新名称/描述先以常量冻结,后续 adapter 注册复用。 - 框架调用 ID:Spring AI Alibaba
ToolCallRequest.getToolCallId();普通ToolContext不作为 ID 来源。 - 异常与校验:本阶段只冻结结构;Schema、ID、权限、范围和状态组合错误由后续 Pre-Tool/Projector 显式返回安全
ERROR。 - MQ/Consumer/加密验签:本 change 不涉及。
新建类型
AgentToolContracts与 contract defensive-copy helper。- RAG Request/Result/Evidence。
- Log Topic/SourceKind/Request/Result/Scope/Pattern/Event。
- MySQL Request/Result。
- 三个独立 contract test classes。
影响半径
- 新增包当前应无生产调用方;旧 Chat/AIOps、Tool、Controller、Repository 和配置文件均不修改。
- 通过 focused compile/tests 和
rg/diff scope 证明边界。
Apply 结果
- 冲突分类:未发现 OpenSpec 遗漏、代码偏离或方向不确定项。
- 新增共享 ACI Tool 名称/描述、defensive-copy helper 和三类 typed Request/Result records。
- 新增三个独立契约测试,覆盖精确 JSON、状态分离、框架 ID 原样保留、不可变集合、Mock provenance 和基础设施字段排除。
- 首模块对齐:共享/RAG/日志/MySQL contract 与 design/tasks 全部完成;旧 runtime 接入保持 TODO,归属后续 3B/3C/6B changes。
Apply 验证
- 编译:
mvn -q -DskipTests compile通过。 - 新契约:
mvn -q '-Dtest=RagToolContractTest,QueryLogsToolContractTest,MysqlToolContractTest' test通过。 - 旧行为回归:
mvn -q '-Dtest=HarnessContractTest,LookupKnowledgeToolTest,QueryLogsToolsTest' test通过。 - 静态 scope:新 contract 生产类型当前无旧运行消费者;受保护的 Tool、Chat/AIOps、Controller、Repository 和配置文件 diff 为空。