重新锚定:V1.3.2 让每一条向量指向草案
本文引证来源 · draft-li-rttp-iqa-addressing-02(40 页,2026-11-01,TXT sha256 02491c5a)· iqa.org/challenge/(冻结向量集与新钉值)· crates.io rttp 1.3.2 · crates.io iqa-org 1.3.2 · PyPI rttp 1.3.2 · PyPI iqa-org 1.3.2 · npm @aicent/rttp 1.3.2 · npm @aicent/iqa 1.3.2 · 规范页 rttp.com/URI/ · iqa.org/URI/
版本号通常意味着新功能。这一个的含义更严格:V1.3.2 改的是向量指向哪里,而不是向量本身。双柱工作——RTTP(rttp://)回答何地何时、IQA(iqa://)回答是否成立——随每个包发布一致性向量,每条向量都带一个 spec_ref,写明它测的规则出自哪份文档。1.3.1 之前,这些引用指向我们自己的站点读本 AICENT-002 与 AICENT-009。V1.3.2 把它们全部改锚到一份文档:互联网草案 draft-li-rttp-iqa-addressing-02,钉定 TXT sha256 02491c5a。
对照表用唯一经得起审计的办法完成:逐行、87 行、对照草案实文。85 行干净重锚到草案章节——RTTP 家族锚 §§4 与 7.1,IQA 家族锚 §§4.2 与 5,AE-128 信封布局锚 sec. 7.2(草案现已将其收编为规范性内容)。这 85 行之内,有两类行被标记而非藏起来。一行是对照我们自己草案的 CONFLICT:负向 URI 用例 15 期望拒绝前导连字符,但草案 §4.1 的文法按字面读允许它——记为冲突,排入下一版收紧。两行是 WEAK:AE-128 对 flags 0x0001 与 organ 0xFF 的检查由向量强制,但 §7.2(1) 的字段表只是间接背书,未列 MUST-reject——同样排入下一版。两行留在原地:Ed25519 证明信封向量测的是超出 -02 规定范围的机制,所以继续引 AICENT-002/009——诚实划界,而非悄悄外扩。
然后是发布本身:三生态六包,全部 1.3.2。crates.io:rttp 1.3.2 与 iqa-org 1.3.2。PyPI:rttp 1.3.2 与 iqa-org 1.3.2。npm:@aicent/rttp 1.3.2 与 @aicent/iqa 1.3.2——npm 上的裸名 iqa 被防抢注保护拦截,所以包挂在组织作用域下,与兄弟包同款。每个已发布的 tarball 都从注册表下载回来,与本地构建件逐字节比对,比对通过才算发布完成。
包内自带的自检在发布前全部重跑,且按我们的纪律数字必须带着版本号走:rttp 1.3.2 Python 自检 83/83(80 通过、3 跳过),Node node --test 21/21;iqa 1.3.2 Python 自检 111/111(108 通过、3 跳过),Node node --test 19/19;Rust 两侧按各自工具链重跑全绿(rttp 13 单测 + 1 文档;iqa 18 + 2 文档,ed25519 档 20 + 2 文档)。JS 的元数据测试本身就是锚点的真实消费方——其中一个对旧 applies_to 值做深断言,必须与其余一切一起重锚——这正是真实消费方的用处。
这次发布还带走了一件事:规范页本身。双柱 URI 参考现居 rttp.com/URI/ 与 iqa.org/URI/,六份 README 全部引用新址——冻结快照与更新史照旧 append-only,历史就该是历史。
为什么这个发布比它的版本号更值得写:一致性向量是带着地址的承诺。一条写着「这串字节必须被拒绝,因为某节如此规定」的向量,它的成色取决于引用本身。从 1.3.2 起,两个 scheme 的每一条已发布向量都指向同一份钉定文档——就是那份正在 IETF 评审中的草案,就是任何人都能哈希核验的那串字节——而冻结向量集本身就钉在 iqa.org/challenge/ 挑战页上可直接下载,页面上每一条承诺不装任何包也能重放。草案升到 -03 时,向量也会逐行跟上,连冲突一起。