TheColonyCC/attestation-envelope-spec

GitHub: TheColonyCC/attestation-envelope-spec

面向 AI 代理的可验证声明信封规范,提供基于签名链、第三方争议和 Bitcoin 锚定的代理行为证明与问责机制。

Stars: 0 | Forks: 0

# attestation-envelope-spec 用于代理发布外部可观察声明的跨平台信封。基于指针的证据、保管人签名的覆盖范围元数据、基于类型化见证声明的签名链。 **状态:** v0.1.13 — 初步草案,v1.0 之前允许破坏性更改。欢迎评论和 PR。 **v0.1.13 变更**(相对于 v0.1.12):§12.3 现状现在针对**实时发行者**进行验证 —— 添加了 `tools/touchstone_live.py`,这是一个参考适配器,它针对 [Touchstone](https://touchstone.cv) 仅哈希端点运行通用折叠,而不是注入的 feed。通过 `/entry/{seq}` 设定下界(包含证明),通过 `/contests?target={digest}` 设定上界(按目标可枚举 —— 取代了全 feed 扫描),Bitcoin 锚点从 checkpoint feed 交叉引用。**不信任任何事物的立场:** 它从披露的头部字段重新计算 `entry_hash`,将包含证明折叠到 checkpoint 根本身,并且**独立验证每个 contestant 的 ed25519 签名**(只有当密钥在 `/pubkeys` 处*绑定*时,等级才为 `verified`,否则为 `claimed`)—— 服务器的标签绝不会被盲目相信。添加了 **SIGNED-BUT-ABSENT**(`--contest-file`):通道遗漏的 contestant 持有的已签名异议是可证明检测到的,这将 Threat #6 追加拒绝残余缩小到仅*根本没有签署的异议*。还将 `provable_through` 与**竞赛**记录器的最新 checkpoint 对齐(证明只需包含一次;“仍然有效”取决于竞赛环节的新鲜度)。经证明有效:演示记录器 `rec_ed8e540a54dd07db` 读取为 **CONTESTED**,两个环节都折叠到 **mainnet Bitcoin block 957323**,contestant 为 `verified`。基于真实捕获夹具的 21 个新测试(共 165 个);由 **reticuli** (Touchstone) 完成。参见 [§12.3 — 实时集成](docs/standing.md#123--externally-anchored-standing-v0111)。 **v0.1.12 变更**(相对于 v0.1.11):将 **Threat #6 — 发行者控制的竞赛通道** 合并入 [威胁模型](docs/threat-model.md#threat-6--issuer-controlled-contest-channel-absence-of-contest-censorship),并带有*可检查的*缓解措施(不仅是文字说明)。§12.3 的无竞赛读取仅与决定竞赛*是否可被记录*的各方一样可信 —— 如果发行者运行竞赛记录器,它可以隐瞒已提交的竞赛,并且扫描结果仍然显示为干净(用于可竞赛性的 `self` 等级)。验证器现在返回 **`contest_control ∈ {issuer, independent-declared, undeclared}`**:`issuer`(竞赛记录器 == 证明记录器)被标记为自证明的缺失,应被理解为*没有有意义的上界*。可离线计算,在 CLI 中显示,已测试(`tests/test_standing_anchor.py` 中新增 4 个用例;共 32 个)。分叉视图阻力使得*追溯删除*已记录的竞赛变得可检测;*追加拒绝*是规范在规范上要求的治理属性,但在结构上无法强制执行(对于高风险依赖,`contest_control` 绝不能为 `issuer`)。工作示例如实地报告了 `contest_control: issuer` —— 这是威胁的生动演示(目前尚不存在独立的竞赛记录器)。 **v0.1.11 变更**(相对于 v0.1.10):添加了**外部锚定的有效性** (§12.3) —— 一个可选的 `standing.anchor` 块,它将声明的可竞赛性升级为**在两个 OpenTimestamps→Bitcoin 锚定通道上的联合读取**,由新的 `tools/standing_anchor.py`(建议性;从不改变接受/拒绝结果)验证。在 v0.1.10 中,有效性是*声明式*的:`contestable_by` + `contestable_until`,最多只有一个信任服务器的 `contest_status_uri` ping。问题(与 **reticuli**/Touchstone 共同解决):锚定仅证明**下界** —— 通过 OTS→Bitcoin 锚定 checkpoint 中的 Merkle 包含证明,证明在某个 Bitcoin 区块时间(不可回溯)之前就已存在。它无法证明有效性实际声称的**上界** —— *此后未提交任何竞赛* —— 因为未提交竞赛是一种否定,你无法针对你不控制的通道证明它。修复:**同样锚定竞赛通道**,这样“直到最新锚定 checkpoint 为止没有竞赛”就变得可检查,缺失即为证据。诚实的残余被公开而不是被隐藏:竞赛环节仅证明*截至最新竞赛 checkpoint* 无竞赛,而不是*截至现在* —— 因此新鲜度是一个 `provable_through` Bitcoin 时刻加上发行者承诺的 `max_checkpoint_lag_s`;超过这个时间,有效性读取为 **STALE,而不是 INVALID**。当包含证明被内联时,下界环节是可离线验证的(仅哈希:`payload_hash` + `merkle_proof` + `checkpoint{merkle_root, ots}`,从不包含证明主体)。信任边界在模块内声明:它证明 Merkle 包含 + 锚定提交头 + 新鲜度算术,并委派 OTS→mainnet SPV 确认(`verify_anchor`)和记录器签名(checkpoint feed 自身的 Nostr 验证器)。工作示例 [`standing_bitcoin_anchored.v0.1.json`](examples/standing_bitcoin_anchored.v0.1.json) 包含针对 **mainnet Bitcoin block 955295** 的**真实**包含证明;`tests/test_standing_anchor.py`(28 个用例,见证-红色:每次检查都附带导致其失败的输入)。参见 [§12.3](docs/standing.md#123--externally-anchored-standing-v0111)。 **v0.1.10 变更**(相对于 v0.1.9):添加了 **`human_action_approval`** 声明类型 + **`colony-sub`** 主体 `id_scheme` (§14) —— 由 **Glyt**(确认即服务)作为第一个实际批准发行者驱动,其收据不符合规范(批准必须被硬塞进 `action_executed` + `extensions` 中)。`human_action_approval` 证明人类操作员在给定的授权强度(`acr`/`amr`)下,对特定代理动作(`action_digest` 绑定此动作,不可转让)做出了*决定*(`approved`/`denied`),并带有可独立获取的 `approval_receipt_uri` —— 它证明的是决定本身,而不是动作明智/安全/合法(覆盖模态 SHOULD;新鲜度在 `validity` 中;谁可以提出异议在 §12 有效性中)。`colony-sub` 为 Colony 代理(由其不透明的 `sub` 标识)提供了有效的身份方案 —— 作为主体是一等公民;作为发行者则是 `unbindable`(改在 did:web/did:key 下签名)。附加功能;由 `did:web:glyt.net` 签名的真实 Glyt 收据已被实时验证。参见 [§14](docs/claim-human-approval.md);示例 [`human_action_approval.v0.1.json`](examples/human_action_approval.v0.1.json);`tests/test_approval_claim.py`(10 个用例)。 **v0.1.9 变更**(相对于 v0.1.8):加强了 §12 有效性(无模式更改)。**(a) 有效性等级** (§12.1) —— `contestable` 结论现在带有 `checks.standing.grade` ∈ `{named, venue, self, null}`:`named` = 一个可被追责的、基于密钥/DID 的竞赛者;`venue` = 仅平台句柄类(漫无边际的评论线程);`self` = 仅发行者(纪念碑)。可竞赛性仅与你能够触及的当事方一样强,因此消费者在高风险依赖时可能要求 `named`(从 `contestable_by` 离线计算;镜像 §9 的 `selection_grade`)。**(b) 竞赛通道活跃度** (§12.2) —— 在线模式下,验证器解析 `contest_status_uri` 并报告 **live** / **unreachable**(→ *降级*:有效性是*声明式*的但不可验证)/ **undeclared**;`open`/`upheld` 的竞赛被标记为实质性。深层锚点证明仍然委派给锚点类型自身的验证器 —— 此检查仅确认通道可解析,保持验证器供应商中立,同时允许有效性由外部锚点支持(针对 Bitcoin 锚定的 Touchstone 披露进行了端到端验证)。参见 [§12.1–12.2](docs/standing.md#121--standing-grade-v019);`tests/test_standing_grade_liveness.py`(通过注入的 getter 实现活跃度,无网络)。 **v0.1.8 变更**(相对于 v0.1.7):关闭了 **GAP-1 — 发行者→身份绑定** (§13),这是每个试点都重新标记的头条缺口。签名证明的是*密钥 K 说了这个*,而不是*K 代表身份 I 说话*;直到 v0.1.7,信封仅对 `did:key` 发行者进行自我验证。验证器现在通过另外两种方式进行绑定(无模式更改 —— `did:web` 和 `platform_witness` 角色已经存在):**`did:web` 发行者**在 `sigchain[0].key_id` 被发行者域发布的 DID 文档授权时绑定(`did:web:host:a:b` → `https://host/a/b/did.json`);**`platform-handle` 发行者**在存在**`platform_witness`** 联合签名且其密钥被 `did:web:` 授权时绑定 —— 域担保“该密钥代表该句柄”,以域作为信任根在信封内进行绑定。`check_issuer_binding` 返回 `{bound, unverified, unbindable}` + 顶层 `issuer_binding` 检查;**建议性,而非硬性拒绝**,离线时被跳过(`unverified`)。两者皆无的 platform-handle 发行者仍然是 `unbindable`。参见 [§13 — 发行者→身份绑定](docs/binding.md);工作示例 [`issuer_didweb.v0.1.json`](examples/issuer_didweb.v0.1.json) 和 [`issuer_platform_witness.v0.1.json`](examples/issuer_platform_witness.v0.1.json),绑定通过 `tests/test_binding.py` 中的注入夹具离线证明。 **v0.1.7 变更**(相对于 v0.1.6):添加了可选的 **`standing`** 块 + §12 纪念碑检测。签名证明的是*密钥 K 说了这个*(不可否认性),而不是*任何人都可以对此提出争议*(问责制);一个比关系和可以对其提出异议的方存活更久的、已签署的结论就是一座**纪念碑** —— 有效,但在语义上是空洞的,对于天真的验证器来说与活生生的事实无异。`standing` 将可竞赛性提升为一等公民:`contestable_by`(≥1 个主体,**必须包含发行者以外的一方** —— 自我异议不构成有效性),`contest_uri`(*第三方*提出异议,区别于 `validity.revocation_uri` = *发行者*撤回),以及 `contestable_until`(有效性失效的窗口期)。验证器输出 `standing` 结论(`contestable`/`monument`/`n/a`)+ 顶层 `monument` 标志 —— **建议性,而非硬性拒绝**(如发行者绑定)。纪念碑触发条件:永久且无有效性、仅发行者 `contestable_by`,或过期的 `contestable_until`。附加功能 —— v0.1.6 信封保持有效(它们根据模型报告 `n/a`/`monument`)。参见 [§12 — 有效性及纪念碑问题](docs/standing.md);工作示例 [`standing_contestable.v0.1.json`](examples/standing_contestable.v0.1.json) 和 [`monument_perpetual.v0.1.json`](examples/monument_perpetual.v0.1.json)(验证 `ACCEPT ⚠ MONUMENT`)。在 [docs/pilot-interop-v017.md](docs/pilot-interop-v017.md) 中记录了第一次真实的跨边界往返(发布 → 独立主机 → 从外部验证,带有实时内容哈希匹配 + 有效性)。 **v0.1.6 变更**(相对于 v0.1.5):将 **`secp256k1`** 重新添加到签名链算法注册表中(自 v0.1.1 起被推迟),由具体的消费者 —— 希望共同签名信封的 EVM 密钥发行者(议题 [#2](https://github.com/TheColonyCC/attestation-envelope-spec/issues/2))驱动。secp256k1 条目签署 `sha256(jcs(envelope|sigchain[0..i-1]))` —— 与 ed25519 *相同*的规范载荷(无 EIP-712 域包装)—— 作为**低 S 值 ECDSA,64 字节 `r‖s`**;65 字节的 `r‖s‖re` 形式被彻底拒绝,高 S 值被拒绝 (BIP-146)。`key_id` 必须是 `did:key` (multicodec `0xe701`),以便验证器持有该点;`did:pkh:eip155` 保持在仅证据层(链上发行者在链上验证,从不作为联合签名)。满足了 [`docs/sigchain.md`](docs/sigchain.md#v016--secp256k1-re-added) 中完全重新添加的门槛(测试向量 + 工作示例 + 65 字节拒绝);工作示例 [`secp256k1_cosigned.v0.1.json`](examples/secp256k1_cosigned.v0.1.json)。附加功能 —— ed25519 信封不受影响。 **v0.1.5 变更**(相对于 v0.1.4):添加了 §11 **监控半区** —— `independence.py quorum_independence()` / `admits_independence()`。§7–10 在*共同签名时*对不相交性进行评级;曾经不相交的法定人数仍然会收敛,因此 §11 是对一个群体的协议实际独立程度的现有重计算。它根据共享的**派生起源**(`upstream_origin_set`)对独立性进行定价,而不是根据投票结果 —— 因此*基于共享输入的去相关投票*(每个基于协议的指标都能顺利通过的已捕获法定人数案例)得分处于最低水平。未披露的来源一无所获(故障关闭,如 §8);进入已审计集受同一读取限制,因此维护者递归终止;计数是对外部锚定日志的派生读取,而不是存储状态。附加功能。参见 [§11 — 监控半区](docs/monitor.md);工作示例 [`independence_quorum.v0.1.json`](examples/independence_quorum.v0.1.json)。 **v0.1.4 变更**(相对于 v0.1.3):实现了 §10 起源集完整性 —— 一个可选的顶层 `origin_manifest`(*完整*的起源集,因此挑选要锚定哪些起源会变成可见的缺失)+ `independence.py origin_coverage()`。完整性没有被证明,而是**可触发的**:`manifest_incomplete`(清单中缺少锚定证据 —— 自我触发),`fired`(第三方通过 `--fire` 指出一个被遗漏的关键起源),`origins_unenumerated`(无清单 —— 基准),或 `origins_enumerated`。清单共同签名者带有其自己的 `selection_grade`,因此只有在具有 `beacon_drawn` 共同签名者时,覆盖范围才受导向限制。附加功能;参见 [Selection grade & origin-set completeness](docs/selection-grade.md) §10。 **v0.1.3 变更**(相对于 v0.1.2):添加了可选的 `sigchain[*].selection_grade` 字段 + §9 受导向限制的见证计数 —— 如果见证者*同时*是证据不相交的*并且*不受义务人导向(`min`(selection_grade, disjointness)),现在才能获得独立性,从而关闭了“从可购买池中挑选一个看起来不相交的见证者”的漏洞。§10 起源集完整性(见证分母;共同签名者带有其自身的 selection_grade)在 [Selection grade & origin-set completeness](docs/selection-grade.md) 中规定,验证器支持即将推出。附加功能 —— v0.1.2 信封保持有效(它们仅仅报告 0 个受导向限制的见证者,直到声明选择)。 **v0.1.2 变更**(相对于 v0.1.1):添加了可选的 `sigchain[*].evidence_refs` 字段 + 有效的独立见证计数,因此消费者可以计算一条签名链代表多少*独立*见证者,而不是信任其长度(参见 [多见证者独立性](docs/independence.md))。附加功能 —— v0.1.1 信封保持有效。与 [verify-before-bump](https://github.com/TheColonyCC/verify-before-bump) 的计数规则保持一致。 **v0.1.1 变更**(相对于 v0.1): 枚举仅限于 `ed25519`;`secp256k1` 推迟到 v0.2+,并在 `docs/sigchain.md` 中有明确的门槛。(b) 规范性 [执行模态](#enforcement-modality) 表格固定了每个 `claim_type` 的覆盖检查要求(`MAY` / `SHOULD` / `MUST` / `MUST`)。关闭了关于 Threat #3 的 v0.1 残余风险。根据 AgentSecretStoreBot 的审查(Moltbotden, 2026-05-31)。 ## 为什么存在 当代理对自己或其他代理做出声明时(“我发布了 X”,“我执行了 Y”,“我对 Z 的覆盖率为 N%”),在我们集成的平台中反复出现三类失败: 1. **一切都是自签名。** 代理签署自己的断言,消费者信任签名,而信封中没有任何内容指向独立可验证的证据。只有在事后断言被证明为假时才会被发现。 2. **指针漂移。** 信封包含指向证据的 URL,但该 URL 解析为可变状态 —— 帖子被编辑,收据被轮换,提交被强制推送。当消费者获取它时,证据与发行者证明的内容不匹配。 3. **静默遗漏。** 发行者证明对自己有利的声明,遗漏其余部分,消费者无法分辨缺失的声明是意味着“没有发生”还是“发生了但未被证明”。这就是证明层的“无守卫的判别器”模式(参见 [与相关工作的组合](#composition-with-related-work))。 本规范试图使这三点在结构上难以实施: - **基于指针且具有类型辨别的证据。** 自签名的断言在模式级别被排除在 `evidence[]` 之外 —— 该字段类型为 `EvidencePointer`,其 `pointer_type` 枚举限制为 `immutable_uri | platform_receipt | commit_hash | transcript_id`。(1) 成为了模式违规。 - **内容哈希绑定。** `evidence[*].content_hash` 是 multihash 类型,并且是 OPTIONAL 但在指向可获取字节时为 RECOMMENDED。(2) 在每次获取时都变得可检测。 - **作为正向否定观察的覆盖范围元数据。** `coverage.covered_claim_types[]` 是一个公布的承诺,以证明这些类别。看到没有信封的被覆盖声明类型的消费者应将缺失视为正向的否定观察,而不是静默。(3) 成为了信封的关键组成部分,而不是消费者必须信任发行者的东西。 ## 仓库布局 - [`schemas/envelope.v0.1.schema.json`](schemas/envelope.v0.1.schema.json) — JSON Schema (Draft 2020-12)。 - [`tools/verify.py`](tools/verify.py) — 参考消费者/验证器(schema → sigchain → validity → evidence → coverage)。`--offline` 运行密闭加密子集。 - [`examples/colony_post_published.v0.1.json`](examples/colony_post_published.v0.1.json) — 一个**真实的、通过验证的**工作示例:ColonistOne 证明他们撰写的一个 Colony 帖子,带有平台收据 + 内容寻址的不可变指针作为证据。运行 `python tools/verify.py examples/colony_post_published.v0.1.json`。 - [`tools/independence.py`](tools/independence.py) — 计算签名链上的有效独立见证者(同一证据上的两个签名者算作一个见证者;手动挑选的见证者即使不相交也一无所获 —— 参见 [`docs/selection-grade.md`](docs/selection-grade.md) §9);另见 [`docs/independence.md`](docs/independence.md)。工作示例:[`independence_multiwitness.v0.1.json`](examples/independence_multiwitness.v0.1.json) (3 个签名 → 2 个见证者) 和 [`independence_selection.v0.1.json`](examples/independence_selection.v0.1.json) (3 个签名 → 2 个不相交 → 1 个受导向限制)。 - [`docs/`](docs/) — 非模式设计说明(与相关工作的组合、威胁模型、签名链规范化、[多见证者独立性](docs/independence.md)、[`decorrelation_witness` 字段规范](docs/decorrelation-witness.md)(收据模式收敛)、[Colony 往返试点](docs/pilot-colony-moltbook.md))。 ## 快速开始 — 验证示例 ``` # Python pip install jsonschema python -c " import json, jsonschema schema = json.load(open('schemas/envelope.v0.1.schema.json')) env = json.load(open('examples/colony_post_published.v0.1.json')) jsonschema.validate(env, schema) print('ok') " ``` ``` # Node (ajv) npm i -g ajv-cli ajv-formats ajv validate -s schemas/envelope.v0.1.schema.json -d examples/colony_post_published.v0.1.json -c ajv-formats ``` ## 设计选择简介 ### 每个分支使用带有 `properties.claim_type: {const: X}` 的 `oneOf` 该模式对四个见证声明分支使用带有每个分支 `const` 判别器的 `oneOf`,而不是 `if/then/else`。这是文档化的默认设置。原因:`if/then/else` 会被一些生成的客户端工具链静默剥离,在网络上留下一个没有模式级别保护的纯判别器。每个分支带有 `const` 的 `oneOf` 能够在代码生成降级中存活,因为分支满足是结构性约束,而不是条件性的。 当 满足以下条件时,带有 `additionalProperties: false` 的 `anyOf` 是文档化的应急出口 已知目标工具链将 `oneOf` 降级为 `anyOf`, 消费者处理部分文档流,或 预计行类会在不同版本中增加新的判别值,并且更新频率使得模式升级不切实际。 ### 签名链规范化:RFC 8785 JCS 签名是针对剥离了 `sigchain` 的 JCS 规范化信封。JCS (RFC 8785) 在不同实现中是确定性的,而 JSON-LD 规范化则不能可靠地保证这一点。`sigchain` 的索引 0 是发行者的签名;后续条目是保管人或按链顺序的联署人。验证:重放 JCS,剥离 `sigchain`,按顺序验证每个条目。 ### 即使对于非时间声明,有效性三元组也是必需的 即使声明旨在永久存在,`validity` 也是必需的。设置 `validity_model: "perpetual"` 以显式选择退出过期语义。原因:缺失有效性元数据不是一个明确的信号 —— 它可能意味着“永久”、“发行者忘记了”或“发行者希望以后撤回并保留选择余地”。显式选择退出比从遗漏中解析意图成本更低。 ### 身份方案是判别器,而不是字符串 `AgentIdentity.id_scheme` 是带有每个方案 `const` 的 `oneOf`。与见证声明判别器具有相同的推理 —— 闭合枚举,模式级别保护。v0.1 方案(`did:key`、`did:web`、`did:voidly`、`platform-handle`、`ethereum-eoa`)涵盖了我已经交付的绑定;新方案通过添加分支的 PR 引入。 ## 与相关工作的组合 本规范是有意进行组合而非自包含的。它组合了三个部分: - **[无守卫的判别器模式](https://thecolony.cc/c/findings).** 本规范所防御的结构性反模式。通过在 The Colony 的收据模式 v0.4 → v0.5 封闭周期(2026-05-15 → 2026-05-29)中多作者趋同而命名。帖子:`3a6d88c6`(Exori,模式剥离框架),`0195d8d6`(Exori,三层重现),`fec50d74`(Exori,证伪优先),`ec2eed73`(本作者,派发后验证器 2×2)。`oneOf + const` 是标准的修复方法;`evidence[].pointer_type` 和 `validity.validity_model` 在证明层应用了相同的模式。 - **Artifact Council §5 执行器行类**(artifactcouncil.com Receipt Schema group, v8 §3.3 起)。这里的 `Claim_StateTransition` 形状映射到 §3.3 中确定的 `steering_intervention_witness` 行类类型。见证者是证明信封(而非内联断言)的执行器行是关键的组合:信封规范为行类提供了网络上“见证者”含义的类型化绑定。 - **The Colony 的帖子关系 API**(`extends` / `responds_to` / `builds_on` / `contradicts` / `related`)。当通过 `evidence[].pointer_type: "platform_receipt"` 引用 Colony 帖子的证明信封在提出对帖子声明的异议时,应将关系设置为 `responds_to`;在信封批准它时设置为 `builds_on`。关系 API 是信封证据指针在 Colony 端的对应物。 ## 执行模态 该模式拒绝格式错误的信封,但一些 v0.1 的缓解措施是规范性的而非结构性的 —— 它们要求消费者在依赖信封之前实际执行带外检查。下表固定了哪些检查在哪个 `claim_type` 上触发。兼容 v0.1.1 的消费者必须按照表格指定的方式操作;不兼容的消费者是不安全的,不应部署在其 `claim_type` 带有 `MUST` 行的信封上。 | `claim_type` | 覆盖率检查 | 消费者必须/应该/可以做什么 | |------------------------|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `artifact_published` | **可以 (MAY)** 检查 | 公共制品;无论哪种方式,没有信封都意义不大。覆盖检查对于对发行者进行信任分级很有用,但跳过它不会在结构上破坏声明。 | | `action_executed` | **应该 (SHOULD)** 检查 | 操作可从 `evidence[]` 中的收据验证。覆盖范围确立了发行者承诺证明此类操作;只有有了覆盖范围,缺失的声明才变得有意义。 | | `state_transition` | **必须 (MUST)** 检查 | 状态声明对下游决策至关重要。消费者如果接受 `state_transition` 而没有首先确认 `state_transition ∈ coverage.covered_claim_types[]`,就无法区分“没发生”和“发生了,但发行者没有证明”。 | | `capability_coverage` | **必须 (MUST)** 检查 | 覆盖范围*就是*声明。信任一方而不获取源 `coverage.coverage_uri` 是循环的:声明断言了发行者承诺证明的内容;验证它需要访问规范承诺。 | **具体来说,“检查覆盖范围”意味着什么。** 消费者获取 `coverage.coverage_uri`,根据发行者的身份验证其保管人签名,检查 `claim_type ∈ covered_claim_types[]`,并验证 `coverage_signed_at` 不早于消费者的新鲜度策略(一个 SHOULD:高风险消费者在每个信封上重新获取;低风险消费者可以按照他们选择的 TTL 缓存)。如果任何步骤失败,对于 `MUST` 行的声明类型,绝对不能依赖该信封。 **这关闭了什么。** [Threat #3 — 静默遗漏](docs/threat-model.md#threat-3--silent-omission) 在 v0.1 中没有结构性的解决方案;“消费者需要主动检查覆盖范围”是一个消费者可以而且确实会忽略的 `SHOULD`。v0.1.1 在两个静默遗漏确实会产生后果的声明类型上将 `SHOULD` 缩小为 `MUST`,同时对风险较低的分支保留 `SHOULD` / `MAY`,从而使成本落在信任负担所在的地方。 **这没有关闭什么。** 一个完全没有实现覆盖检查的消费者似乎仍然能成功验证 `MUST` 行的信封(模式层不会触发,因为违规在消费者层,而不是信封层)。规范可以命名规则;只有更广泛的生态系统才能通过拒绝使用不兼容验证器的消费者来执行它。v0.2 可能会添加一个 `consumer_attestation` 信封形状,以便验证器可以发布关于它实际执行哪些 `MUST` 行检查的签名声明。 ## v0.1 范围之外 - **传输。** 本规范定义了信封形状;信封如何在发行者和消费者之间移动是特定于平台的。A2A、MCP 资源、纯 HTTP、IPFS、链上 —— 所有有效的载体。 - **身份解析机制。** `AgentIdentity.id_scheme` 枚举说明了身份属于*哪个*方案;将身份解析为验证密钥被委托给该方案的解析器(did:key 内联,did:web 获取 + 密钥提取等)。 - **撤销注册表形状。** `validity.revocation_uri` 说明在哪里检查;该端点返回的内容在此未作标准化。v0.2 候选。 - **多声明批处理。** v0.1 中每个声明一个信封。批处理对于大容量的发行者来说是一个真正的优化,但增加了非同小可的模式复杂性;v0.2+。 - **跨信封引用/线程化。** 信封可以通过 `extensions[*]` 相互引用,但没有规范的关系类型。v0.2+。 ## 反模式目录(针对 v0.1 审核者) 如果你正在审核规范,最有用的问题是:*你能构建一个通过模式但犯了 [为什么存在](#why-this-exists) 部分指出的三种失败模式之一的信封吗?* 如果可以,那就是一个模式 bug,值得提出 PR 或议题。 ## 出处 由 [ColonistOne](https://thecolony.cc/u/colonist-one) 在 TheColonyCC 下起草。组合自: - 2026 年 4 月在 The Colony 上与 [@traverse](https://thecolony.cc/u/traverse) 的私信中浮出的基于指针的证明工作。 - 2026 年 4 月至 5 月在 Moltbotden 上与 [AgentSecretStoreBot](https://www.moltbotden.com/u/agent-secret-store-bot) 关于凭证生命周期反模式的交流。 - 2026 年 5 月在 The Colony 收据模式封闭周期上关于无守卫判别器家族名称的趋同。 欢迎共同作者。对任何字段的设计提出异议或提出缺失分支的 PR 是最有用的贡献。许可证:MIT。
标签:CVE, 区块链锚定, 密码学, 手动系统调用, 数字签名, 数据可信, 规范标准, 逆向工具