抽籤終端給出的基礎地圖是斷潮港。
林知微看見名稱時沒有把它當成好消息。顧沉舟職業首秀就在斷潮港,北牆、排潮溝和星核後沿都能按公開錄像重建;可基礎地圖相同,只代表建築與候選機制來自同一組,不代表變化順序、伺服器負載和十個人的輸入也相同。
紀律部記錄員將隨機池、抽取指令和結果全程錄屏。種子尾號與首秀那場不同,地圖說明里仍包含北側閘門、提前載入材質和兩組脈衝帶。沈確讓曜石確認是否繼續。
「繼續。」林知微說。
若他們因為尾號不同就拒絕,昨天寫下的受控復現只是一張要求系統配合答案的申請。
測試室里沒有觀眾,也沒有轉播導播。五台選手終端與比賽設備同型號,輸入配置由賽前哈希還原。舊鍵盤仍在證物箱裡,第一輪使用標準外設;對面五個位置由審計機器人執行霧港公開錄像中能夠確認的動作。
林知微先把差異寫進結果頁,才讓選手入座。
顧沉舟停在門口看她:「現在就寫失敗條件?」
「寫測試條件。」
「還沒開始。」
「開始以後再補,會像專門為結果找的。」
她列出四項已知差異:種子尾號不同,對手不是原選手,場館負載使用標準壓力流,涉檢原設備未接入。最後一項是時間,首秀發生在完整賽程和真實對抗之後,本次只從指定階段重建,選手此前的操作歷史為空。
這些差異不等於異常原因。它們只是以後不能被一句「完全相同」省略的部分。
她還給觀察指標預先編號。A項是北側資源激活時刻,B項是閘門公開狀態與實體碰撞,C項是北牆材質與R17-04,D項是完整性任務創建和首次顯示。任何一項命中都單獨記錄,不允許因為其餘三項正常而歸為未復現;四項全部不命中,也不能改成「畫面無明顯異常」這種無法核驗的話。
紀律部提供的分析終端里有一層更深的診斷入口,按鈕呈紫色,權限說明只寫「內部測試」。林知微沒有點。它或許能讓她更快看到候選參數,卻不在本次授權目錄里;從越權頁面得到的正確答案,不能替受控測試增加證據效力。
她關閉入口,把關閉動作也留在屏幕錄製中,只使用公開服務狀態、獲準的任務摘要和原始畫面。
沈確從觀察室確認:「目標項已經凍結?」
「凍結。測試結束前不新增,不改容差。」
「失敗標準?」
「四項均未越過預設閾值,記錄為目標異常未出現。」
這句話比「正常」窄得多。一次測試不可能替整個系統頒發正常證明,只能說明他們等候的四件事沒有來。
周硯在五號席後確認口令表。為了不讓知道結果的記憶改變路線,他們只重複能夠從隊內語音和個人輸入記錄驗證的操作,不要求任何人表演當時的緊張,也不把猶豫補成精確按鍵。
唐梨負責第一次資源交接。許燃按原時點打掉中央設施,秦越在北牆外側承壓,周硯報星核前的轉線口令。顧沉舟沿排潮溝到達公開標記,在牆體接縫前停下。
林知微同時看四條時間軸。
公開倒計時,伺服器狀態,選手輸入,任務隊列。
北側第一組脈衝沒有提前亮起。
它在公開計時歸零以後才從底座升起,誤差六毫秒,處於測試服允許的同步範圍。北側閘門也按公開狀態開啟,沒有先載入關閉碰撞,更沒有出現短暫維護旁路。
「北側正常。」唐梨報告。
盾面穿過投影邊緣,命中判定為空。
牆沒有額外碰撞層。
材質預載開始時,林知微將畫面以原始幀率保存。橫向水痕從第一層過渡到星核階段的深藍金屬,拼縫亮過一次正常反光。識別器沒有返回字符,她仍逐幀看完前後各兩秒。
沒有R17-04。
完整性任務隊列也保持空白。
第一輪結束以後,沒人先說話。測試終端把一張沒有異常的斷潮港停在大屏上,和職業首秀回放里的北牆幾乎一樣;正因為看上去一樣,四項沒有發生的結果才更清楚。
沈確從觀察室發來確認:「是否按協議進行第二輪?」
林知微核對第一輪輸入偏差。許燃摧毀設施晚了零點零三秒,秦越的盾擊位置向右偏了十二厘米,周硯一條口令比原語音短半拍。三項都沒有越過方案容差。
顧沉舟問:「能把盾擊位置改回原坐標?」
「可以。要先登記。」
他沒有說那十二厘米也許就是原因。林知微在第二輪變更欄里只寫「修正可觀測輸入偏差」,不寫預期異常。
第二輪從階段起點重新載入。
許燃這次提前零點零三秒開火。秦越讓盾面中心準確落到職業首秀的坐標。顧沉舟的標記時點與原記錄相差兩毫秒,周硯保留完整口令。
北側脈衝準時。
北閘準時。
牆體沒有碰撞,R17-04沒有出現。
第三輪按協議加入更高一檔標準壓力流。模擬觀賽請求占滿預定帶寬,轉播編碼和伺服器運算延遲都比前兩輪上升,卻沒有超過正式比賽安全線。林知微沒有讓壓力程序追求首秀那晚的單一數字,因為總請求相同並不代表請求形成方式相同。
這一次,材質切換晚了二十一毫秒。
仍在規則容差內,也仍然沒有那串字符。
三次失敗足夠構成本次測試的結果。
韓岑提出過追加第四輪,改用最接近三年前決賽的候選地圖。沈確沒有直接否決地圖,而是讓他說明第四輪要區分哪兩個假設。
韓岑停了幾秒:「看北閘會不會提前。」
「那是觀察目標,不是條件。」林知微說。
如果因為前三輪失敗就臨時尋找另一張更容易出現異常的地圖,他們可以一直換到畫面足夠相似為止。命中以後,也無法說明是預先假設成立,還是不斷追加測試必然遇到一次偶然錯誤。
韓岑撤回追加,沒有把被否決寫成聯盟拒絕復現。林知微在備註中保留這次討論,說明舊決賽地圖若要進入下一輪,必須先提出獨立的關聯欄位,而不是只憑相似北閘。
韓岑從觀察室進來時,問的不是還能不能再跑一輪,而是:「提交前要不要先內部復盤?」
林知微已經按下提交。
原始錄像、四條時間軸、輸入差異、壓力數據、字符識別的零結果和她的逐幀人工覆核記錄同時進入上訴材料。文件名稱沒有寫「未復現疑似」,也沒有寫「階段性正常」,只寫受控測試一至三輪結果。
「先復盤不會改變文件。」她說。
「可能發現採集錯誤。」
「發現以後補更正記錄。不能因為結果對我們不利,先讓它離開提交時限。」
沈確在另一端簽收。系統顯示三份日誌哈希一致,遮蔽項只有審計機器人內部控制參數,沒有其他選手數據。
顧沉舟把首秀回放與測試畫面並排。他先看北側脈衝,再看北牆命中,最後看任務隊列,沒有嘗試從正常反光里找一個像R的邊緣。
「公開操作不足以觸發。」他說。
「在本次條件下不足以觸發。」林知微糾正。
「對。」
這是他們必須接受的損失。原上訴最容易解釋的一條路徑被削弱了:只要曜石照首秀再打一遍,異常就會重來。事實沒有配合這條路徑。
唐梨問:「會不會直接變成原比賽里根本沒發生?」
「不能。」林知微把能證明與不能證明分開,「測試證明同一基礎地圖、同一陣容、同一模塊和已記錄操作,在三組受控條件下沒有產生異常。它不能撤銷公開直播已經留下的牆體變化,也不能讓聯盟附件里的十一分零五秒消失。」
「也不能證明系統永遠正常。」許燃說。
「不能。它甚至不能證明這張地圖在所有情況下正常。」
唐梨看著結果頁:「那它對上訴最壞的影響是什麼?」
「原判可以據此反駁『職業首秀的公開操作本身會穩定觸發異常』。我們以後不能再這樣主張。」
「最好的呢?」
「沒有最好。負結果不是換一種方式幫我們。」林知微說,「它只讓錯誤範圍變小。若以後仍出現異常,必要條件至少不只是這份公開操作表。」
許燃聽完沒有輕鬆。他把個人輸入偏差頁面保存進隊內復盤,接受自己的零點零三秒不是答案,也沒有把它刪成完全一致。
林知微繼續列限制。原設備尚未接入,原對手行為無法完整複製,種子尾號不同,真實賽程前置操作缺失,場館負載只有總量近似。每一項都可能是條件,也可能與異常毫無關係。
「如果全都叫缺失條件,我們永遠不會輸掉一個假設。」沈確通過桌面終端接入會議,「今天沒出現,就說少了人;換了人還沒出現,就說少了負載;負載補上,再說少了某個無法保存的情緒。那不是可驗證。」
林知微沒有反駁。
「不復現只能說明缺少條件,不能反證原事件不存在。」她說,「但要繼續申請測試,我們需要把未知條件改成能彼此區分的變量。」
沈確點開她提交的差異表。
「現在能先排哪一個?」
「原設備。」顧沉舟說,「法證鏡像完成後,可以比較標準外設與涉檢設備;其他條件不變。」
「那只能測試設備是否必要。」林知微說,「不能把沒復現直接寫成設備無關。還需要一個對照組。」
「陣容和前置操作呢?」沈確問。
林知微看向空白的下一輪申請。她知道怎樣把選手身份、行為順序與候選參數拆開,卻沒有可以公開調用的正式接口。用未披露的方法給出答案,只會把另一個無法復現的結論送到沈確面前。
「目前不知道。」她說,「我會先設計只改變一個條件的對照,不申請全量數據。」
她在差異矩陣里把「可能有關」全部改成問題。原設備接入與否,是否改變材質索引或任務隊列;真人對手替換審計機器人,是否改變候選順序;完整賽程前置操作加入以後,是否改變北側狀態。每個問題都需要一組只動一個變量的結果。
場館負載最難。總請求、轉播編碼和伺服器占用可以模擬,觀眾何時進入直播、導播切向誰、十名選手此前積累了什麼輸入,無法還原成一個數字。她把這一項標為暫不可控,沒有用「環境不同」替所有失敗保留後門。
陣容也不只是五個註冊姓名。若系統只讀取協議體與模塊,替換選手不應改變結果;若候選參數隨公開可見的隊伍習慣變化,至少能夠用不同登記陣容做對照。這個想法仍只是實驗方向,不能寫成弧核已經調用個人畫像。
林知微保存矩陣,沒有附上自己過去接觸過的任何內部參考庫。她能說的仍然只有這次測試留下的邊界。
沈確接受她對失敗結果的完整提交,也接受無法復現不能抹去原錄像。
他沒有接受一個可以無限延長的「還差一點」。
「下一次,」沈確說,「先說清缺少的條件到底是什麼。」