标准文档有个冷启动难题:一份规范被后来的规范修订、扩充或纠正时,读者怎么从旧文档找到新文档?EIP 仓库早期的答案不完整。对已定稿(Final)的提案,流程规定修订必须另立新号,用 replaces 与 superseded-by 两个头字段互相指认,旧号封存、新号接班,族谱清晰;可对仍处在评审流程中的活跃提案(Draft 到 Final 之间),更新直接改原文、记一个 updated 日期就完事,修订关系不留双向线索。2020 年 1 月 6 日提交的 EIP-2458 就是来补这段的:信息类(Informational)提案,作者 Edson Ayllon,建议为活跃提案增设 updates 与 updated-by 一对字段,让「我在改谁」与「谁在改我」像定稿提案那样可机读、可追溯。它的最终状态是 Withdrawn,但问题本身是文档治理的永恒母题,值得把它的方案拆开看。
字段的精确语义
提案规范部分的措辞相当克制。updated-by 挂在被修订的活跃提案上:一个活跃提案要更新时,正确姿势不是直接改原文了事,而是另开一份新 EIP 走标准评审流程;等那份新 EIP 定稿后,旧提案的 updated 日期栏添新条目时,须在 updated-by 里列出对应提案号。updates 挂在新提案上:凡声明 updates 某活跃提案的提案,隐含它也 requires 那份提案;多个引用用逗号分隔,示例写法就是 updates: 1 与 updated-by: 9999, 9998, 9997 两行 YAML。两个字段都只服务活跃状态的提案,定稿提案的修订继续走 replaces 与 superseded-by,语义不重叠。提案还论证了对齐性:既然是给已有头部语法加选项,格式沿用旧例即可,不引入新解析成本;作为信息标准,它没有向后兼容风险,也没有技术安全议题——原文甚至直说「不引入任何技术问题」,风险全在流程采纳上。

它想换来的三样东西
把提案的动机段翻译成白话,它想买到三样东西。第一是曝光:一份修订活跃标准的提案,如果不挂 updates,外界很难发现它动的其实是一个正在评审的特性;挂上之后,新提案天然继承了被改提案的关注度。第二是通知:利益相关方看到「某份公开讨论中的提案正被另一份提案更新」,有义务在旧提案被改动前先在新提案里完成辩论——这相当于把「先发帖再改帖」写进规范。第三是模块化审计:修订不直接覆写原文,而是一段一段以独立提案存在,每段都有自己可追的评审记录;旧文本不会被悄悄改写,改动本身成为公开评审的对象。这套设计在代码世界叫 pull request 文化,在 RFC 世界叫 obsoletes 头,EIP-2458 想把它移植进提案仓库。
结局与现实做法
提案没有走完:状态 Withdrawn,两个字段最终未成仓库强制规范。现实演化走向了另一头:编辑流程把「改动留痕」外包给了 Git——评审期提案直接改原文、历史提交即台账,头部字段仅保留 replaces 与 superseded-by 用于定稿后的正式取代关系,requires 与 references 用于依赖与引用。回头看,EIP-2458 的方案没输在想法,输在它想给已有机制再加一层,而仓库选择了「版本控制系统承担历史、头部字段只记终态关系」的分工。今天的提案族谱依旧存在,只是承载介质从字段挪进了提交历史——这是文档治理里非常典型的一幕:理想的元数据方案常常败给已经顺手的基础设施。
快速问答
问:现在两份 EIP 之间的修订关系怎么查? 答:查头部 replaces 与 superseded-by(定稿取代),评审期修订查提交历史与讨论链接。
问:EIP-2458 为什么算失败? 答:它提议的字段未进入仓库规范;但它主张的双向可追溯原则,以别的形式实现了。
问:updates 和 requires 有什么区别? 答:requires 说「我依赖它的规格」,updates 说「我修订它的规格」——前者是消费关系,后者是改写关系。
常见误区
一是把撤回当成「提案仓库反对修订留痕」,仓库反对的是再加一层仪式而非留痕本身;二是混淆活跃提案与定稿提案的修订通道——前者改原文,后者必须立新规,EIP-2458 只处理前者;三是以为有了字段族谱就自动可追溯,没有编辑执行与解析工具,字段也会烂尾,这是所有元数据提案共同的坟场风险。
风险提示:本文为标准流程科普,不构成投资建议;提案状态以 EIP 仓库当期记录为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。