线上没有急停按钮
本文引证来源 · 租约与语义: draft-li-rttp-iqa-addressing-01(全文) · 我方对任务中途场景的记录(线上原件): W3C Agent Protocol CG · post 0070 · 该规则的系列文章版: 规范解读 · 第 18 篇 · 第 17 篇 · 三模式频谱(live lease / lease residual / archival): iqa.org/scenarios · 双柱: RTTP(rttp://,CRI 27) · IQA(iqa://,CRI 28)
凡是谈到可撤销的 Agent 权限,有一个问题总会浮上来,而且每次都穿着同一件外衣:当一个运行中的任务,其背后的权限被撤销了,谁来叫停这个任务?与问题同形的答案也随之而来——一个更大的词表,为暂停与回滚设专态;一台更丰富的生命周期状态机,等着被标准化;一条在线上追赶进程的急停信号。
我们的立场相反,而且这不是折中,更不是遗漏——它是双柱协议栈的承重设计决策。RTTP(rttp://)交付寻址与租约;IQA(iqa://)交付携带租约的验证应答。两个 scheme 都不在线上安放急停按钮。本文从四个正面把理由说透:急停究竟住在哪里、在飞中的令牌与活动由什么界定、没有总开关的委托链凭什么安全、以及为什么线上的闭集词表必须保持闭集而更丰富的机器留在上层。
死线随第一份应答出发
其余一切所依据的设计事实,草案里写得明明白白:验证应答在其自身之内写明它可被依赖到的那个时刻——draft-li-rttp-iqa-addressing-01 第 7.2 节的 lease_expiry 字段。没有带外约定,没有让运行时记得去轮询的撤销推送,没有在损失发生后才姗姗来迟的独立报文。一个 09:12 开始运行、租约到 09:14 的运行时,从启动那一刻起就握着自己的死线,可以在边界到来之前预先挂好急停——或者预先挂好再验证。时钟是它从第一份应答就领到的输入,从来不是意外。
这恰恰是多数急停信号方案直觉的反面。那些方案把撤销想象成一个必须推送给进程的事件——于是线上长出一种用于停止的报文类型。可进程早就握着自己边界的预定时刻。线上不需要用急停信号去追赶一条正在运行的链,因为这条链从开跑之前就握着急停的约定时刻。看似缺失的特性,其实早已在上一层就位。
窗口界定一切在飞之物
第二个机制回答边界与下一次验证之间发生了什么。越过到期——或越过撤销——仍在继续的活动,至多存活一个窗口:按草案自己的部署注记,当前部署为 120 秒。在下一次验证时,应答返回 authority_revoked(或按优先序先到的 evidence_expired),闭集词表用依赖方可审计的名称解释这次停止。时间戳触发急停;词表为它记账。不需要第六个值,也不需要任何新的线上元素。
设计推论是一个策略旋钮,值得用部署语言讲清楚:想要对在飞工作收紧控制的人,不需要向线上索要一种新报文——他把窗口调短即可。租约长度本身就是一切越权运行时长的上界。在租约下铸造的令牌、在租约下发起的调用、在租约下派生的子任务——全都按同一枚时钟衰减,全都在下一个边界撞上同一个被点名的缘由。一枚时钟,一个旋钮,一套词表。
委托链逐跳验证
委托链正是急停信号式思维最想长出总开关的地方——一条报文,停掉整条任务谱系。双柱设计拒绝这个开关,而且这里的算术说明了为什么它可以拒绝:链上没有任何一跳是靠借来的 standing 运行的。每一跳都从自己的验证应答持有自己的租约,而 standing 不在 organ 之间转移——委托方的已验证 standing,不能为被委托方的 claimant 是否成立作证。所以链条面对撤销的暴露面不是一根等待信号的长引信,而是一串彼此独立的短引信,每根都在自己的第一份应答处点燃。
实践上的界随之而来:谱系中任何一处发生撤销后,尚未再验证的那些跳,其下游活动至多存活到最慢的那个剩余窗口为止——而该时段内每一次新鲜验证都会返回一个被点名的缘由,按跳记入审计轨迹。因此链条停止的时延是一个部署参数,可以逐跳调短窗口来收紧,而不是一个依赖信号赶在损失之前抵达的协议属性。链安全,不是因为有什么东西能一把拽住它,而是因为它内部没有任何东西在运行时不自带一枚正在倒数的时钟。
闭集负责审计,调用层负责实现
最后一个正面,是两种答案形状相撞最直接的地方。不断有提案希望线上承载更丰富的生命周期:暂停、回滚、再验证、恢复的状态——一台被提拔进词表的状态机。这种诱惑可以理解;那些状态是真实存在的,运营者也确实需要它们。但反对的不是那些状态本身,而是它们的住址。
一个闭集词表的价值在于可重推导:值少、文档内定死、字节级可重放,任何审计方重跑验证,都能从同一批冻结字节落回同一个答案。加进线上的每一个状态,都必须被规格化、版本化、冻结、并永远可重推导——而绝大多数操作状态过不了这道门槛,因为它们描述的是某个实现的心情,不是 claimant 的一个权限事实。authority_revoked 是事实;「待再验证的暂停中」是策略。前者属于闭集;后者属于调用层,在下一个边界上映射到前者。
所以分工是:线上承载闭集,仅此而已;运营者在其上建自己需要的任何机器——暂停、回滚、再验证、恢复——每台机器的状态在下次验证时对闭集求值。线上的更丰富机器是实现选择,代价只是代码;线内的更丰富词表是协议变更,从此每个审计方都必须永远重放它。这个不对称就是闭集保持封闭的理由,也是「不需要第六个值」不是固执而是全部要害的理由:集合封闭,是为了它之上的一切可以保持开放。
一句话
协议交付死线、窗口与缘由;调用层挥下它们。在飞的工作按它在第一份应答里领到的时钟衰减;链逐跳自带引信,没有总开关;线上词表保持封闭,恰恰是为了它之上的机器可以保持开放。线上没有急停按钮——因为第一份应答早已拧紧了发条,而窗口早已框住了坠落。