裴砚的技术说明时限只有四十分钟,且必须在病床上完成。这条时限来自医疗端的判定……不是审查端设的门槛,也不是可以商量的价码。
他在那次校验作废之后就只能读经批准的技术副本,能指出步骤里哪一步越界,不能再碰任何一根接缆。医疗转运架把右腿固定在膝以上的位置,左手食指和中指在低温里会短时痉挛。这两项限制分属两个来源,一个写进病历,一个写进设备说明。
两项限制都写在说明栏里,一项来自伤情,一项来自环境温度。四十分钟不是为这一次核验专门定出来的,它是病床能耐受的时长,也是两席之间一次会面能挤出来的余量。
石砺把本地离线检查台推到床侧。检查台不接主网,只用自带电源和一根短接缆。
检查台是旧的,外壳磕掉过一块漆。这台机器上一次启用是三个月前,用来核对一批门控固件。它不接主网,运行的时候连自己的操作日志都只留在本地。
裴砚伸手够了一下接口,插头的方向是对的,他够不到。他没有要求换位置。台子的高度是按标准床位定的,改高度要走一次设备申请。
接口在床侧的斜下方,比手能够到的位置低一截。他试了一次就停手,没有再伸手,也没有要求把台子挪近。
“四十分钟。”医疗席说,“从接线之前起算。到点即停!未完成的项写未完成,不续时。”
审查席追加了一条:本次核验只回答表的状态,不回答责任。这一条加在时限之后,不占四十分钟里的任何一分钟。
追加这一条的是审查席,不是医疗席。两个人的签字分行落在同一页上,中间隔着一行空白。
“四项!”裴砚说,“冬季保全判断模板四点三版、当前维护包签名、低可信替代路线调用分支、人工复核配置。”
他把四张纸摊到膝上。纸是石砺昨晚折的,对折线压得很死,翻页时不会带起别的纸。四张纸的页码写在右下角,字很小……但每一张都有。
四张纸摞在一起,边角对得很齐。折线是昨晚压下的,到这个时候还没有被翻乱,也没有多出别的纸。纸是循环用纸,背面还留着上一轮打印的表格线。
“清单上的每一行,都要有一个来源!”裴砚说,“我这边没有来源的那两行,我得说清楚我看不见。”
清单上有的行他能读,有的行他只看得见字段名。那些他只能看见字段名的行,显示出来是灰色的。看不见的那两行,他要用一句话把边界交代清楚。
叶杳能看公开字段,闻昭能看东栈四区的执行摘要,他手里只有技术校验副本。三处各有一角,拼不成一个完整后台。医疗席说这个安排她签过,也当面向他讲过一遍:这一次没人替他看整张表。
三处各有一角,说的不是权限不够,而是没有任何一个人拿到过整张表。这一条在会面之前就写进了安排。
清单先过两席。医疗席逐项读完,证据保全席逐项读完,两席在同一页上签了确认,清单才交到石砺手里。两席读的时候,清单不在裴砚手里……他只能看着自己的那四张纸。
两席签完,清单才离开那张桌子。在签字之前,任何人都可以提出把某一行拆开,重新问一次。那张桌子是折叠桌,四条腿里有两条垫着纸片。
“接线、校验、关机都归我!”石砺说,“你只监督步骤,指出越界。”
他先把接缆在手里过了一遍,看两头有没有划痕和毛刺。这一步不在清单上,但每次接线之前都要做。接缆比看上去要短,从台子到床侧刚好够得着。
“对。”
“如果我发现清单外的东西?”
“指出来,记下来,不查!”这句对答被原样记进记录,记的是两个人的分工,不是任何一项结论。
石砺把第一根接缆压进端口。检查台自检,屏幕亮起三行字:离线、只读、无回写。三行字出现的顺序是固定的……最后一行闪动的才是无回写。接缆落到位的时候,裴砚左肋绷了一下,他没有动。核对完,他点头。绷的那一下没有出声,两席的记录里也就都没有这一笔。
屏幕上的三行字是自检结论,不是可以勾选的设置项。它们不能被改写,只能被读一遍,然后记下来。
“第一项。模板版本!”
石砺读出本地文件的版本号与生成时刻。四点三版,生成于本轮白潮预警发布之前。生成时刻比本轮预警早了不到一天,这个间隔也记进了比对栏。
版本号和生成时刻并排显示,中间只隔着一个空格。两栏里,时刻才是最要紧的那一栏,它决定先后。
“和什么比对?”他问。
“和东栈四区执行页引用的模板标识比。对上了,也不能证明这张表是对的!”
对得上只说明两边引用的是同一份东西。它说明不了这份东西本身对不对,也说明不了它该不该被用。
“那证明什么?”
“证明没有第二套版本混在里面。比对项写清来源就行!”
石砺把执行页的模板标识抄进比对栏。两行数字一致,文件里也没有第三版或第四版的残留分支。如果存在残留分支,它会显示在比对栏的最后一格。
比对栏是一格很窄的栏。抄进去的字符得自己一位一位看清,抄错一位,结论就换成另一个方向。
“一项过!”他说。这两个字后面跟着一栏比对记录,不是一句口头结论。
裴砚没有立刻回应。他在等肋下那阵钝痛过去。医疗席也没有催,她在等同一段时间走完。
肋下的钝痛是一阵一阵的。它不耽误说话,只耽误抬手和转身这两个动作,所以他说话的速度没有变。
“第二项。维护包签名!”
维护包是一个压缩过的配置包,装在门控和供能设备的本地控制器里。签名坏了,设备退回上一版。签名完好,设备按包里写的规则运行。
维护包在设备里是压缩存放的。平时它不打开,只签一次名。签名一过,里面的规则就照着跑起来。包解开以后是两份文件,一份写规则,一份写说明。
“签名校验通过!”石砺说,“完整,没有第三方追签。”
追签是另一种签名。它加在原件之后,用来补上批准流程里缺掉的那一环,也用来指明谁事后认可。
“包里有没有没启用的分支?”
“有一组!”
“名字。”
石砺读出分支名。裴砚看了一眼清单,膝上的纸被风吹起一角,他用手腕压住。检查台的风扇在转,风正好从床侧这一边过来。
分支名不长,读出来只有几个字。认得它的人一看就知道它管的是哪一段路,上下都清楚。
“第三项,就是它。”
低可信替代路线调用分支。这组分支决定哪些替代路线能进运力计算。低于阈值的,不进计算,也不触发逐人复核。这一栏的阈值写在另一个配置文件里,不在这一页上。
这组分支不判断真假,只判断可不可信。可信度低于阈值的路线会被留在计算之外,也不进逐人复核。
“核它是不是现行版本。”裴砚说,“分支只有两种可能:改过的,和没改过的!改过的会留下晚于包签名的写入痕迹。”
叶杳在另一间屋,声音从检查台侧面的扬声器里出来。“核完呢?”
扬声器里传出来的声音有半秒延迟。两边都习惯了这半秒,谁都不抢话,问答之间留着空格。
“核完只是知道它什么时候写进来的!”
石砺核对写入时间戳。分支的写入时间早于包签名,此后没有二次写入。他把时间戳念了一遍,又让叶杳那边复读了一遍。念和复读用的是两个不同的时钟来源,差值记在旁边。
写入时间戳记在文件的内部,删不掉,也改不回去。它只能被读出来,念一遍,再让另一头复读一遍。文件本身没有加密,谁都可以读,只是谁也改不了。
“是包内原生的!”他说。原生指的是跟着这个包一起签发的……不是后来补进去的。
“有调用记录吗?”
“有。”石砺往下翻了一屏,停住,“这里有一条生效记录。”
他把那一行读出来。东栈四区主热源关停表已经取得执行句柄,带定时生效条件。生效时刻写在句柄里,和闻昭那张执行页上的预定切断时刻指向同一分钟。同一个分钟是两套系统各自算出来的,谁也不知道对方算到了这一分钟。
生效记录只有一行。它不在页面上,也不在公开队列里,它躺在一个压缩包的内部,等人翻到。翻到它的人得有名有姓,还得有对应权限。
裴砚没有马上接话。他先让石砺把这一行抄进比对栏,再让叶杳单独记一次来源。
“两处独立!”他说,“这一行是从维护包里读到的,不是从东栈页面上读到的。”
两处独立的意思不是两条证据相加,而是两条来源各自都能被单独查一遍,彼此替不了。
叶杳拆成两条。第一条来自维护包,第二条来自执行页。两条的时间戳不同,指向的时刻相同。两条记录各自带编号,编号由不同的系统生成。
第一条的时间戳来自包内,第二条的来自页面。两条都留着,谁也没有覆盖谁。
“这意味着什么?”医疗席问。
“意味着它不是草稿。”裴砚说,“草稿没有句柄。有了句柄和生效条件,它可以在到点的那一刻自己执行。到时候不需要有人在旁边再按一次!”
句柄是给任务的一张通行证。它比一条记录沉,比一次正式批准轻,拿到它不必再问谁。
医疗席的笔停了一下。她把这句话抄进记录,抄完又抬头看了他一眼。
到点自己执行,意味着这一刻之前它是静止的,这一刻之后它就不再需要有人在旁边推一把。
“按时刻自己执行”被叶杳原样记了进去,后面加了一行注:本句为技术说明,不构成责任判断。
加注的位置在引号之外,字号和正文一样大,没有缩略,也没有换成小一号的灰色字。
“第四项。人工复核配置!”
人工复核栏在东栈四区执行页上一直是灰的。长成一样的两件事,后续处理的办法却完全不同。灰是因为任务条件没成立,还是因为配置里根本没打开,这两件事在页面上长得一样。
灰和关闭看上去一样,来历不一样。一个是还没有轮到你,一个是从来没有把你放进来过。
石砺调出配置项。配置写着:默认关闭。这个选项占着一个固定的位置,四个版本里都没有挪动过。
默认这两个字是配置语言的写法,不是任何人的态度。它在四个版本里都是同一句话。
“任务条件这一栏是空的。”他说,“不是没填,是没有这一栏!”
“配置关闭是一件事,条件未成立是另一件事。”裴砚说,“分开记,别写成同一句!”
没有这一栏,指的是规则里根本没有留这个位置。留了位置却没有填,那是完全不同的另一种情况。
叶杳在扬声器里把两条记录拆开,又加了一栏来源:配置项取自维护包,页面的灰来自配置,不来自条件。来源栏填完,这两条记录才算各自闭合。
两条记录各自成行,中间空着一行。空出来的那一行是给来源栏留的位置,等着人来填。
四十分钟过了一半。石砺报了一次剩余时间,没有人接话。
剩下的一半要分给三件事:并排结论、边界声明,以及意料之外的封存索引。
石砺把四项结果并排放到一张屏上。裴砚看了很久。
四层是并排说出来的,没有先后之分。谁轻谁重、谁先谁后,由读这份记录的人自己决定。四层里没有一层是直接从公开页面上读出来的。
“我能确认四层!”他说,“当前执行页与B7名单同属一个模板家族。现行页加载了可执行分支,并且已经取得执行句柄和定时生效条件。人工复核关闭是配置结果,不是条件判断。维护包保留了旧协议兼容头。”
“不能确认的?”医疗席问。
裴砚先等那阵钝痛过去。
“三件。”他说,“B7和当前执行页是不是同一个运行实例,我判不了。爆炸前谁发起了调用,我判不了。在表上签字的人是不是B7名单的生成者,我也判不了。这个后台的数据我一份都调不出来,只能看纸。”
三件里没有一件是推测。它们说的是我没有权限看到,而不是我判断这件事本来不存在。不能确认的那一部分,比确认的部分更早写进了声明。
“这一栏要记清楚。”医疗席说,“四层是结论,三件是边界!”
结论和边界分两栏记,记的时候不许合并,也不许把边界写成结论的附注。
“对。”
叶杳把四层结论和三件不能确认并列保存,用同一个时间戳。这个时间戳把两部分绑在一起,不能分开引用。
医疗席翻了一下她手里的记录。
她翻得不快,翻到某一页就停住,停的位置正好是那三件不能确认的地方。
“我想确认一句话的边界。”她说,“你说它‘可以按时刻自己执行’。这句话会不会被读成它一定会执行?”
“不会。”裴砚说,“句柄有效、条件成立,它才执行。条件可以被撤销!撤销要权限,还要人在那一刻来得及。”
撤销是一件必须有人在场的事。权限可以先写在纸上,人得当下到场,否则撤销只是一句话。
“来得及是指什么?”
“指签字的人还坐在能签字的位置上。”
医疗席把这一条也记了。她没有追问谁会来不及,那不属于本次的四项。这一条记在边界栏里,和三项不能确认放在一起。
维护席这时候开口。
维护席不在床侧,声音从同一路扬声器里进来,比叶杳的那一路略低一点。
“关闭人工复核不是忘了开!”他说,“白潮期间同类对象太多。逐项等着人复核,会先错过负荷切换窗口,热源还没切,管子先按不住了。低可信替代路线如果硬塞进保全计算,会占住车和燃料,到了地方却走不进去。”