第三修订版,同法入档
本文引证来源 · lab PR #180(lease-revocation-axes 家族,第二修订版)· lab PR #187(我方第二修订版互操作记录,2026-10-26 合并)· lab PR #191(第三修订版合并,2026-10-25)· lab PR #194(我方第三修订版记录,2026-10-26 提交)· 密封档案 iqa.org/conformance/lra-runner/ 与 iqa.org/conformance/lra-runner-rev3/ · runner 仓库 github.com/Aicent-Stack/conformance。
上周我们交付了 lease-revocation-axes 家族的首次独立、非作者产出运行,并把完整工件提交到实验室(PR #187)。这周发生的事,顺序和多数人的预期相反:语料先动了,我们的记录跟着动——不是把旧记录改一改,而是用同样的方法、从零开始,重新取了一份记录。
第三修订版改的东西,行数很少,含义很大。在它之前,这个家族的动作决策只说「许可」或「拒绝」。两个实现可能出于完全相反的理由拒绝——一个因为权威真的被撤销了,一个仅仅因为连不上权威——而记录看起来一模一样。第三修订版加了一个 refusal_reason,取自五值闭集词表、优先级固定;再加一个 grant_ref,写明每个决策实际依据的授权证据与观察。词表里最重要的一项是 authority_not_determined:它存在的意义,是让一个从未接触到权威来源的实现,永远不必去借最近的那个实质理由。把「不可达」折进「已撤销」的记录,是在制造一种谁也没有过的意图;把这两件事分开,正是第三方重算有意义的前提。
第二修订版保持冻结。这是设计的一半:既有运行——我们的、维护者的复现、净室记录——永远可比,因为它们打分的字节被钉死了,它们用的词表一字未改。一个会改写自己历史的语料,让每一份旧运行都变成传言;一个会叠加的语料,让每一份旧运行都变成档案。第三修订版是一次叠加。
于是我们用老办法重新取了记录。runner 还是那个独立的、仅依赖标准库的实现——是扩展,不是分叉——它依然拒绝为任何 SHA-256 未在清单中钉定的输入打分。冻结的第三修订版输入进了同一道硬摘要门。重跑结果:48/48 基线运行全部匹配(四个档案组合 × 十二案例),176 条决策记录每一条都带授权引用,五个拒绝值全部被触发——176 条记录中 117 条拒绝,而拒绝分布铺满了整个词表,没有扎堆在容易的值上——12/12 突变探针命中各自钉定的失败集。连续三次运行产出逐字节一致的报告。没有一句「断言」不是「执行」出来的。
归档遵循了我们在 W3C Agent Protocol CG 列表上承诺的排序:一次只开一件记录。第二修订版互操作记录(#187)于 10 月 26 日由实验室维护者合并——在他完成跨平台的逐字节复现、并在实验室侧补了一行清单之后,记录本身一字未动。第三修订版记录同日以 PR #194 提交:运行时态的 runner、两个修订版的冻结输入、录制输出、密封工件——工件已发布在 iqa.org/conformance/lra-runner-rev3/,双 scheme 地址派生自它自身的摘要。这一切没有承诺过任何日期;纪律就是承诺,而交付的正是纪律。
这一轮有个做法值得点名,因为它会反复出现:记录是重取的,从不更新。第二修订版记录仍然一字不差地写着它归档那天写的话,包括它自己的评审缺陷与修正。没有任何内容为了迎合新修订版而被编辑;取而代之的是封存了一件新工件,两份并排放着,恰恰因为谁都没被改写,所以彼此可比。append-only 不是数据库偏好——它是让一次测量成为事实、而非当下意见的全部理由。
五个拒绝值值得最后再提一笔,因为它们用十个字节的 schema 编码了一种伦理立场。evidence_binding_mismatch、evidence_expired、authority_not_determined、authority_revoked、operation_not_permitted——顺序固定。第三个值是诚实的那一个:它说的是「我们查不成」,并且拒绝把这身衣服借给「我们查到了一个坏结果」。fail-closed 不是悲观;它是拒绝让验证的缺口听起来像一个裁决。一个能说「未知」的词表,才是让词表里其他每个值都有意义的东西。