一致性与互操作
互操作意味着两个独立实现可以交换 describe 与 invoke,而不共享内部类,也不要求同一种传输。一致性是双方必须复现的可观察行为集合。它不是 logo,只与一个客户端跑通演示也不够。
一致实现必须保留什么
在协议版本 pling.surface/0.1 下,基础一致性检查应覆盖:
- 未知协议版本返回
PROTOCOL_VERSION_UNSUPPORTED。 - 未知方法返回
METHOD_NOT_SUPPORTED。 - 非法包络产生
INVALID_REQUEST,且绝不调用执行器。 describe与invoke使用同一站点白名单与会话范围。- 未暴露能力在
describe中不存在,在invoke中被拒绝。 - 折叠记录动作使用声明目标参数,不接受任意选择器。
- 业务失败放在成功协议响应的
result.error中,不被改写成协议失败。 - 会话缺失、过期、撤销或非法时,在执行前 fail-closed。
- 限流与防重放使用稳定错误码,且不执行业务函数。
- 成功 invoke 在实现提供
after时返回有界证据,且不泄露凭证或隐藏审批数据。
尚未标准化的部分
当前协议没有定义 attach、observe、handoff 或 detach,没有强制传输,也没有发布跨实现公共一致性包。仓库有 Surface 内核的聚焦测试,以及 delegation 包的适配器一致性测试。它们证明这些实现,不是认证项目。
除非存在已发布套件与治理流程,不要宣称“Surface 认证”。本地集成测试有价值,但不是互操作标志。
实用互操作 harness
用同一个夹具运行两个实现:
- 一个页面,包含读取动作、折叠记录写入、带页面确认的危险动作和不可用动作;
- 一个从不读取内部 registry 对象的 Agent 客户端;
- 一组固定请求包络,包括非法版本与方法;
- 每次成功调用后的业务状态断言;
- 被拒绝调用没有副作用的审计断言。
记录请求 id、协议版本、能力 id、结果码与副作用。比较结果,不比较内部调用日志。不同传输包装但协议含义相同的实现可以互操作;静默执行未暴露 id 的实现不能。
版本协商
0.1 客户端应发送精确协议值,并在服务端不支持时清楚失败。未来修订可以新增能力或协商可选字段,但不能让旧客户端把未成功的不可逆写入当成成功。未知结果字段应安全保留或忽略,绝不能当作审批。
应公开的证据
每项互操作声明都应附夹具、请求形状、环境、测试命令与观察结果,并说明没有测试什么:其他传输、其他模型、敌对租户或生产身份提供方。范围窄但可复现的结果,比没有产物的宏大声明更有价值。
测试范围与失败边界见 Surface 一致性与互操作,类型面见 协议 Schema 与注册表。

