一致性
一致性是第三方可以重复验证的可观察行为,不是对一个包名的信任。实现者应保存夹具、请求、环境与结果,并明确没有验证的范围。
实现角色
| 角色 | 最低要求 |
|---|---|
| Surface 实现 | 实现 describe、invoke、包络校验、能力交集、执行透传与稳定错误 |
| 客户端 | 发送合法包络,区分协议失败与业务失败,不复用业务调用 id |
| 传输适配器 | 正确验证调用方、传递请求、限制大小、保持关联与撤消失效 |
| 委托适配器 | 满足凭证生命周期、作用域、撤销与安全视图不变量 |
一个部署可以承担多个角色,但每个角色仍应分别测试。通过客户端测试不能证明服务端授权正确,反之亦然。
必须覆盖的用例
一致性测试至少包括:
- 正确版本的
describe返回能力与有界上下文。 - 未知版本返回
PROTOCOL_VERSION_UNSUPPORTED。 - 未知方法返回
METHOD_NOT_SUPPORTED。 - 缺少
id、protocol或非法input返回INVALID_REQUEST。 - 未暴露能力不出现在描述中,且
invoke返回CAPABILITY_NOT_EXPOSED。 - 折叠动作只接受当前可引用记录 id。
- 成功
invoke的业务错误保留在result.error。 - 会话缺失、过期、撤销或非法时,执行器没有被调用。
- 限流和防重放命中时没有业务副作用。
after不超过声明上限,不包含凭证或审批秘密。- 审计事件不包含原始参数、响应正文与 token。
- 导航或作用域变化后,旧描述不再作为授权依据。
测试方法
使用一个夹具页面,包含:
- 一个只读能力;
- 一个带 schema 的写入能力;
- 一个折叠记录动作;
- 一个需要确认的危险动作;
- 一个当前不可用动作;
- 一个被会话作用域排除的动作。
用固定请求向量运行客户端与服务器,记录响应和业务状态。每次拒绝都要断言业务处理函数未被调用。对异步执行使用确定性时钟或注入的限流 / 重放适配器,不要依赖真实等待。
结果声明
可以声明“通过仓库内 packages/surface/test/surface.test.ts 的 0.1 向量”,不能仅凭此声明“符合 Pling 标准”。当前没有公开认证项目,也没有独立验证的第二套实现。
如果有部署专属行为,例如自定义限流、SSO 或审计 sink,应单独列出测试证据。不要用一个本地内存测试代表生产多副本行为。
版本与扩展
未来新增方法或可选字段时,一致性套件应区分基础要求与扩展能力。旧实现不支持扩展时返回稳定错误,不能静默忽略。新版本发布前应保留旧客户端测试,证明不兼容变更被明确拒绝。

