陸晨曦在凌晨兩點零七分拿到了蜀山幻境內部服務器的遠程訪問日志。
她沒有告訴任何人,一個人坐在技術部的操作台前面,三台顯示器同時開著。左邊那台跑著日志解析腳本,屏幕上滾動的字符像是一條沒有盡頭的代碼瀑布。中間那台顯示的是劉洋雲盤賬號的文件樹結構,三個子文件夾在根目錄下並排展開,名稱分別是“女主候選/葉詩涵”、“女主候選/趙曉月”、“女主候選/劉仙仙”。右邊那台最安靜,屏幕上只有一行綠色的確認提示——“遠程訪問已建立。數據完整性校驗通過。”
她戴上那副細黑框眼鏡,鏡片左上角的劃痕在屏幕光里像一條干涸的河道。雙馬尾今天扎得比平時緊,兩邊發圈纏了四圈,尾端翹著的那小撮頭發被一枚黑色一字夾壓住,夾子斜著卡在耳後的位置。黑色連帽衛衣的帽子堆在後頸,帽兜邊緣蹭著下頜線,露出一截脖頸,皮膚在屏幕冷光里泛著近乎透明的白。代碼蹲在操作台角落的紙箱里,前爪搭在箱沿上,尾巴盤在爪子上,末端的黑毛尖安靜地搭在尾巴尖上,瞳孔在屏幕光里縮成一條細線。
她先打開了左邊的日志文件。
三百一十二次操作。時間跨度從去年八月到上周五,每天都有記錄,有時候一天兩三次,有時候連續幾天沒有動靜,但總體趨勢是越來越頻繁。陸晨曦把操作日志按輸入人臉的來源分類——葉詩涵四十七次,趙曉月二十三次,劉仙仙十八次,剩余兩百二十四次輸入的是系統生成的虛擬人臉或游戲內的角色模型數據。她把葉詩涵、趙曉月、劉仙仙這三個名字單獨提取出來,排列在時間軸上。三個名字在時間軸上的分布不是均勻的——葉詩涵的操作集中在去年十月到今年一月,趙曉月的操作集中在今年二月到四月,劉仙仙的操作從今年三月開始,持續到上周五。
“他在按順序處理。”陸晨曦自言自語,手指在鍵盤上敲了一串命令,把三個人的操作時間軸並排顯示在中間那台顯示器上。三條時間軸從左到右依次展開,葉詩涵的時間軸最先開始,趙曉月的從中間插入,劉仙仙的最後出現。三條線的末端都指向同一個日期——上周五。
她把時間軸截圖保存,然後打開中間那台顯示器的文件樹。三個子文件夾的名稱和內容她都看過了,但這一次她把每個文件夾里的文件數量和最後修改時間調了出來。葉詩涵文件夾里一共四十七個文件,最後修改時間是一月十七日。趙曉月文件夾里二十三個文件,最後修改時間是四月二十二日。劉仙仙文件夾里十八個文件,最後修改時間是上周五。三個文件夾的最後修改時間在時間軸上排成一條斜線,從左下到右上,間隔均勻,像是在按照某個既定的節奏推進。
陸晨曦把這條斜線和甦小暖之前找到的游戲開發日志並排放在一起。開發日志上有一條被標黃的記錄——“角色概念評審會,4月17日。確認女主臉模方案。”這條記錄的日期和趙曉月文件夾最後修改時間的間隔只有五天。而葉詩涵文件夾最後修改時間一月十七日,和開發日志里另一條標黃記錄“女主初版人設確認,1月22日”的間隔也是五天。兩個間隔相同,都是五天。劉洋在每次評審會前五天完成一批人臉數據的處理,把輸出文件提交給策劃組,策劃組在評審會上討論方案,五天後給出結論。這是一個被精確計算過的流程,每個節點之間的間隔都是五天。
她又打開右邊的顯示器,把遠程訪問的日志往下翻。在文件樹的最底層,有一個叫“會議記錄”的文件夾,里面存著十幾份word文檔和幾段屏幕錄制視頻。她點開最近的一份文檔,文件名是“4月17日角色評審會紀要”。文檔內容不長,前半部分是策劃組對女主臉模方案的評價,後半部分是會議結論。結論只有一行字——“采用方案b,參考葉詩涵《盛裝》發布會造型。光影匹配由劉洋負責優化。”
陸晨曦把文檔往下翻,在最後一頁的頁腳處發現了一行極小的字,字體和正文不同,像是被人後來加進去的。她放大頁面,那行字寫的是——“下次評審會前完成趙曉月和劉仙仙的光影匹配方案。優先級︰趙曉月。”這行字的筆跡和文檔正文的打印字體不同,是手寫的,橫畫收筆時有一個向左回鉤的小動作,和沈知遠登記表上的簽名如出一轍。
她把截圖保存,然後點開“會議記錄”文件夾里的一段屏幕錄制視頻。視頻的縮略圖上能看到一個視頻會議的畫面,畫面分成左右兩半——左邊是劉洋的攝像頭畫面,他坐在一個光線昏暗的房間里,背後是貼滿設計稿的牆面;右邊是另一個攝像頭畫面,畫面里只有一個屏幕,屏幕上是一張放大的換臉效果圖,圖里的臉是葉詩涵的《盛裝》發布會截圖,被換到了一個穿著仙俠服飾的游戲角色模型上。視頻右下角有一個時間戳——4月17日,14:23:07。
陸晨曦把視頻截圖,和之前趙曉月在《站立》片場發現的深圳牌照電瓶車照片並排放著。兩張圖在桌面上排成一列,一張是游戲角色模型的換臉效果圖,一張是片場道具電瓶車的牌照特寫。兩張圖的拍攝時間不同,地點不同,但圖里的人臉數據來源相同——都是星途旗下的藝人。
她把所有截圖和日志文件打包成一個加密壓縮包,壓縮包的密碼是代碼撿回來的那天日期。然後她拿起手機給我發了一條消息,消息很長,分了三段。第一段是劉洋過去半年的操作統計——三百一十二次操作,四十七次葉詩涵,二十三次趙曉月,十八次劉仙仙。第二段是三個子文件夾的最後修改時間——“葉詩涵1月17日,趙曉月4月22日,劉仙仙上周五。間隔都是五天。他在按順序處理。”第三段是會議記錄里的手寫批注——“‘下次評審會前完成趙曉月和劉仙仙的光影匹配方案。優先級︰趙曉月。’筆跡和沈知遠登記表簽名同源。左手,橫畫收筆向左回鉤。劉洋和周遠洋有直接聯系。”
我是在早上七點四十分看到這條消息的。當時我正在書房里看《星途影城二期預算表》,台燈的光圈落在桌面上,那排文件的邊緣在燈光下整齊劃一。我讀完消息,把手機放在桌面上,翻開加密文件夾里陸晨曦之前發來的時間線圖,把劉洋的名字和“蜀山幻境”的節點標注出來。劉洋在成都,周遠洋在新加坡,兩個人隔著三千公里,通過一個加密郵箱和一份手寫批注連接在一起。
我給陸晨曦回了一條消息︰“把所有證據打包發給網信辦和杭州警方。同時通知甦小暖,讓她查一下蜀山幻境最近的服務器訪問記錄,看有沒有外部Ip在深夜登錄過。”
陸晨曦的回復在十分鐘後過來︰“收到。順便說一句,代碼今天早上把那只舊硬盤從紙箱里拖出來了,拖到操作台上,爪子按在標簽上。我覺得它在提醒我v1.0的事還沒做完。”
我打字︰“三天後我要v1.0的分析結果。還有,給代碼買條魚。”
陸晨曦回復了一個貓爪表情,然後是一行字︰“它不吃魚。它只抓老鼠。”
甦小暖在上午十點二十分把蜀山幻境的外部訪問記錄送到我桌上。她把一沓打印材料放在桌面右上角,和那排文件的邊緣對齊。她今天穿了一件淺灰色的薄西裝,里面是白色的圓領打底,下面是黑色的直筒西褲。西裝的面料在燈光下泛著一層柔潤的啞光,從肩到腰的過渡被直筒剪裁遮住了大半,但從側面能看到腰線的輪廓在布料下隱約起伏。頭發扎成低馬尾,用一根銀色的細發圈纏了三圈,發尾垂在西裝的後領邊緣,幾縷碎發貼在耳後的皮膚上。
“蜀山幻境的服務器在過去三個月內有十二次外部深夜登錄記錄,時間都在凌晨兩點到四點之間。登錄Ip全部指向新加坡的一個固定地址——河畔軒十七樓。周遠洋在Lion city media的注冊地址。”
她把打印材料翻到第二頁,上面是登錄記錄的詳細列表。每一次深夜登錄都對應著劉洋操作模型的時間點,時間差不到半小時。周遠洋在深夜登錄蜀山幻境的服務器,查看劉洋的操作進度,然後通過加密郵箱發送下一步指令。整個流程在深夜完成,白天劉洋正常上班,策劃組正常開會,沒有人知道服務器在凌晨兩點被一個新加坡的Ip訪問過。
“他把成都和新加坡的時差利用起來了。新加坡和北京沒有時差,但他選擇在凌晨操作,因為那個時候公司沒有人,服務器負載最低,遠程訪問不會引起注意。”
我把這條記錄和陸晨曦的操作日志並排放著。兩張圖上的時間線在同一個日期節點上交叉——4月17日凌晨兩點十七分,周遠洋登錄蜀山幻境服務器;4月17日上午九點四十分,劉洋提交女主臉模方案給策劃組。周遠洋在凌晨看完了劉洋的處理結果,然後在上午的評審會上,策劃組通過了“參考葉詩涵《盛裝》造型”的方案。周遠洋在深夜做的決定,在第二天上午被劉洋執行。
趙曉月晚上來送餃子的時候,我桌上的證據鏈還沒收。她端著餃子盤走進來,在辦公桌對面坐下。她今天穿了一件深灰色的圓領毛衣,外面套著一件奶白色的羽絨馬甲,馬甲的拉鏈拉到胸口的位置,領口敞開,露出毛衣的領子和一截頸線。下面是修身的深藍色牛仔褲,褲腳塞進一雙淺棕色的短靴里。頭發扎成低馬尾,用一根黑色的發圈纏了三圈,發尾垂在肩胛骨中間的位置。她的臉頰被外面的冷風吹得微微泛紅,鼻尖也是。
她把餃子盤放在桌面右上角,和那排文件的邊緣對齊。然後她看見桌面上那張時間線圖,腳步停了一下。她走到桌前,低頭看時間線圖。她的目光從周遠洋的名字移到劉洋,再從劉洋移到蜀山幻境。她的手指在“周遠洋”三個字旁邊點了一下,指尖在紙面上留下一個極淺的印記。
“他在視頻會議里看劉洋做的臉模,一邊看一邊決定用哪張臉。”
她抬起頭,目光和我對上。她的瞳孔在台燈的暖光里泛著深褐色的光,虹膜邊緣有一圈極淺的琥珀色。
“葉詩涵的臉,趙曉月的臉,劉仙仙的臉。他按順序處理,先處理葉詩涵,再處理趙曉月,最後處理劉仙仙。每五天一個節點,每次評審會前五天完成一批。他把我們三個人的臉排了一個順序,按照他想要的優先級。”
她的手指從時間線圖上收回來,垂在身側。深灰色毛衣的袖口在她收手的動作中微微移動,露出一截小臂,皮膚在台燈的暖光里泛著溫潤的白。
“他在挑最好用的那張。葉詩涵的臉正臉角度最多,趙曉月的站姿最穩,劉仙仙的側臉輪廓最清晰。他給每個人打了一個分,然後按分數排了一個序。”
趙曉月從桌前退後一步,走到窗前。她拉開窗簾一角,看著院子里的銀杏樹。枝頭光禿禿的,一片葉子都沒有。路燈的橘黃色光落在樹根旁邊的泥土上,趙曉月種的那棵嫩芽在夜風里安靜地站著。她放下窗簾,轉過身來,靠著窗台站著。
“葉詩涵知道了嗎。”
“陸晨曦在聯系她。”
趙曉月點了一下頭。她從窗台邊走回來,站在辦公桌旁邊,低頭看了一眼時間線圖上的“成都”兩個字。然後她轉身往門口走,走到門邊的時候停下來,側過頭。
“葉詩涵在窯房里。你去找她的時候,幫我把這個帶過去。”她從羽絨馬甲的口袋里拿出一只小小的白瓷杯,杯壁上刻著一片銀杏葉的輪廓,葉片邊緣有一道極細的裂紋,裂紋里填著金粉。“這是她送我的。上次在暗房,她說金繕的碎片在紅光里會變成暗紅色。我把杯子帶過來了,讓她看看在窯火里是什麼顏色。”
她把杯子放在辦公桌邊緣,和那排文件的邊緣對齊。然後推開門走了。腳步聲沿著走廊往電梯方向去,鞋跟敲在地磚上的聲音“嗒、嗒、嗒”三拍,第四拍還是拖長了一點。
我坐在椅子里,把那只白瓷杯拿起來。杯壁很薄,對著燈光看的時候能隱約看到胎體的紋路。銀杏葉的輪廓刻得很細,葉脈的線條從葉柄延伸到葉緣,每一根都清晰可辨。裂紋從葉片的右下角延伸到葉柄的位置,金粉填在里面,在燈光下泛著溫潤的暗金色。我把杯子放回桌面,和那排文件的邊緣對齊。然後拿起手機給陸晨曦發了一條消息︰“劉洋的證據鏈發出去之後,通知成都警方控制服務器。別讓他刪文件。”
陸晨曦的回復在三分鐘後過來︰“收到。另外,代碼把舊硬盤拖到操作台之後,在硬盤標簽上趴了一會兒。標簽上有一行鉛筆字,是‘v1.0’,字跡和沈知遠登記表簽名同源。這個硬盤可能是沈知遠在深鏡科技用過的。”
我把這條消息讀了兩遍。沈知遠在深鏡科技用過的舊硬盤,里面存著v1.0版本的源代碼。他把硬盤留在了技術部的雜物箱里,標簽上寫著自己的筆跡。陸晨曦在幾個月後才發現它。代碼把它從紙箱里拖出來,爪子按在標簽上。
我打字︰“硬盤里的數據恢復了嗎。”
陸晨曦︰“恢復了百分之七十。v1.0的代碼結構和v2.3不同,v1.0有一個獨立的追蹤模塊,在v2.3里被刪除了。這個追蹤模塊的功能是記錄每一次人臉數據調用的操作者Id、時間戳、以及輸出文件的哈希值。v2.3里刪掉了操作者Id,只保留了時間戳和哈希值。周遠洋手里的v2.3沒有操作者Id,他不知道我們能通過v1.0追蹤到每一次調用的具體操作人。”
我把這條消息又讀了一遍。沈知遠留下的舊硬盤里,藏著周遠洋不知道的追蹤模塊。他在深鏡科技做標注員的時候,用這台電腦處理過數據,硬盤里留下了v1.0的完整代碼。他離開的時候沒有格式化硬盤,把它留在了雜物箱里。幾個月後,陸晨曦在雜物箱里找到了它。
我打字︰“把v1.0的追蹤模塊和v2.3的日志做比對。重點查孫建明、劉洋、趙遠、陳默這四個人的操作記錄。”
陸晨曦回復了一個字︰“好。”
我把手機放在桌面上,端起桌面上的白瓷杯,喝了一口水。杯子是趙曉月剛才送來的,杯壁上還殘留著一點她手指的溫度。窗外的銀杏枝丫在風里輕輕晃動,光禿禿的枝條在路燈的光里投下細密的影子。我把杯子放回桌面,和那排文件的邊緣對齊。然後翻開《星途影城二期預算表》,繼續處理下一行數字。