设计依据与边界

ACC 为什么保持小而中立的核心,以及权限、工作流、合规和运行时策略分别属于哪一层。

View source on GitHub

ACC 设计依据与边界

English

状态:非规范性设计依据

适用于:ACC v1

ACC 有意保持一份小而明确的契约。小不等于残缺,而是规范核心只包含独立运行时能够一致理解、又不依赖某个产品数据库、UI、身份模型、审批系统或部署拓扑的语义。

规范性行为以 SPEC.md、版本化 Schema 和 Binding 文档为准。本文解释一些有价值的平台与业务能力为什么没有成为 ACC 核心字段。

1. 一句话边界

ACC 声明面向 Agent 的能力边界。
运行时治理能力暴露与调用过程。
业务系统保留最终裁决权。

ACC 回答 Agent 运行时理解业务能力时必须知道的内容:是否暴露、策略 scope、后果风险、主体要求、审批意图、审计敏感性、执行提示和模型可读指引。

ACC 不试图描述整个 A2B 控制面。

2. 核心字段准入测试

一个字段只有同时满足以下条件,才适合进入 ACC 核心:

  1. 它会改变可移植的 Agent 治理语义。
  2. 相互独立的 Parser 或 Runtime 能实现相同含义。
  3. 不依赖某个产品的私有数据库、UI、身份目录或工作流,就能测试其行为。
  4. 标准 OpenAPI 与 JSON Schema 不能已经清晰表达它。
  5. 它不要求运行时成为最终业务授权方。
  6. 旧运行时忽略它时不会静默降低安全性,否则必须进入新的 major 兼容家族。

这六项是必要条件,不是充分条件。全部满足只代表提案具备进入治理评审的资格,并不意味着该字段必然进入 ACC 核心。

治理评审还会判断:

  • 是否在多个独立实现环境中出现了可验证的共同需求;
  • 是否已经收敛为最小、稳定的语义增量;
  • 是否更适合放在 Binding、实现扩展或相邻规范;
  • 默认值、优先级、失败和安全语义是否完整;
  • 向后兼容与生态实现成本是否可接受;
  • 是否具备实现证据和机器可读 Conformance 测试向量。

字段更多不代表规范更好。无法通过这组测试的字段,只会让声明看似可移植,却把隐藏假设强加给每个实现。

3. 已知但有意不进入 ACC 核心的问题

问题 为什么不是 ACC v1 核心字段 正确责任层
最终用户权限 角色、ABAC、归属权、数据权限和账号状态都具有业务特性并随时间变化。 业务授权层
租户或商户隔离 绕过 Agent 运行时直接调用 API 时,隔离仍必须成立;网关注入参数不是安全边界。 业务数据层与授权层
身份表达 Session、JWT Claim、服务主体、证书、目录组和签名票据不能互相等同。 运行时身份桥与业务系统
审批人和审批流程 审批人、会签、委托、过期、UI 和升级路径取决于组织流程。 外部审批所有者
业务拒绝规则 黑名单、订单状态、库存、退款额度和合同限制需要权威业务数据。 业务策略与授权层
跨字段与上下文不变量 “退款额不超过当前可退余额”等规则需要新鲜且经过授权的业务状态。 业务操作或预检 API
上下文取值 数据来源、读取授权、时效、失败和缓存需要单独的数据访问契约。 运行时集成或业务 API
审计保留与 legal hold 保留时长、归档、删除与法律保全是组织级合规策略。 部署与合规策略
字段级审计脱敏 ACC v1 只声明整体敏感性;请求/响应路径、数组、引用和保守回退仍需形成可移植设计证据。 OpenAPI Schema 标注、运行时策略或未来 ACC Proposal
通用布尔条件组 ACC v1 有意使用有限的 ANY 条件;嵌套布尔策略仍需定义优先级、兼容和 fail-safe 语义。 运行时策略引擎或未来 ACC Proposal
审批 UI 或二次确认 部分运行时是无 UI 的网关、队列或确定性工作流。 运行时或审批产品
回滚与补偿 补偿不一定是一次反向调用,还涉及授权、状态、幂等和工作流语义。 事务、Saga 或工作流层
工具组合与顺序 前置条件、编排与多步骤事务构成另一类工作流或规划契约。 工作流或编排层
存储、队列、签名、指标与成本 它们是重要控制面能力,但不改变可移植的声明含义。 运行时实现
HTTP、RPC、消息队列或 MCP 传输 同一 ACC 声明可以在多种调用传输之前被消费。 Binding、适配器或传输规范

这些问题不进入 ACC,并不代表它们不重要。这样划分是为了避免 ACC 对只有业务系统或部署方才能兑现的责任作出虚假保证。

4. 小不等于含糊

一份小契约仍然必须具备精确语义。因此 ACC 明确定义:

  • 必填字段与 JSON 类型;
  • enabledscope 和可信主体可用性对应的暴露要求;
  • 严格、类型敏感的审批条件比较;
  • 不支持版本与未知字段的安全处理;
  • 模型可控输入与可信治理元数据之间的边界;
  • Conformance Profile 与可观察结果。

如果同一份声明能被两个合规实现解释成相反含义,那是规范缺陷,应该修正。如果两个组织有意把相同风险分类映射成不同本地审批流程,那是部署策略差异,不是可移植性缺陷。

5. 边界示例

可移植声明

approval:
  when:
    - param: amount
      op: ">"
      value: 10000

调用参数和字面量阈值都在 operation 契约中,运行时不需要私有业务数据就能评估。

业务不变量

退款金额 <= 当前订单可退余额

当前可退余额属于权威业务状态。即使 API 没有经过 Agent 运行时,业务操作也必须验证它。

可信主体要求

subject:
  required: true

ACC 声明匿名或不可信调用不能接受,但不强制主体必须通过 JWT、签名票据、服务账号或其他特定形式传递。

6. 为什么 ACC 不定义通用策略引擎

一门通用策略语言需要类型系统、表达式语法、权威数据来源、数据读取授权、时效规则、确定性失败语义和沙箱。半成品表达式语言只会制造“已经能够执行”的假象,实际仍由各运行时自行解释。

ACC v1 只使用对已声明调用参数进行判断的有限、类型安全条件。运行时可以在明确的私有策略命名空间中集成更强的策略引擎,但不能把它冒充为可移植的 ACC 行为。

7. 安全演进

未知字段可被忽略,保证旧运行时能够解析较新的声明。但这不代表每个新安全字段都天然向后兼容。

影响能力暴露、审批、授权边界或脱敏的新字段,只有在旧运行时忽略它时仍然 fail-safe,或者声明同时携带旧运行时认识的保守回退时,才能进入同一个 major 家族。否则必须进入新的 major 契约家族或引入明确的能力协商。

例如:

  • 可选的条件组合提示,如果旧运行时回退后只会产生更多审批,可以兼容演进。
  • 新脱敏字段如果被旧运行时忽略后会记录原始敏感值,就不能只凭“字段可选”判断为兼容;它需要既有的整体敏感标记作为回退,或新的兼容边界。

8. 如何提出更强的表达能力

一个新字段提案应包含:

  • 能跨多个实现成立的问题,而不是某个产品的内部需求;
  • 为什么标准 OpenAPI 或实现扩展不能解决;
  • 完整字段、交互、优先级和失败语义;
  • 与既有字段的关系;
  • 向后兼容与 fail-safe 分析;
  • Parser 与 Runtime Conformance 测试向量;
  • 不依赖某个产品私有架构的示例。

新能力可以先作为实现扩展存在。被真实实现验证过、具备可移植语义且能够测试的部分,可以再按照 CONTRIBUTING.md 的流程提议进入 ACC。