下一章 上一章 目录 设置
10、两张版本 同一份名单 ...
-
学院的Git课程安排在周五上午。老师让每组学生处理一次合并冲突:两个人同时修改同一份说明文档,系统不会替任何一方判断谁正确,只会把差异标出来,要求协作者决定最终版本。
许砚知打开练习仓库时,沈砺川已经在另一条分支写完第一段:出现异常后,先恢复服务,再补完整记录。
许砚知的版本是:出现异常后,先封存现场,再判断是否允许恢复服务。
系统把两句并排显示,中间全是冲突标记。
“你删我的?”沈砺川问。
“先看场景。”
“课程练习只有一句背景:校园预约系统故障。”
“如果是普通故障,可以先恢复;如果涉及数据污染,要先封存。”
“所以最终版本?”
许砚知在两句前面补上条件:确认故障不涉及证据、权限或个人数据时,先恢复服务;否则先封存现场。
沈砺川读完,点击接受合并:“这次没有谁覆盖谁。”
“因为原句都不完整。”
“你很擅长把吵架改成条件分支。”
“至少能执行。”
下课后,他们要处理的不是练习仓库,而是寒灯旧版的真实版本记录。罗老师从B3只读镜像中导出一个损坏的Git目录,包含public_display页面和部分配置历史。文件内容缺失不少,但对象库仍保留若干被删除的提交。贺承远申请了独立分析机,要求所有恢复操作在副本上完成。
这次键盘由沈砺川操作,许砚知坐在旁边核对命令。他翻到观察记录的第六格,在“恢复删除对象”后画了一道短线。沈砺川没有立刻碰键盘,先把计划说完:只枚举悬空对象,不写回原仓库;每找到一个对象,先记录哈希,再查看类型;若包含学生个人信息,立即停止。
“通过。”许砚知说。
“还没做。”
“计划通过,结果另算。”
对象恢复并不是连续出现答案。前四十分钟里,他们看见的全是无关紧要的碎片:一张被替换过的校徽图片、三份过期CSS、两个只写了“测试”的空文档、一份周闻整理到一半的部署说明。
沈砺川每恢复一个对象,都先报哈希和类型。许砚知检查记录,没有因为内容无用就省略。林疏月在旁边看得发困,终于问:“这些也要留?”
“要。”许砚知说,“否则别人只会看到我们挑出的关键文件,不知道总共筛过多少。”
陈以宁在统计表上增加一列“无关对象”,数量不断上升。关键证据在整体数据中的比例很低,这反而让后面出现的名单模板更可信:他们不是进入仓库就直奔想要的结论,而是在一堆杂物里按相同规则筛出来。
第四十七个对象是一封未发送的邮件草稿。收件人为空,标题是“关于公开页面的反对意见”。正文只有三句话:
“学生风险标签不得直接展示。当前页面缺少人工复核入口。若必须上线,请保留原始名单与审核人记录。”
作者字段显示WEN,时间在事故前两小时。
沈砺川盯着那三句话:“周闻反对过。”
“只能证明有人用WEN身份写过草稿。”许砚知说。
“你连这个也不认?”
“认草稿存在,不认发送和接收。”
沈砺川吸了一口气,最终点头:“继续。”
第五十二个对象才是名单模板。它出现时,所有人都已经坐得腰背发酸,正因为前面的无效材料足够多,那一处字段变化才显得不像有人专门摆在他们面前的答案,而像系统真的在长久沉默后吐出一块没有消化干净的骨头。
第一批悬空对象只是旧图片和样式文件。第二批出现一份名单模板,内容与B3现存版本几乎相同,唯一差异是责任展示字段。旧模板显示“原始责任记录”,新模板改成“公开责任人”。两个字段看似接近,实际把系统动作和人的责任压成了同一个标签。
提交作者写着admin_view,提交说明为“统一页面口径”。时间是事故当晚八点三十九分。
“又是那六个字。”沈砺川说。
许砚知没有接着推断。他问:“提交者信息能伪造吗?”
“可以。Git作者字段只是文本,提交签名才更可靠。”
这个提交没有数字签名。
继续向前恢复,他们找到一份被删除的README。文件记录了账号关系:ROOT-LAB负责批处理,admin_view负责页面审核,SLC是学生维护令牌,WEN是队长账户。README最后一行写着:任何公开展示必须由教师账号二次确认。
二次确认记录没有出现在现存仓库里。
沈砺川往后靠了一点:“如果没有确认,页面不该发布。”
“也可能确认记录在缺失部分。”许砚知说。
“你总要给最坏的人留一个无罪分支?”
“我给结论留反证空间。”
“结果就是所有人都能躲在空间里。”
这句话说得很重。分析室里还有陈以宁和林疏月,两人都停下手里的事。沈砺川很快意识到自己把怒气落错了位置,却没有立刻道歉。
许砚知把恢复出的README保存并登记,才转过来:“你想在报告里直接写赵嵩修改展示并发布?”
“他审批了A401终端维修,介质登记也有他的签名。”
“维修、取用介质、执行命令、发布页面是四件事。”
“可每件事都绕着他。”
“绕着不等于闭合。”
沈砺川站起来,在窄小的分析室里走了两步:“三年前也有人这样说。先等完整证据,先别影响老师,先把学生能证明的部分写清。等到最后,最清楚的责任人变成了我和周闻。”
许砚知看着他,没有用“冷静”要求他停下。这个词此刻只会重复赵嵩在B3的标签。
“所以你想提前写上一个人,防止他再次退出记录。”许砚知说。
“对。”
“如果写错呢?”
沈砺川没有回答。
“陆星迟要求我们不要删掉他延长令牌的错误,因为完整记录不能只保留好看的部分。你现在也在要求完整。完整包括对赵嵩不利的事实,也包括目前仍不能证明的空白。”
“我知道。”沈砺川的声音低下来,“我只是怕空白最后又被他填。”
“那就把空白标出来,不替他填,也不让他悄悄填。”
两人隔着分析机沉默了一会儿。陈以宁把刚才暂停的记录继续写下,标题是“意见分歧”:沈砺川主张在报告中列出赵嵩姓名;许砚知主张分开描述审批、介质取用和账号操作,暂不合并责任结论。
林疏月看完,说:“这段别删。你们以后可能需要证明,当前结论不是没人质疑过。”
沈砺川回到座位,把原本写好的“赵嵩通过admin_view修改页面”删掉,改成四条事实:赵嵩审批A401证书终端维修;疑似赵嵩签名取用CL-TAPE-03;admin_view修改公开展示字段;ROOT-LAB使用新密钥从A401调用角色权限。最后增加“现有证据不足以确认具体操作者”。
“这样?”他问。
许砚知看完:“这样能经得住问。”
“不是因为好看?”
“因为准确。”
第七次关键操作通过。
下午,陆星迟通过加密视频参加事实核验。三年过去,他比旧照片里瘦,戴着一副很细的黑框眼镜。镜头背景是一间普通出租屋,桌上堆着药盒和两台拆开的路由器。
他没有寒暄,先确认录音和用途,然后承认自己延长过SLC令牌。
“我发现admin_view在周闻权限被收回后仍能打开展示页面,”陆星迟说,“我想保留一个学生侧入口,确认是谁继续操作。沈砺川不知道令牌延长,周闻只知道还有入口,不知道是我做的。”
沈砺川问:“为什么不告诉我?”
“你当时会直接去找赵嵩。”
“所以你替我决定?”
“是。”陆星迟回答得很快,“我做错了。你后来被写成SLC责任人,也有我的部分。”
沈砺川准备了一路的问题忽然失去锋利。他盯着屏幕,过了一会儿才问:“CL-TAPE-03在哪?”
“我没见过实物。事故第二天,我收到过一封自动转存成功邮件,附件哈希对应那盘介质。发件程序在A401本地终端。”
“你还有邮件吗?”许砚知问。
“有。我会提供原始邮件,但先说明:它只能证明转存发生,不能证明谁取走。”
许砚知点头。陆星迟显然已经学会用与他们相同的方式划边界,或者说,他比他们更早为边界付过代价。
视频结束前,沈砺川问了最后一句:“你当年为什么不回来解释?”
陆星迟摘下眼镜,擦了一下镜片:“因为我那时只想离开。后来想解释,发现每个人已经有一个方便的版本。有人说我是受害者,有人说我是情绪失控的学生,有人说我技术不够才怪系统。我不想再进任何一个版本。”
“现在呢?”
“现在你们把错误也写回去了。”陆星迟重新戴上眼镜,“如果报告允许我同时是受伤的人和做错事的人,我签字。”
这一句成为正式复核报告的写作原则。
视频结束后,沈砺川独自去了趟洗手间。回来时,他用冷水洗过脸,额发还有一点湿。没有人问他和陆星迟那几分钟对话意味着什么。林疏月把录音转写窗口关掉,给当事人陈述单独建了加密目录;陈以宁则把“陆星迟承认错误”和“陆星迟陈述他人行为”分成两个证据等级。
“他承认延长令牌,可以作为本人行为陈述。”陈以宁说,“他说赵嵩仍能打开页面,只能算待外部记录印证。”
沈砺川看着表格:“以前所有人都把他的话当成情绪。”
“现在也不能因为我们相信他就提高证据等级。”许砚知说。
“我知道。”沈砺川坐回去,“按规则标。”
这次他说得没有勉强。
正式写报告前,贺承远要求每个人先写一页“我最希望报告得出的结论”。这些纸不进入证据包,只用于暴露偏见。
林疏月写:公开展示必须被认定为伤害,而非普通界面错误。
陈以宁写:责任应拆分到每个操作节点,不能再由一个学生承担全部。
沈砺川写:证明当年不是我决定把陆星迟放到公开页面。
许砚知写得最慢。他最终写:证明记录可以被校正,而不是证明某个人从此完全可信或完全有罪。
四张纸摊在桌上,愿望彼此并不相同。贺承远让他们把纸折起来,各自保管:“报告不能假装你们没有期待。知道自己想证明什么,才更容易发现哪句话是被愿望推出来的。”
沈砺川把纸塞进钱包夹层,问许砚知:“你最想证明的不是谁做的?”
“谁做的当然重要。”
“但不是第一位?”
“如果记录方式不改,换一个责任人也会重复。”
“你有时候想得太远。”
“你有时候只盯着眼前的人。”
两个人对视几秒,没有继续争。分歧没有消失,却第一次被保留在同一份工作里,而不是靠一方退让伪装成一致。
他们把材料分成三组:已核验技术事实、当事人陈述、尚未闭合的问题。许砚知负责证据编号,沈砺川负责操作复现,陈以宁核对时间,林疏月检查每一句是否把系统行为偷换成人的动机。贺承远只做安全和权限审查,不替他们改结论。
报告初稿完成后,四个人轮流扮演听取会提问者。林疏月负责最尖锐的问题,陈以宁负责口径漏洞,贺承远只在他们越过证据边界时敲桌子。
林疏月第一个问沈砺川:“你曾使用SLC令牌,也承认事故前撤过权限。为什么学院不应该优先怀疑你?”
沈砺川下意识想解释动机,话到嘴边停住:“应该怀疑,也应该核对。我的命令、时间和影响都可以查。但SLC是共享令牌,公开展示修改发生在我撤回写权限之后,不能只凭账号名把后续动作算给我。”
“你是否因个人不满针对赵嵩?”
“我对他的处理方式不满。这不影响维修审批、介质登记和日志需要被核验。”
许砚知在旁边记下:先承认立场,再回事实。
陈以宁问许砚知:“你和沈砺川共同整理材料,如何证明没有为了保护队友筛选证据?”
“恢复对象总数、无关对象列表和筛选规则都在附录。关键材料由四人分别核验,原始镜像由实验中心保管。我对沈砺川有合作立场,所以不单独负责其个人陈述的真实性判断。”
“如果学院要求你单独评价他是否可信?”
许砚知停了几秒:“我可以评价具体行为是否与记录一致,不能给一个整体人格结论。”
沈砺川偏过头看他,没说话。
轮到贺承远提问时,他只问了一句:“如果明天出现一段录像,证明赵嵩没有亲自操作,你们今天的报告是否仍然成立?”
四个人重新翻报告。维修审批、介质取用、admin_view操作和ROOT-LAB登录都被分开描述,因此即使具体操作者改变,技术事实仍成立。许砚知回答:“成立,但责任部分需要更新。”
“如果录像证明沈砺川曾进入A401并执行未记录命令?”
沈砺川说:“加入记录,重新评估我的陈述。”
“会撤回报告吗?”
“不会因为我有新增错误就撤回其他已核验事实。”
贺承远点头:“这才是版本管理。新证据改变对应部分,不把整个历史恢复成空白。”
模拟问答结束后,他们把容易诱导人格判断的问题单独列出,约定听取会中只回答具体事实。报告的语气也被再次收紧:删掉“显然”“蓄意”“故意掩盖”,保留时间、动作、权限和可验证结果。
报告写到晚上七点。第一页没有写“寒灯事故真相”,标题是“寒灯旧版公开展示与责任映射初步复核申请”。“初步”两个字是沈砺川主动加的。
提交前,系统要求两名材料负责人分别签署。许砚知先签,随后把键盘让给沈砺川。
沈砺川没有立刻输入密码:“如果提交后学院先找我谈,你不要自己去补材料。”
“为什么?”
“因为你会把所有问题拆成自己能解决的部分,然后一个人全接走。”
许砚知本想反驳,发现这句话并不完全错。
“那你也不能单独回应。”他说。
“成交。”
“不是口头。写进沟通规则。”
沈砺川在报告附录加上一条:涉及任何一名学生的单独询问,另一名材料负责人有权获知询问范围;个人隐私除外。
“你看,”他保存文件,“我们连被谈话都做版本管理。”
“至少不会出现两个互相冲突的口径。”
正式发送前,他们处理了最后一个保管问题。audit_00原始副本只有一份,按规定不能复制内容,只能生成校验值。许砚知原本准备自己带去听取会,沈砺川却提出由贺承远封存,现场再领取。
“你不信我保管?”许砚知问。
“我不想让你从现在到明晚一直背着唯一副本。”
“放你那里也一样。”
“所以不放任何一方。”
这不是把责任推给助教。贺承远只保管密封袋,不掌握打开权限;开封需要两名材料负责人和会议主持同时签字。许砚知重新审视方案,发现它比“我会保管好”更可靠。
他们把副本放进防拆袋,许砚知贴封条,沈砺川核对编号,贺承远在骑缝处签名。三个人各拍一张外观照片,照片只证明封存状态,不包含材料内容。
“第八次关键操作。”许砚知说。
沈砺川问:“通过吗?”
“通过。”
“因为我没把东西塞给你?”
“因为你没有把照顾和控制混在一起。”
沈砺川安静了一瞬,随后把自己的封存照片存入个人记录:“这条评价我收下。”
晚上七点四十,报告发送成功。学院自动回执很快到达:次日十九点召开初步事实听取会,地点A区小会议室,请材料负责人携带audit_00原始副本。
几乎同一时间,证据仓库触发了权限告警。
有人使用admin_view角色尝试读取coldlight_next_evidence。仓库没有接入导引系统,对方却准确请求了不存在于公开页面的目录名。分支保护拦截了访问,日志保留完整来源:A401本地证书终端。
沈砺川第一反应是站起来,随后停住。他把告警页面转给许砚知:“现在怎么办?”
“封存日志,通知贺承远和罗老师,不去A401。”
“同意。”
两人分工完成通知。五分钟后,罗老师赶到A401,发现门上原本贴着的实验中心封条从中间断开,切口很整齐。房间内的本地证书终端已经关机,键盘旁放着一张刚打印的访问失败页面。
页面底部有一句手写字:
“你们保存了版本,但谁来证明第一个版本是真的?”
罗老师没有触碰纸张,立即封锁房间。照片传到A307时,许砚知先看纸张位置,再看笔迹,最后注意到页面背面透出一块深色印痕。
放大后,那是旧介质标签的一部分:CL-TAPE-03。
第二天的听取会还没开始,缺失录像已经先回到了A401。
学院随即把听取会提前到十八点,并增加实验中心与纪检联络员旁听。通知要求所有参与者不得私下接触介质,不得发布现场照片。许砚知逐条确认后,把手机调成免打扰;沈砺川则删除了已经写到一半、准备发给周闻的消息。
“为什么删?”许砚知问。
“现在告诉他,只会让他在没有完整信息时回来。”
“你可以保存草稿。”
沈砺川把文字转进个人记录,没有发送:“等听取会后,再给他选择。”
门外传来贺承远去取封存副本的脚步声。许砚知关闭仓库页面,沈砺川合上电脑。
离开A307前,两人各自写下一条明天无论如何不能替对方回答的问题。许砚知写:沈砺川当年为何撤回权限。沈砺川写:许砚知为什么选择继续参与调查。纸条折好后交换保管,谁被追问到对方的动机,就只回答“请问本人”。
“这会不会显得我们不配合?”沈砺川问。
“区分事实和动机,不等于拒绝事实。”
“那我的动机明天自己说。”
“我的也是。”
这是两个人第一次主动把彼此不能代答的部分写清。
两张纸分别进入不同文件夹。下一次打开材料时,他们要面对的已经不只是旧系统,而是所有曾经决定哪些版本可以被留下的人。