Skip to content

一致性与互操作 ​

互操作意味着两个独立实现可以交换 describe 与 invoke,而不共享内部类,也不要求同一种传输。一致性是双方必须复现的可观察行为集合。它不是 logo,只与一个客户端跑通演示也不够。

一致实现必须保留什么 ​

在协议版本 pling.surface/0.1 下,基础一致性检查应覆盖:

  1. 未知协议版本返回 PROTOCOL_VERSION_UNSUPPORTED。
  2. 未知方法返回 METHOD_NOT_SUPPORTED。
  3. 非法包络产生 INVALID_REQUEST,且绝不调用执行器。
  4. describe 与 invoke 使用同一站点白名单与会话范围。
  5. 未暴露能力在 describe 中不存在,在 invoke 中被拒绝。
  6. 折叠记录动作使用声明目标参数,不接受任意选择器。
  7. 业务失败放在成功协议响应的 result.error 中,不被改写成协议失败。
  8. 会话缺失、过期、撤销或非法时,在执行前 fail-closed。
  9. 限流与防重放使用稳定错误码,且不执行业务函数。
  10. 成功 invoke 在实现提供 after 时返回有界证据,且不泄露凭证或隐藏审批数据。

尚未标准化的部分 ​

当前协议没有定义 attach、observe、handoff 或 detach,没有强制传输,也没有发布跨实现公共一致性包。仓库有 Surface 内核的聚焦测试,以及 delegation 包的适配器一致性测试。它们证明这些实现,不是认证项目。

除非存在已发布套件与治理流程,不要宣称“Surface 认证”。本地集成测试有价值,但不是互操作标志。

实用互操作 harness ​

用同一个夹具运行两个实现:

  • 一个页面,包含读取动作、折叠记录写入、带页面确认的危险动作和不可用动作;
  • 一个从不读取内部 registry 对象的 Agent 客户端;
  • 一组固定请求包络,包括非法版本与方法;
  • 每次成功调用后的业务状态断言;
  • 被拒绝调用没有副作用的审计断言。

记录请求 id、协议版本、能力 id、结果码与副作用。比较结果,不比较内部调用日志。不同传输包装但协议含义相同的实现可以互操作;静默执行未暴露 id 的实现不能。

版本协商 ​

0.1 客户端应发送精确协议值,并在服务端不支持时清楚失败。未来修订可以新增能力或协商可选字段,但不能让旧客户端把未成功的不可逆写入当成成功。未知结果字段应安全保留或忽略,绝不能当作审批。

应公开的证据 ​

每项互操作声明都应附夹具、请求形状、环境、测试命令与观察结果,并说明没有测试什么:其他传输、其他模型、敌对租户或生产身份提供方。范围窄但可复现的结果,比没有产物的宏大声明更有价值。

测试范围与失败边界见 Surface 一致性与互操作,类型面见 协议 Schema 与注册表。