摘要

  • draft-templeman-scitt-measurement-capsule-00 提议由第三方把声明、观察、结构化差异、证据摘要和限制条件装入不可变记录,但明确不授予任何执行权。
  • UNCHECKABLE 不能被改写成失败、成功、零值或缺席;局部读取不能推出全局不存在,INCONSISTENT 也只说明两个表示不同。
  • 内容哈希、Merkle 纳入证明、签名、透明日志收据与时间锚分别证明不同事实。真正的准入或处置必须另行写明委托人、政策、范围、申诉和结果。

一个自动化系统在公开清单里没有找到某项能力。它立刻把“未找到”改写为“不存在”,再把“不存在”改写为“违规”,最后吊销访问权限。四步推理只用了几毫秒,却跨过了四道本应独立的证据边界。

首先,读取可能不完整。其次,清单与实时接口可能面向不同版本、地区或身份。再次,差异不说明哪一侧正确。最后,发现差异的观察者并不当然拥有处罚权。

《Declared-versus-Observed Measurement Capsules》正试图把这些边界写进格式。2026 年 10 月 2 日,IETF Datatracker 将第 00 版列为活跃的 Individual Submission;它于 9 月 27 日提交,2027 年 3 月 31 日到期,正文标注预期状态为 Experimental。该文档没有 IETF stream,也没有负责的 Area Director。它是进行中的个人草案,不是 RFC、工作组采纳、IETF 共识、认可、互操作报告或部署证明。

草案定义一种确定性的 JSON“测量胶囊”。测量方原则上既不是被测主体,也不是相关行动的参与者;若是自测,应当显式披露。胶囊同时保存主体或登记面发布的声明、第三方从另一来源取得的观察、二者的结构化差异、来源摘要、测量状态、观察时间和限制。其 authority_state 只有一个允许值:仅作测量,不授予或记录执行权。

比较的两端都需要来源账本

“声明”不是主体名称旁的一句永久事实,而是测量者在某个时刻取回的一组字节。它可能来自 manifest、registry、agent card 或签名结果。版本、URL、媒体类型、身份、读取时间和摘要必须一并保留,否则事后无法判断比较的是哪个对象。

“观察”也不是天然事实。测量者选择网络位置、credential、请求、超时、解析器、时钟和采样时点。它可能读取 live protocol、验证 ledger proof、检查签名,或在另一套运行环境重做评估。不同观察点可能合法看见不同视图。

因此,结构化差异只应回答哪些字段不同。它不能自动回答哪一方真实、是否存在欺骗、是否达到风险阈值,更不能回答谁有权采取行动。一个过期声明和一个过期观察都可能被正确签名;两个结果甚至可能分别对不同 scope 成立。

草案给出证据强度阶梯。STATE_PROOF_VERIFIED 只表示 proof 已针对某个 block header 的 state commitment 验证,并不表示该 header 已通过共识检查。STATE_PROOF_RECORDED 表示保存但未验证。OPERATOR_API 是运营方答复而非密码学证明。下游不得为了生成整洁分数而擅自升级这些标签。

UNCHECKABLE 是结论,不是空白

仪表盘喜欢 pass/fail,模型喜欢数值,报表喜欢删掉缺失行。草案要求把无法检查本身作为一等状态保留下来。无法读取、身份验证失败、分页中断或 proof 无法评估时,不得把结果映射为通过、失败、零或省略。

若要写 NOT_LISTED,读取必须完整。只拿到一部分清单时,正确状态是 UNCHECKABLE。同样,不能在局部读取上宣称 total。这个约束保护的是分母:把不可见项算作零会虚构事实,把它们删除则会美化比例。

批次选择也会操纵分母。测量者可能专挑容易不一致的对象,从而在每条胶囊都准确的情况下,制造一个误导性的总体印象。草案要求 batch record 说明纳入规则,并按原因统计被排除的来源行。不同纳入规则下的状态计数不应直接比较。

负责任的消费者至少保留三个数:符合资格的主体、发起过观察的主体、完成了充分观察的主体。同时还应记录是谁定义了这三个集合。没有选择账本的签名百分比,只是被加密保护的叙事。

禁止 verdict 字段只是第一道护栏

胶囊除了固定的 authority_state 外,不允许字段名携带 decision、allow、reject、approve、admit、authority、permit、enforcement、action、gate 等含义,也禁止若干精确的允许/拒绝结果字符串。设计目的十分直接:避免测量对象被当成 gate 使用。

词语 denylist 不可能覆盖所有同义词。草案自己承认这一点,并把每种 kind 的字段 allowlist 列为待解决问题。真正的控制不能只依赖命名规则,而应存在于消费边界。

当平台把 INCONSISTENT 映射为拒绝时,它必须另行产生决策记录,写明有授权的 principal、政策版本、保护对象、阈值、范围、例外、有效期、通知与申诉。第三方测量者的签名不能替平台承担排除客户所带来的损失。

同一家公司可以同时运营测量和准入系统,但仍须区分两个角色。否则“独立证据”会变成内部政策的化名,责任则消失在数据结构之后。

五种密码学收据不能合并成一个真相

capsule_id 是移除自身字段后,对 RFC 8785 JCS 序列化字节计算 SHA-256。胶囊文件保存完全相同的 JCS 字节,按 ID 排序且不得重复。这样,验证者可以重新计算内容身份。

排序后的 32-byte ID 再按 RFC 9162 构造 Merkle Tree Hash。audit path 证明某个胶囊属于该批次。batch record 还应承诺文件摘要、数量、状态计数和纳入规则。随后,COSE_Sign1 可以签名对象或 COSE Hash Envelope;SCITT Transparency Service 可以登记 Signed Statement 并返回 Receipt;独立时间机制可以对 commitment 的存在时间提供约束。

这些层次分别回答:字节是什么、是否纳入这个集合、哪把密钥签了字、哪个透明服务登记过、某个 commitment 何时存在。它们都不证明仪器校准、读取完整、观察者独立、主体认可、样本公平或处置合理。

草案明确写道:有效签名只说明持钥者签了这些字节。若单一签名密钥或请求 credential 被攻破,攻击者可以对虚假记录甚至重写后的日链重新签名。只有早于重写、由不同控制方保存的锚点,才可能揭露这种历史替换。

关联另一份收据,不能复制它的权力

effect_reference 可按 digest 指向另一个 profile 下、由另一发行方产生的 Signed Statement,但不得复制其 outcome。这样,事前授权、行动收据和第三方事后测量可以互相引用,却不会假装来自同一个证明者。

批准记录不证明行动发生。行动记录不证明外部效果。测量胶囊不撤销批准,也不自动评价合规。透明日志只帮助保存和检索这些对象,不负责调和它们。

草案报告当前原型尚未填充 effect_reference。因此,跨发行方组合仍是设计,不是已验证的互操作能力。把未来接口写成现有事实,会重演格式试图避免的证据升级。

更正不会删除历史,因而必须修复下游

胶囊不可编辑。更正要创建新胶囊和新 batch,用 correction pointer 指向被取代记录,并写明 before、after 和原因。旧胶囊继续有效且可取回。即使测量含义未变,只要 canonicalization 或 Merkle 构造变化,ID 与 root 也会改变。

这种追加式历史能回答一个关键问题:决策者当时看到了哪一版证据。它也带来责任。错误胶囊不能在登记后简单撤回;主体需要申请更正或排除的渠道;消费者必须重新评估依赖旧版本的分数与 gate,并记录恢复结果。

若更正只出现在日志里,而访问权限、商业排名或风险标记没有变化,透明度只是保存了错误,并未修复错误。真正的补救需要连接更正、决策、rollback 和通知。

只有摘要,并不等于私密

sources 只存 digest,不存证据字节、URL 或自由文本。这降低了直接暴露,却不能保护低熵秘密。若私有值只有少数可能状态,观察者可离线枚举候选并识别其哈希。

草案建议对非公开低熵材料采用 blinding,但明确说明原型尚未实现。它也建议只测量面向机器公开的表面,不发送 credentials,并把 MCP 观察停在 discovery。采集边界可能增加 UNCHECKABLE,但这比无授权地深入系统更诚实。

追加式登记还意味着误发内容只能被 supersede,不能真正抹除。隐私审查必须发生在登记之前,并把可猜测性、关联性、保留期和披露路径纳入考虑。

作者原型是起点,不是生态证明

第 12 节由作者报告一个 Python builder/verifier。文档称截至 9 月 26 日,一个 index 绑定了 13,184 个胶囊、8 个 batch 和 7 种 kind,并使用 OpenTimestamps、Rekor、浏览器验证器以及一套不共享代码的 checker。

这些都是作者组织提供的实施状态。checker 仍属于同一组织,草案明确说它不是实验所需的独立实现。当前还没有 COSE_Sign1 编码、SCITT Transparency Service 登记、effect_reference 或 blinded digest。Rekor 与 OpenTimestamps 也没有被冒充为 SCITT Receipt。

实验设置了更强的退出条件:另一方按文本实现并重算 ID/root;另一方的透明服务登记 batch;第三方验证 Receipt;胶囊引用不同发行方的 effect statement;未决问题通过更正解决且不丢旧 batch。若两次修订内一个都没有发生,作者承诺撤回草案。

这让“运行代码”保持在正确位置。一套原型证明一个组织能生成并验证自己的对象;独立重现、跨运营方登记和真实更正才证明更广泛的可用性。