# Acceptance: single-react-harness-run-context ## 实现结果 - 新增显式 `RunContext`、取消信号、deadline 检查、Run Lifecycle 和 first-terminal-wins。 - 新增 caller-supplied limits、线程安全 Model/Tool/Token/Run bytes 预算和容量 CAS。 - 新增 strict typed retry policies/executor,记录每个实际 attempt 并阻止取消/预算异常误重试。 - 新增无 Redis 依赖的 ToolCallKeyFactory,精确保留框架 Tool Call ID。 - Spring AI `spring.ai.retry.max-attempts` 设置为 1;未修改 provider/model routing。 - 未接入旧 Chat/AIOps/Controller、ThreadLocal、JPA、Redis、Agent 或公开协议。 ## 静态验证 - `openspec validate single-react-harness-run-context --strict`:通过。 - 新 Harness 包 `rg`:无 ThreadLocal/current-holder/Redis 引用。 - 旧 Chat/AIOps/Controller/JPA 调用链 diff:为空。 - 受保护配置检查:仅新增 `spring.ai.retry.max-attempts: 1`,model routing/provider 保持不变。 ## 脚本验证 - `mvn -q -DskipTests compile`:通过。 - Core focused suite:通过。 - 综合回归 suite(阶段 0/1 契约 + 阶段 2 Core + ChatController):通过。 ## 浏览器/人工验证 - 不适用。本阶段没有 UI、Controller、SSE 或公开协议变化。 ## 未验证 - 未执行真实模型调用、Redis、CLS、MySQL 或客户端断开 live E2E;这些属于后续 Tool store/adapter/最终 E2E 门禁。 - 未将 RunContext 接入旧 ChatService;这是本阶段明确非目标,阶段 6A 才接入。 - `RunContext` 取消对已进入的同步第三方调用仍是协作式;实际 HTTP/JDBC future 取消留给后续 adapter。 - Provider 侧凭据轮换状态不由仓库证明。 ## 剩余风险与后续门禁 - 关闭 SDK 隐式 retry 会使旧路径瞬时错误不再自动重试,直到后续 Router/SemanticGuard 接入 Harness;该变化已记录并可通过恢复配置回滚。 - 下一阶段 3A 必须在 ToolInterceptor 接收 RunContext 和框架 Tool Call ID,直接复用 Key/Capacity/Cancellation 门禁。 ## 状态 - Stage acceptance: accepted - OpenSpec archive: archived at `openspec/changes/archive/2026-07-21-single-react-harness-run-context` - Main spec sync: `openspec/specs/diagnosis-harness-run-context/spec.md`(8 added requirements)