# Brief: single-react-tool-invocation-store ## 背景 旧 `ToolInvocationRecorder` 依赖 ThreadLocal 和 JPA preview,不能证明完整 Tool 结果、生命周期和当前 Run 所有权。阶段 2 已提供 RunContext/Key/Capacity,需要统一 canonical ToolBoundary 和 Redis store 供后续 projector 复用。 ## 目标 - 统一 Pre-Tool 门禁、PROJECTING/READY/ERROR 状态和 evidence semantics。 - 在同一 Redis record 保存 request/raw_response/agent_result、框架 ID、Run、时间和错误。 - 固定 TTL 不续期、容量/结果大小 fail-closed、raw 不静默截断。 - 用 Fake Tool/Projector/Store 覆盖 duplicate、cross-run、no-evidence、error、TTL 和 oversize。 ## 范围 - Canonical invocation model/store、Redis JSON adapter、ToolBoundary 和 focused tests。 - 复用阶段 2 Core、budget、capacity、ToolCallKeyFactory。 ## 非目标 - 不实现 RAG/log/MySQL projector。 - 不修改旧 recorder/JPA、Chat/AIOps、Controller/SSE 或公开协议。 ## 元数据 - 分档:complex - 接口影响:L2 内部 Harness boundary/store - 关联 Issue:ISS-014 阶段 3A - 关联 OpenSpec:`openspec/changes/single-react-tool-invocation-store`