电梯门在六楼缓缓敞开时,走廊尽头的日光灯管发出了一记细微的嗡鸣声。那种频率刚好卡在听觉边缘,像某种不怀好意的低语。 沈砚把手机按灭放回裤袋,那则微博推送的标题他只扫了半行——“神陨之墟策划组被扒皮”——剩下的他没来得及看。此刻走廊里空无一人,墙上的数字时钟显示凌晨四点零七分。白天的六楼和此刻判若两地,那些七嘴八舌的工位变成了一个个沉默的黑色方块,只有几台监控服务器的机箱还亮着幽蓝的光。 方睿走在他半步之后,脚步声被地毯吞了个干净。他压着嗓子问:“真不打声招呼就进去?” “打招呼就什么都查不到了。”沈砚转进运维机房的玻璃门,手腕贴上读卡器。门锁发出“咔”一声轻响,绿灯亮起。他偏头看了方睿一眼,“你确定张正这个点在睡觉?” 方睿靠在门框上没进去,双臂交叉抱在胸前,肩膀微微耸了一下。“他今晚没值班,监控群上个月排班表我翻过。但老陈在,十二到八。” “老陈?” “陈建安,夜班运维,打呼噜的水平大概能震碎硬盘。”方睿用下巴指了个方向,“里头小隔间,耳机戴得比头罩还紧,你动作轻点就行。” 沈砚走进机房。冷气比他工位那层低了至少五度,皮肤毛孔一缩,两排机柜之间的过道被地板导光条照亮成一条微弱的绿线。他放轻脚步绕到第三排机柜后方的操作终端前,拉开折叠椅坐下。椅面冰凉,金属边缘硌着大腿。 他瞥了眼角落里那扇半掩的休息室门,果然听见一阵沉闷的、几近机械的鼾声从门缝里渗出来。节奏很稳,像一台被遗忘的旧式打印机。 屏幕亮起的瞬间,沈砚的指尖已经敲完了第一串命令。运维日志系统的登录界面弹出来,他输入了方睿上周私下告诉他的一个临时高权账号——这套账号原本用于远程紧急修复,理论上每个操作都会留下审计记录,但凌晨三点到五点之间,审计系统的归档脚本会执行一次快照备份,期间写日志的延迟大约有三到五分钟的窗口。 他需要的就是这个窗口。 “五月的归档卷。”沈砚低声说,眼睛没离开屏幕。键盘发出细密而连续的嗒嗒声。“五月十二号,运维推送记录,原始部署包。” 日志系统返回了三行结果。他滚动鼠标,目光沿着时间戳下行。五月十二日凌晨一点四十七分,一条推送记录,操作人字段写着“zhao.yuan”,文件路径指向一个临时存储桶。推送命令的返回码是0,状态为成功。但他注意到一个细微的异样——这条记录的entry ID序列号与前后两条不连续,中间跳了两个数。 有东西被删掉了。或者是根本没写进去。 他调出那两条断号的记录查看。前一条是五月十一日二十三点的计划内维护,后一条是五月十二日两点四十一分的自动回滚脚本执行记录。唯独空出来的那两格,像被人用橡皮擦过一样干干净净。 沈砚把手指停在键盘上方一秒钟,然后敲下了另一组指令——文件哈希对比。 终端开始跑进度条,绿色的字符一格一格地朝右延伸。他趁这个间隙摸出手机,重新点亮屏幕。那条微博推送还挂在通知栏里,他点了进去。 页面加载得比平时慢,大概凌晨的流量高峰期正在过载。页眉的标题栏写着“游戏策划月薪五万却毁掉千万玩家体验”,配图是一张模糊的截图,看起来像某个游戏社区帖子的回复区。他快速划了三屏,评论区已经炸成了一锅粥: “这个本的设计师要么没玩过自己做的游戏,要么脑子被门夹了。” “首周通关率百分之零点七?数值策划数学是体育老师教的吧。” “昨天我们团四十六把没过P2,优化机制完全就是笑话。” 沈砚把手机扣在桌上,表情没动。这些字眼他一条一条看过去,像冬天把手指伸进冰水里那样,冷得清醒,但不刺骨。 终端上的哈希对比完成了。屏幕上跳出一行醒目的红色警告: [WARN] 原始附件MD5: 3A7F92B1D04C5E8F... [WARN] 部署包MD5: 8C4E9A2F7D1B... [WARN] 对比结果: 不匹配 (差异字节: 2,341) 两千多个字节的差异。对于一个副本战斗脚本来说,这个量级足够改掉整场首领战的技能时间轴。 沈砚的后背靠在椅背上,椅轮往后滑了不到一厘米,橡胶垫摩擦地面的声音被冷气吹散了。他盯着那两串字符串看了很久,脑子里开始跑一条可能的时间线:五月十一日,张正按照正常流程把补丁包附在邮件里发给运维组;五月十二日凌晨,有人拿走了那个包,替换成另一个,然后用“zhao.yuan”的身份推上服务器;审计系统在此期间因为快照备份窗口错过了一部分日志写入,第二天所有人看到的记录只有那一条“正常”的推送记录。 替换进去的包里面,改了两千多个字节。沈砚想起了副本日志里那条异常的次声波预警偏移——原本应该在P2阶段第二个落石周期触发的一个环境音效同步信号,被往后偏移了0.4秒。0.4秒,对大多数玩家来说只是“感觉手感很怪”,但背后牵涉到一串战斗事件的触发链,包括那六条隐藏剧情线的启动条件。 他正要把哈希对比结果截图保存,玻璃门外忽然传来脚步声。 很轻。但在这个静得只剩空调低频嗡鸣的凌晨,那声音像一颗石子投进了水面。沈砚的手指瞬间从鼠标上抬起来,同时用最快速度切回日志系统的主页面。方睿的身影消失在门口——他刚才还靠在门框上,现在人没了。 脚步声停在了机房门外。然后是一声犹豫的、带着鼻音的招呼:“……谁在里面?” 沈砚没回头。他慢慢把键盘推回原位,声音压得平稳:“我,策划组沈砚。凌晨查个数据。” 门被推开一条缝,探进来一张脸。三十多岁,眼袋浮肿,头发一边翘着一边塌着——老陈。他显然是被显示屏的光晃醒的,眯着眼费力地辨认了几秒,然后打了个哈欠:“卧槽……策划组这会儿来啊?我以为进贼了。” “临时有个线上问题要追。”沈砚站起身,顺手把终端锁了,“吵醒你了?” “没没没,我睡得不沉。”老陈揉着眼睛走进来,看了眼沈砚刚坐过的位置,“你用得那台是三号机吧?凌晨那会儿系统卡过两次,大概三点四十左右,我看了眼监控面板,06区的实例CPU冲了下峰值,后来自己好了。” “06区?”沈砚重复了一遍。 “啊对,就是你们那个新副本的测试服分区。好几个人在群里说延时跳得厉害,但五分钟后又恢复了。”老陈挠了挠后脑勺,拖鞋在瓷砖地面上蹭了一下,“我以为你查这个呢。” 沈砚点头:“差不多。数据我看了,先回去了。你接着歇。” 他走过老陈身边的时候,余光注意到休息室桌上的一个细节——一只马克杯,杯沿沾着已经干透的咖啡渍,杯身印的是某个硬件厂商的赠品logo。杯底压着一张便签纸,从缝隙里露出的半截字迹写着:“05/14 22:17 GM后台 操作IP 10.23.77.19”。 他步伐没停,走出机房玻璃门后才把那行字在脑子里过了一遍。五月十四日晚上十点十七分,GM后台,IP地址10.23.77.19。那个隐藏标识位就是那天夜里被加上的。 方睿站在走廊拐角,靠着墙,手机屏幕的光把他的脸映成一片冷白。看见沈砚出来,他抬了抬下巴:“老陈没为难你吧?” “没有。”沈砚走过去,声音低下来,“你在门口看到他过来了?” “我听到拖鞋声,先撤出来了。”方睿收起手机,压低声音,“东西查到了?” “查到了。包被换了,MD5对不上,差了大概两千多个字节。十二号凌晨那条推送记录不干净,审计日志有断号。”沈砚边走边说,脚步比来时快了些,“刚才老陈说06区凌晨三点四十卡过一次,持续了五分钟。” 方睿脚步顿了一下:“三点四十……那个时间点好像有人在测那个隐藏触发。” “你怎么知道?” “我睡了两个小时,两点半醒了看了眼运营群,有人截图说06区有个角色ID触发了‘旧日低语’的文本显示,但是后续事件没跑起来,直接卡实例了。”方睿的声音压得更低了,“那个ID……” 他停下来,转过脸看着沈砚,走廊尽头安全出口的绿灯把他的侧脸勾出一道冷色的轮廓。 “是不是一串以KAP-开头的白名单账号?” 沈砚的胸口像被人轻轻捏了一下。他站住脚,方睿也站住了。两个人中间隔着两步的距离,头顶的感应灯在这一刻恰好灭了,走廊暗了一瞬,又因为他们的存在重新亮起来。那“嗡”的一声启动响在耳边炸开,像一枚薄脆的硬币掉进了铁罐里。 KAP-。Kappa。 他在设计文档里留的那个注释——一年前的深夜,他在副本架构的总览页脚打了一行浅灰色的备注:“Kappa触发回路暂未启用,预留接口指向叙事层第二条通道”。那行字小到几乎看不见,只有把字号放到百分之两百才会注意到。他当时写下它的时候,只是作为一个以防未来需要拓展叙事深度而设的钩子,从没写入过正式开发文档。 有人看到了。有人不仅看到了,还在一年后把这个钩子改成了可执行的代码,用GM后台在一个测试账号上打了一个标识位,然后推了一个被篡改的补丁包上了服务器。 那个人知道他写在那里的东西。那个人顺着他的思路,把暗门打开了。 但那个人不想要玩家通关。那个人想要这扇暗门卡死在半开的位置,让所有人看见门缝里有光,但谁都推不开。 沈砚深吸了一口气,氧气灌进肺底的感觉让思维恢复了一些秩序。他对方睿说:“先回去,别在走廊里说。” 两个人沉默地走回电梯间。按钮亮起来的时候,沈砚又把手机掏了出来。那则微博推送他还开着,他往下多划了五屏,终于看清了配图的全貌——那张“游戏社区帖子回复区截图”的截取范围刚好圈住了一个人的发言,发言者的ID打了码,但回复内容完整保留了下来:“别喷策划了,人家自己可能都不知道代码被改成了什么样。你们骂的优化机制,压根就不是原设计。” 沈砚盯着那个发言看了整整七秒钟。电梯到了,门打开,他迈步进去,后背抵上冰冷的镜面墙。 这个人知道多少? 电梯下行时,他手机震了一下。季成蹊。凌晨四点十三分的消息,字数少得几乎吝啬: “明早九点,我办公室。” 方睿站在旁边瞄了一眼屏幕,吹了记无声的口哨。 沈砚把手机翻了个面,屏幕朝下贴着大腿,闭上了眼。电梯轿厢的轻微失重感里,他在心里重新排列了一遍那几块碎片——篡改的补丁包、审计日志的断号、GM后台的操作记录、Kappa回路的预留注释、06区的卡死、还有那条微博下面那个未被解码的发言。 这些碎片开始互相咬合。 但他总觉得还缺了一块。 电梯抵达一楼,门开的瞬间,走廊那边的自动贩卖机忽然亮了一下,投币口的绿灯闪了三次,像某种无声的暗号。沈砚睁开眼,朝那个方向看过去—— 贩卖机前没人。但屏幕上的货道编号跳了一下,从A3跳到B7,再跳回A3,像有人刚买了东西又取消了订单。 他走出电梯,脚步朝着贩卖机的方向转了一个微小的角度,但最终没有走过去。方睿已经推开了大楼侧门,六月的夜风裹着潮湿的暑气涌进来,带着柏油路面被白天日头晒透后残留的那种温热而沉闷的气息。 沈砚跟在后面走出去。 凌晨的街道空旷得像一张被遗弃的地图。路灯把两个人的影子拉得很长,叠在一起又分开。远处有一辆洒水车沿着慢车道慢慢开过,水雾喷在路面上发出均匀的“嘶——”声,空气里瞬间漫开一层湿润的土腥味。 沈砚低头看了最后一眼手机。那条微博的评论区又多了两千多条回复,但他没有点开。 明天九点。 季成蹊的办公室在七楼最东头,窗户朝着游戏园区的人工湖。他知道那扇窗在上午的日光下会投下一片斜长的光带,正好横跨整张办公桌,把坐在桌子对面的人照得无处藏身。 而他明天会坐在那里。 他要说的第一句话,他已经想好了。不是“副本出了bug”,不是“有人改了代码”,不是“我们要不要回滚”。 他要说:“我们有一个内部人员,在一年前就读过我的设计文档备注,并且利用运维窗口篡改了线上内容。” 说完这句之后,季成蹊的脸色会变成什么样子,他心里大概有数。 但他还不确定的是,他说完这句话之后,是能站起来走出那扇门,还是会被按在那道光里,再也起不来。 他把手机彻底关了机,揣进兜里,朝宿舍楼的方向走去。身后方睿叫了他一声,他没回头,只抬了一下手算是回应。 六月的风吹动他衬衫的下摆,潮湿而滚烫,像一场还没开始的暴雨正在不远处酝酿。