茶水间的速溶咖啡机发出第三声闷响时,沈砚还在盯着手机屏幕上那条微博推送。推送的缩略图模糊得只剩下半张侧脸和一片深灰色衣领,配文是"就这水平还敢当策划?"——一个反问句后跟了三个感叹号,转发量已经破了四千。 他把手机屏幕按灭,咖啡机正好滴下最后一滴褐色液体。塑料杯壁烫得指尖发麻,他下意识把杯子换到左手,右手拇指还残留着刚才滑动屏幕时那种冰凉触感。茶水间里没开灯,只有走廊透进来的白色荧光切割出他半截裤腿和一双磨损严重的运动鞋。凌晨六点十七分,整个十七层的办公区只有头顶中央空调送风的嗡鸣声在回应他。 回到工位的几步路走得极慢。地板是那种浅灰色塑胶拼接块,脚踩上去会有极其轻微的凹陷感——他清楚记得三个月前赵元在这条过道上滑了一跤,手里的咖啡泼了满墙,保洁阿姨用拖把擦了二十分钟还是留下了一圈淡褐色水印。现在那个位置就在他左脚边十公分处,颜色已经几乎看不见了。 他坐下来,把塑料杯搁在显示器支架右侧那个常年不变的凹痕里。二十七寸的曲面屏已经自动亮起,监控面板上跳动的折线图像一条濒死的蛇,从首周的三千七百支队伍一路下滑到昨天的两百零三支。下降曲率在第三周的某个时间点陡然变陡,那恰好是五月十二日。 沈砚把食指按在触摸板边缘,光标精准地停在五月十二日下午两点十七分的那条运维记录上。操作人字段显示"zhao.yuan",操作类型是"补丁推送",文件名为"hotfix_0512_1422.pkg",没有审核人签名,没有变更审批单号,备注栏一片空白。他盯着那片空白看了大概七八秒,然后滚动鼠标滚轮往下翻,在日志最底部找到了一条极其不起眼的异常记录——"次声波预警偏移参数调整:-0.37%"。这条记录的生成时间比补丁推送晚了四十七分钟,操作人同样是"zhao.yuan"。 走廊尽头传来脚步声,沈砚的耳朵动了动。那是一种很熟悉的步伐频率,两快一慢,左脚的落地声比右脚重一点。方睿。他没有回头,继续盯着屏幕上那条异常记录,直到方睿的身影出现在他工位侧后方三米外的过道拐角。 "沈哥,你昨晚没走?"方睿的声音里带着那种刚睡醒特有的黏糊感,尾音向上飘。他穿着一件皱巴巴的黑色卫衣,兜帽的抽绳一长一短地垂在胸口,手里端着一杯和沈砚一模一样的速溶咖啡。 沈砚终于转过头。方睿的眼圈是青黑色的,额角有一块被键盘空格键硌出来的红印。很显然,他昨晚也在工位上趴着睡了一觉,只是比沈砚醒得晚。 "走了,又回来了。"沈砚说。他的声音比自己预想的要哑一些,"四点钟醒的,睡不着。" 方睿走近了两步,越过沈砚的肩膀看向屏幕。那条折线图太刺眼了,他想不看见都难。他沉默了两秒,然后把咖啡杯放在旁边空着的工位桌面上,发出很轻的一声磕碰响。 "你是说那个补丁有问题?"方睿压低声音问。虽然现在整个楼层只有他们两个,但这已经成了某种职业习惯——所有涉及线上问题的讨论,音量自动降低十五个分贝。 沈砚没接话。他把光标移回那条记录上,双击展开详情,一个弹出窗口占满了屏幕的三分之二。补丁的MD5校验值显示为"7F3A9B2C...",他记得这个序列的后八位。然后他最小化窗口,切到邮件客户端,找到五月十二日上午九点三十四分张正发给运维组的邮件,附件名称是"hotfix_0512_1422_v2.pkg",附件的MD5值是"E1D8F7A4..."。 两个字符串的前四位就不一样。 方睿凑得更近了,沈砚能闻到他卫衣上残留的洗衣液味道,是那种很廉价的柠檬香型。方睿的呼吸在他肩头停顿了一瞬,然后发出一声短促的吸气。 "不对。"方睿说。他伸手去够鼠标,但指尖在触碰到之前又缩了回来,仿佛那东西烫手似的。"这个MD5不对。张正发过来的和推上去的不是同一个文件。" 沈砚靠回椅背。工位椅的人造革面发出吱呀一声,他后腰那个隐隐作痛的部位正好压在椅垫边缘的接缝处,酸胀感像一根细针沿着脊柱往上爬。他从侧边的笔筒里抽出一支黑色中性笔——笔帽已经被咬得全是齿痕——在桌角的便签纸上写了两个MD5值,中间画了个不等号。 "五月十二号凌晨两点十七分推送的。"沈砚把便签纸揭下来,折了两折塞进裤兜。"下午两点十七分这条记录是补录的,操作人还是赵元。但凌晨那次推送没有写入日志。" 方睿的表情变了。他后退半步,后背撞在过道另一侧的隔板上,发出一声闷响。"凌晨两点?运维组晚上只有值班室有人,而且赵元那几天在请病假。" "我知道。"沈砚说。他的中指指腹无意识地在鼠标侧键上摩挲,那个位置被他长期摩擦已经磨掉了一层类肤涂层,裸露出底下光滑的工程塑料。"那条凌晨推送是绕过正常流程的。写进日志的这条是后补的,用赵元的账号补了一条下午的记录,把文件替换成了张正发过审的那个。但实际上机器上跑的是凌晨那个版本。" 茶水间方向传来热水机重新加热的嗡鸣声,那个声音在空旷的办公区里回荡了两圈才消散。方睿舔了一下嘴唇,沈砚注意到他左边上唇有一颗很小的干燥起皮,大概是因为一晚上没喝水。 "那凌晨推上去的那个文件是什么?"方睿问。他伸手去拿自己放在旁边桌上的咖啡杯,端起来的时候杯底在桌面上拖出短短的一截水痕,但最终又放下了,一口没喝。 沈砚没有立刻回答。他最小化所有窗口,重新打开了测试服的管理后台,在实例列表里找到06区那个卡死的副本实例。这个实例从凌晨三点四十一分开始就处于"响应超时"状态,玩家ID那栏显示为"观测者07"——他用测试号跑的那个角色。异常日志里有一条红色高亮的报错,错误码是"TRIGGER_HIDDEN_005"。 他把屏幕往方睿那边偏了偏。"看这个。" 方睿弯下腰,双手撑着膝盖把脸凑近了。沈砚能看到他后颈上有一小截露出来的红绳,大概是戴了什么护身符之类的东西。方睿的视线在那条报错上停了很久,然后他的眉头皱起来。 "隐藏剧情线的触发校验?"方睿直起身子,腰背发出咔嚓一声轻响。"你那条线在测试环境里是锁死的,普通玩家账号根本不可能触发。" "对。"沈砚把鼠标拉到报错详情那一栏,展开完整的堆栈跟踪。"但'观测者07'这个账号在五月十四号晚上被人加了一个隐藏标识位。不是通过正常的用户管理系统,是直接用GM后台的权限接口添加的。" 方睿的表情像是被人往喉咙里塞了一块冰。他张了张嘴,但第一下没发出声音,第二下才说:"GM后台的操作日志呢?" "被清了。"沈砚说出这三个字的时候自己的舌尖都有点发麻。"五月十四号晚上九点到十一点之间的GM操作日志全部缺失。前后时间段的记录都是完整的,只有这两个小时是空的。" 方睿终于端起了那杯咖啡。他喝了一大口,然后被烫得龇了一下牙,杯沿离开嘴唇时发出"嘶"的一声。"所以有人在五月十二号凌晨偷偷换了一个补丁上去,这个补丁改了底层的一些东西,包括次声波预警偏移参数和重试逻辑。然后在五月十四号晚上,又有人用GM后台给一个测试账号加了隐藏标识位,让你能在正式服环境里触发那条本应锁死的隐藏剧情线。而你在跑那个副本的时候发现了特效和场景美术不对,落石机制也有延迟。"他停顿了一下,把咖啡杯放下时手指在杯壁上敲了两下。"那个补丁是故意让副本变难,让正常玩家过不去。然后GM加的那个标识位是故意让你能撞上那条线,让你发现异常。这两件事是同一拨人干的。" 沈砚没说是也没说不是。他从裤兜里摸出手机,解锁,屏幕上还是那条微博推送的页面。他往下滑了一屏,评论区第一条热评写着"策划脑子有坑,神陨之墟那个落石判定范围至少大了三成,根本不是人玩的",底下跟了一千多条回复。他退出微博,打开相册,翻到一张今天凌晨五点十分拍的照片——是从设计文档里拍的,文档的右下角有一行手写的铅笔字,字迹很轻,但足够清晰:"备注:H-07线交互校验涉及未记录参数Kappa,需确认底层支撑。" 那行字的笔迹他认得。那是他自己写的,写在去年十一月的某个深夜。但那个参数"Kappa"在他后期的所有设计版本里都没有出现过,他甚至已经不记得自己为什么会在备注里写下这个词。 方睿见他盯着手机不说话,主动把脑袋凑过来看了一眼那张照片。"这什么东西?" "我去年写的备注。"沈砚把手机收起来,"但我已经不记得'Kappa'是什么了。这个参数没有在任何正式设计文档里出现过,但凌晨我在测试环境里跑的那次异常,报错堆栈最后一行指向了一个叫'kappa_check'的函数。" 方睿的呼吸顿了一拍。他朝四周看了看——当然没什么好看的,整个十七层还是只有他们两个——然后身体前倾,几乎贴着沈砚的耳朵说:"你是说有人根据你一年前写的一句备注,在代码里留了东西?但那行备注只有你自己能看见,那是你的个人设计笔记。" 沈砚没有回答。他把测试服的管理后台关掉,重新打开了运维日志的界面,在搜索栏里输入"次声波预警偏移"六个字。搜索结果弹出来,从五月十二日那条异常记录往上追溯,最早的一条出现在去年十二月三日,操作人字段是空的,只有一个IP地址。 那个IP地址的前两段是"10.47",这是运维组的内网网段。但具体是哪台机器,日志里没有更多信息。 方睿直起身子来的时候又听到了自己腰背的咔嚓声,这一次比刚才更响。"所以现在怎么办?直接跟季总说?" 沈砚低头看着那行IP地址,手指在触摸板上方悬了两秒。"先把那条凌晨推送的真正内容找出来。推上去的那个文件和张正发过来的不一样,我得拿到那个实际在服务器上跑的文件。" "凌晨两点的推送记录没有写进日志,你怎么找?"方睿问。 "系统级的部署日志不会骗人。"沈砚说。他关掉了监控面板,桌面壁纸是一张极简的灰色底纹,中央只有一行小字"叙事即一切"。他盯着那行字看了几秒,然后说:"运维组每台机器上都有本地的部署记录归档,那个不会被远程清理。只要凌晨两点十七分有文件被写入过部署目录,本地日志就一定有痕迹。" 方睿沉默了一会儿。沈砚能感觉到他的目光在自己侧脸上停留了两三秒,然后方睿说:"运维组的机器在六楼。现在下去,值班室应该还没换班。" 沈砚站起来。后腰的酸痛在他起身的一瞬间加重了半拍,他下意识用手掌按住了椅背借力。运动鞋底在塑胶地板上摩擦出一声短促的嘎吱响。他看了一眼桌上的咖啡杯,里面的液体已经变温了,表面浮着一层极薄的油脂膜。 他伸手把便签纸上那两个MD5值连纸带笔揣进裤兜,然后绕过工位朝电梯方向走了两步,又停下来。方睿跟在他身后两步远的位置,卫衣兜帽的抽绳在他走动时一晃一晃的。 "方睿。"沈砚没有回头,声音在空旷的办公区里显得有些发闷。 "嗯?" "你昨天说你看到赵元的工卡在五月十二号凌晨刷过十七层的门禁。这件事你告诉别人了吗?" 方睿的脚步停了一瞬。沈砚能听到他吞了一口唾沫的声音。"没有。我就跟你说了。" 沈砚点了点头。电梯门在他面前无声地滑开,金属门板内侧的反光映出他自己那张脸——眼窝陷下去一块,下巴上冒出了一层青灰色的胡茬,左眼角有一点因为熬夜泛出的红血丝。他往电梯里迈了一步,方睿紧跟着走进来。 电梯门关闭的瞬间,楼层按钮的数字"6"亮起橙色的光。轿厢开始下降,轻微的失重感让沈砚胃里有种空落落的错觉。他看着门缝上方跳动的楼层数字从十七变成十六,变成十五,脑海里翻来覆去的是那张设计文档角落里褪色的铅笔字,和那个他再也想不起含义的"Kappa"。 电梯在三楼停了一下。门开了,外面空无一人,只有走廊尽头的安全出口指示灯泛着幽绿色的光。门又关上了。 方睿站在他右后方,忽然开口说了一句:"沈哥,你有没有想过,如果那个人能在五月十二号凌晨用赵元的账号推补丁,能在五月十四号清掉两个小时的GM日志……那他今天可能也知道你已经看到了那条隐藏标识位的报错。" 电梯到达六楼,发出叮的一声轻响。门还没有开,轿厢里短暂的寂静中,沈砚低头看着自己拇指上被鼠标侧键磨出的那层薄茧,然后轻轻呼出一口气。 "所以,动作得快。"他说。 电梯门打开了,六楼的走廊里日光灯已经全亮,白色光线下每一寸地面都纤毫毕现。值班室的玻璃门半开着,里面传来某个运维同事趴在桌上打鼾的声音,均匀而绵长。 沈砚跨出电梯的时候,裤兜里手机震了一下。他没有立刻拿出来看。先办正事。但那个震动的频率很短,只有一下——是微博推送的提示音。 他深吸了一口气,朝值班室走过去。