理由才让拒绝可审计——这两周三份拒绝词表在墙上相遇,咱们的词表带着向量来
规范解读 · 第 23 篇 · 本文引证来源 · 向量锚定的文本(逐句): draft-li-rttp-iqa-addressing-02(全文) · 系列页与修订史: datatracker · 本文介绍的向量家族: iqa.org/conformance/aicent-grant-ref/(四件可下载,逐件 SHA-256) · 正本仓库: Aicent-Stack/conformance · candidates/aicent-grant-ref · 以候选身份开放中: Agent-Authority-Conformance 实验室 PR #210 · 墙上线程在案: draft-tanase-ain-authoritative-resolution · draft-hulea-wimse-agent-mandate · 咱们在 WIMSE 存档的两封回帖: identifier-join 线 · 三问线 · W3C 墙线程: public-agentprotocol,2026 年 11 月 · 姊妹双柱: RTTP(rttp://,CRI 27)· IQA(iqa://,CRI 28)
11 月 3 日,咱们的 conformance 档案携两个向量家族公开亮相,并在 W3C 墙以独立话题宣布;家族页住在 iqa.org/conformance/aicent-grant-ref/ 与 /aicent-lease-boundary/,各四件可下载,每条期望值都钉在 draft-li-rttp-iqa-addressing-02 的已发布文本上。时机不是日历的巧合。此前两周,墙上吵的正是这个家族为之而建的事:拒绝语义——谁欠哪条理由、observation 何时必须为空、「证明缺失」与「从未签发」是不是一回事。本文把这场争论如实记录,然后介绍咱们建造的家族——为的是让自家答案不必赢下辩论,只需被运行。
第三份词表在公开场合成形
最清晰的实录是 10 月 27 日开帖的那条线:draft-tanase-ain-authoritative-resolution 的作者就跨域权威证据提出三问——competence 在哪里确立、validity 何时判定、事后如何复核决策。一位替某 mandate 规范发言的回应者逐问作答,把验证结果锚在摘要上。随后一位评审按住了要害:单个 status_unavailable 码把六种截然不同的情形折叠成一个线上值——验证方对区分不了的情形,无法做不同的降级。回应方认账,后续修订做了结构上正确的事:一码拆五——unavailable、untrusted、stale、conflict、unrecognized——外加 subject、anchor、time 的固定读取序,同输入必得同码。开帖人 10 月 29 日收口,说的是这两周最重要的一句话:「Preserving the reason matters for subsequent review and audit.」(保住理由,后续的评审与审计才有据可查。)
这是本系列开始覆盖这个领域以来,第三份在公开场合成形的闭集拒绝词表——而三份收敛到了同样三条性质:集合封闭、理由可区分、读取序固定。整条线程没有人主张更丰富的词表,所有人主张的都是更可读的词表。分歧从来不是「理由重不重要」,而是「一个码能不能替六种情形站岗」。
缺失不是从未签发
第二条线争的是更锋利的边缘。桌上的提案允许验证方携带一份 standing commitment 取代标识符连接——对照源头公布的承诺做验证,源头对验证方不可见。反对意见分两半,一半一半都指向验证方欠下的那条拒绝:若 commitment 由 presenter 挑选、as-of 时刻随之浮动,一次撤销就能活到 commitment 自身的地平线;更糟的是,对一个验证方未曾认证的调用方来说,「证明缺失」与「证明从未签发」无法区分——验证方不编造事实就说不出哪条拒绝为真。提案作者没有为缺口辩护,而是认领了两条反对意见、起草了 missing-proof 条款。
咱们在那条线上的回帖,把已经在案的界线重新画了一遍——因为 §8.1 早已画好。源头不可达——或观察早于请求——止于 authority_not_determined,且绝不读作同意;commitment 在而证明缺失是完全不同的情形,进入评估并被拒。两条拒绝在调用方眼里长得一样,在审计里含义相反:一条说验证方看不见,另一条说验证方看见了、答案是不。该节自己的那句话就是全部论证:「the reason is what makes a refusal auditable.」(理由才让拒绝可审计。)而执行是写明的,不是许愿的:「a refusal reason MUST be computed over the authority facts the response carries — facts a third party can re-derive from pinned inputs. A refusal computed over labels, opinions, or unrecorded context alone is not auditable.」
凭证共享论证,又来了一遍
这个月,W3C 墙从意想不到的角落补上了论证。在 Layer 0 线程里,Alan Karp 反对一份三段式架构的第三段(以认证背书的运行时强制),一句话:「Any time you use authentication as part of making an access decision, you encourage credential sharing or proxying.」(任何时候把认证掺进准入决策,都是在鼓励凭证共享或代理。)这正是 §8.1 自己的论证独立抵达——不透明的拒绝不增加安全,只是把合法调用方的价格抬到去借别人的钥匙。带固定序的闭集词表不是官僚主义;它是让合法路径比不合法路径便宜的那个东西。墙上吵通了理,草案标了价,向量——见下节——让它可被测试。
把它钉住的家族
aicent-grant-ref 就是以上一切的向量家族。二十五个用例——11 合规、12 不合规、2 个 ambiguous——每个都是完整的作答时刻场景:在案事实、一个实现可能给出的响应、以及判定该响应是否满足文本的规则。五条读取规则做判定。R-ORDER:优先序即定义,包括全无条件命中时理由必须为 null——发出一个没有条件支撑的拒绝值即不合规。R-NOTDET:源头不可达或观察早于请求,止于 authority_not_determined,绝不读作同意——诊断性读取不参与授权。R-NULLOBS:答案所依赖的观察缺席或不再新鲜时,observation_as_of_ms 必为 null,即便此后存在一次成功的观察——诊断读取既不回填该成员、也不续期证据。R-CLOSED:集合封闭——没有肯定的「granted」值、没有第六值、没有不带理由的响应,集合上的空理由是 permitted 的唯一表示。R-GRANTREF:每个响应,无论许可还是拒绝,都携带 grant reference 的五个成员。
两个 ambiguous 用例按具名分部计分而非强行裁决,用例可以展示结果的哪一部分成立、哪一部分不成立——开放解读被记录为开放解读,不被压平成过与不过。在提交版上,check 与全部 25 条期望一致,突变体电池击杀 21/21,均 exit 0;电池包含每条规则的「永远判不合规」与「永远判合规」两个版本,分不清正确实现与坏实现的检查器会大声失败,而不是假装在打分。每条期望锚定已发布草案的 §8.1 与 §8.2——每条规则一句引文,取回的 TXT 钉在 sha256 02491c5a——CANDIDATE 的诚实节原话照录:这些运行不说明任何实现,也不证明期望值是对源文的正确读法。那个读法写在明处,欢迎任何人来驳。
向量不主张什么
家族自己的文件画出了边界,边界就是可信度。源文是一版文档——草案修订则家族随之出新版。五个成员只测存在性,不测值格式;expires_at_ms 与 §6 租约规则的关系归姊妹家族管。检查器编码的是对源文的一种读法,草案后续修订的更正覆盖它。家族主张的更窄也更硬:闭集、优先序、空值规则与回执结构都钉在已发布的句子上;第三方只需 Python 3、几分钟即可运行同一批用例;悄悄失效了五条规则中任何一条的检查器,会被随行的电池抓住。墙上花两周确立了「理由必须可区分」;家族让咱们的词表从主张变成测试。
一句话:这两周,三份拒绝词表在公开场合收敛于同样三条性质——闭集、理由可区分、顺序固定——而 aicent-grant-ref 用二十五个用例和一节突变体电池把咱们的词表钉进已发布文本,让「理由才让拒绝可审计」成为可以运行的东西,而不是必须相信的东西。