主题
Invariants
以下不变量适用于所有符合 agent-service-spec v1 的实现:
- 每个 run
MUST绑定一个orgId与一个资源目标。 - 每个 run 在任一时间点
MUST至多有一个活动 attempt。 - 同一 run 内
event.sequenceMUST唯一且严格递增。 - 用户可见输出
MUST可由input + event log重建。 - cancel 对终态 run
MUST为幂等 no-op。 - projection
MUST NOT依赖单实例内存作为唯一事实源。 - runtime reconnect
MUST NOT导致重复RUN_STARTED。 - webhook 投递
MUST是可去重的至少一次语义。 - secrets
MUST NOT以明文形式写入公开读模型。 - stream resume
MUST能基于 cursor 恢复后续事件,而不是重新发送已确认事件。 - 每个 span
MUST只属于一个 trace,且根 span 满足rootSpanId == spanId。 - span 一旦终止
MUST NOT再被修改或重复导出为新版本。 - trace metadata
MUST NOT默认泄露 secret、token 或原始凭证。 - 远端传入的 trace context 如被接受,导出的 span
MUST保持同一traceId,除非显式启动新 trace。 - LLM 输入输出内容捕获
MUST受contentCaptureMode控制,并可区分none、redacted、span_events、external_blob等落点。 run.blockingInteractionId如存在,MUST指向同一 run 的一个open且blocking=true的InteractionRequest。- 一个 run
MUST NOT同时暴露多个当前阻塞 interaction,但MAY同时存在多个非阻塞openinteraction。 - interaction response 事实
MUST先于依赖该交互结果的后续输出在事件序列中可见。 - 新建 run
MUST解析到确定的resourceRevisionId,且该解析结果在 run 生命周期内不可漂移。 - 启用的
protocolProfilesMUST准确声明实际能力;启用的ProtocolBindingMUST准确声明实际 endpoint、transport 和安全要求。 - 协议适配层
MUST NOT引入与 canonical run 状态机冲突的私有终态或排序语义。 - A2A、ACP、AG-UI 中的审批、补充输入和鉴权语义
MUST收敛到 canonicalInteractionRequest模型。 - 同一 run 的 retry attempt
MUST保持相同的resourceRevisionId与executionProfileSnapshot.executionClass.runEnv,不得自动升级或降级。 - attempt 的
sdkCapabilitySnapshot一旦写入事实,MUST NOT被就地改写;同一 attempt 内 reconnect 必须沿用该 snapshot。 - 如 reconnect 后 runtime 不能满足既有 capability snapshot,恢复
MUST NOT伪装为成功;实现MUST显式拒绝恢复,如需继续则MUST由 orchestrator 创建新 attempt。 - 每个
SessionMUST绑定且只绑定一个runSpaceId。 - 同一
runSpaceId在同一时刻MUST NOT归属多个未终止Session。 - 每个
RuntimeConnectionMUST绑定到一个当前Session;连接恢复可以更换runtimeConnectionId,但MUST NOT跨 Session 劫持。 - 每个
SessionMUST引用一个已存在的RunSpace。 RunSpace.currentSessionId如存在,MUST指向绑定到同一runSpaceId的一个未终止Session。terminated的RunSpaceMUST NOT再接收新的Session绑定。ReleaseChannel或ProtocolBinding更新MUST使用版本并发控制,避免无条件覆盖已发布状态。ProtocolBinding(protocol=mcp)MUST绑定到mcp_server_revision,不得继续绑定到agent_revision或tool_revision。resourceType=mcp_server的 direct runMUST使用McpServerRunInput创建托管 MCP session,后续 MCP requestMUST通过ContinueRunCommand(mode=mcp_server)进入 canonical write path。AgentRevision.callableRefs[]中跨组织条目MUST通过CallableGrant,不得直接硬编码外部resourceId。bindingMode=inject的 callableMUST对应resourceType=mcp_server;resourceType=agent | tool的 callableMUST使用bindingMode=invoke。- 由平台级 callable 调用产生的子任务
SHOULD暴露为子 run,并通过RunLink记录delegation、handoff、tool_subrun或mcp_session。