第 8 章

第八章:git merge --no-fast-forward

第八章:git merge --no-fast-forward 插圖

他是被光叫醒的。

花蓮的陽光不懂分寸。窗簾只拉了一半,白光從縫隙裡擠進來,不是照在臉上——是整片牆都亮了,房間變成一個過度曝光的相框。

不是家的味道。旅館的冷氣在頭頂嗡嗡地轉,吹出一股洗衣粉和消毒水混合的風。

他的身體先反應。手指碰到床單的觸感——偏滑、偏涼,不是棉的。背脊下面的床墊太軟了,不像漁村側屋那張凹了一個人形的彈簧床,也不像——

像什麼?

像那張他睡了八年的雙人床。靠窗那一側。冬天棉被會被她整個捲走,他只剩一條毯子邊角。他從來沒有抱怨過。不是因為他大方,是因為她捲被子的時候會往他那邊滾半圈,頭髮蹭到他下巴,那個重量比任何被子都暖。

記憶像一條被解開的壓縮檔——不是慢慢展開的那種,是一次性解壓,資料夾套資料夾套資料夾,每一層打開都是他的人生。五歲搬家那天紙箱裡的味道。大學宿舍上鋪床板的嘎吱聲。第一次幫她修電腦時她遞過來的那杯太甜的紅茶。凌晨三點醫院走廊的日光燈,靖晞被推進產房,他在外面走了一百二十七步。然後第二個出來的那個更小、更皺、哭聲更大,他剪臍帶的手在抖。

全部。一次全到。

他閉著眼睛,看著天花板在眼皮內側投下的橘紅色暗影。

旁邊有人在呼吸。

很輕。比冷氣的風聲還輕。但他的耳朵在兩年的漁村裡學會了辨認海浪和風的差別,它現在同樣精準地鎖定了那個頻率——活的、溫的、有節奏的。

他不敢轉頭。

不敢,不是不想。是他不知道轉過去之後要用什麼表情。工程師面對一個崩潰的系統,第一步是看 log。但這個系統的 log 有兩年的空白,而他是造成空白的那個 bug。

他慢慢坐起來。頭暈了一下,房間歪了半秒,然後矯正。身體很虛——像跑完馬拉松的第二天,每一條肌肉都在低聲抗議。

床頭櫃上並排放著兩支手機。她的是新的,螢幕很大,裝了透明軟殼。他的是漁村那支——螢幕裂了一角,沒有殼,機身被魚腥和鹽風養出一層包漿。

旁邊有一杯水。涼的。杯緣沒有水漬,代表放了一段時間。

她倒的。

他伸手拿了那杯水,喝了一口。涼的水經過喉嚨的時候,一個念頭像 error message 一樣彈了出來:這兩年她一個人倒水、一個人關燈、一個人處理所有他不在場的事。而他在一個漁村裡修發電機,連她的名字都不記得。

他把杯子放回去。手沒有抖。


門被推開的時候沒有敲門聲。

是那種只有小孩才會做的開門方式——門把往下壓、整個人的重量掛上去、門砰地彈開撞到牆壁。

晏秋站在門口。七歲。膝蓋上的兩塊 OK 繃還在,其中一塊翹了一角。他的頭髮像鳥窩——昨晚大概在枕頭上轉了十幾圈。他穿著一件太大的 T 恤,下擺蓋過短褲,看起來像一顆穿了帳篷的蘑菇。

他看到床上的人。

零點三秒。

他的身體不需要更多時間。不需要辨認、不需要確認、不需要大人那種「先處理情緒再決定行動」的迴路。他的身體記得那個摸他頭的手,記得那個高度、那個力道、那個掌心的溫度。

他直接衝過來。

跑了四步,第三步被自己的拖鞋絆了一下,沒有減速。第四步膝蓋撞上床沿,整個人撲進那個坐在床上的男人懷裡。力道之大,程諳遠的背撞上了床頭板。

「你欠我兩年的生日禮物。」

這是他說的第一句話。聲音悶在程諳遠的胸口,有點糊,但每個字都聽得見。先算帳。這是晏秋。五歲會對暴龍提出賠償要求的那個孩子,七歲對著失蹤兩年的父親第一句話是清算債務。

然後他哭了。

不是安靜的那種。是七歲男孩不加修飾的哭法——嘴張得很大、聲音很尖、眼淚鼻涕一起來、整件太大的 T 恤都在抖。他的手抓著程諳遠的衣服,抓得很緊,像抓住一個他放手就會消失的東西。

程諳遠的手往下落。

九十公分。

兩年了。在雜貨店門口,手指張開往下伸,什麼都沒碰到。在小學圍牆外面,手指張開往下伸,什麼都沒碰到。在漁村的每一條路上,那隻手一直在找的東西——

碰到了。

他的手落在一顆溫熱的、亂糟糟的頭頂上。掌心貼上去的瞬間,手指自動順著後腦勺的弧度往下滑,在脖子和頭髮的交界處停住。這個動作他在夜市做過一次——那時候他不知道為什麼。現在他知道了。

七歲了。比他記得的重了好多。

門口站著另一個人。

晏禾。他站在門框旁邊,一隻手扶著門框的邊緣,指節發白。他沒有進來。他的臉上什麼表情都沒有——那種只有花了很大力氣才能維持的、什麼都沒有。

他看著弟弟撲進那個男人懷裡。看著那隻手落在弟弟頭上。看著弟弟的肩膀在抖。

他的嘴唇抿成一條線。

程諳遠抬起頭。他看見了門口的晏禾。兩年前他最後一次看到這張臉的時候,它是圓的、軟的、五歲的、會在睡前把玩偶塞進他懷裡說「兔兔要跟你睡」的。

現在這張臉瘦了。下巴的弧度削出了一點稜角,不像七歲的孩子,像一個提前收到帳單的人。

「晏禾。」

他叫了這個名字。聲音低低的,啞的。

晏禾的手指在門框上繃得更緊了。他的腳沒有動。他的下巴微微抬起來,像在扛一個很重的東西不肯放下。

嘴唇的那條線開始顫。

弟弟的哭聲在房間裡迴盪。冷氣嗡嗡地轉。窗簾被風吹得微微飄動。花蓮的陽光仍然不懂分寸地照進來。

晏禾鬆開了門框。

他走進來。一步,兩步,第三步開始跑。不是晏秋那種彈射式的衝刺——腳步聲從一步一拍變成連續的急促踏地,鞋底擦過地板的聲音越來越密,呼吸亂了,停不下來。

他撞進程諳遠的胸口。

拳頭砸下來。

不重。七歲的拳頭能有多重?但每一下都砸在同一個位置,砸在程諳遠的左胸,砸在心臟上方。一下。一下。一下。

「你去哪裡了。」

不是問句。沒有問號。是一個被壓了兩年的句子終於被砸開了出口,帶著所有他從來沒有說過的——每一個「我沒事」、每一個遞給媽媽的衛生紙、每一雙排好的拖鞋、每一次在晏秋面前保持的冷靜。全部碎了。

他的額頭砸進程諳遠的肩窩裡。拳頭停了。肩膀在抖。聲音從喉嚨最底部的地方爬出來,像被石頭壓了很久的水,找到縫了,一股一股地往外湧。

程諳遠的兩隻手臂收緊。左手抱著晏秋,右手抱著晏禾。他的胸口被兩個七歲的重量壓著,背抵著床頭板,頭暈得厲害,眼前的房間在緩慢旋轉。

他什麼都沒有說。

他的下巴壓在晏禾的頭頂上,眼睛閉著。他能感覺到晏禾的心跳——很快,像一隻慌了的小動物。晏秋的哭聲慢慢從嚎啕變成抽噎,濕掉的 T 恤貼在他胸口上。

他張開嘴,想說對不起。但這三個字太輕了,輕到可笑。用三個字去抵兩年的缺席,就像用一行註解去修一個系統性的 bug。修不了。他知道修不了。

所以他只是收得更緊。


孩子被帶出去以後,房間忽然空了很多。

沈靖晞坐在加出來的那張單人床邊。兩張床之間隔了一個床頭櫃。她的手放在膝蓋上,指甲掐進掌心裡——她自己沒注意到。

程諳遠坐在雙人床上。被孩子壓過的衣服皺成一團,胸口有一片濕。他的手擺在兩側,姿勢像一個等待系統診斷的人。

「你⋯⋯」他開口。停住了。「等一下,我想一下。」

她沒有催。兩年前她會催。會說「想什麼想,講就講啊」。現在她不催了。不是因為她變得有耐心,是因為她學會了一件事——有些沉默比話更重。

他想了很久。

「你瘦了。」

她差點笑出來。不是好笑。是荒謬。失蹤兩年的丈夫,恢復記憶後說的第一句完整的話,是一個觀察報告。

她沒有接話。走廊上有人拖行李箱經過,輪子碾過磁磚的聲音很長。冷氣繼續轉。他等著。她也等著。兩個人都在等一個誰都不知道長什麼樣子的東西。

「你的鬍子我沒見過。」她終於說。聲音比她預期的還輕。

「嗯。」他摸了一下下巴。「沒有刮鬍刀。」

沉默。

「你的頭⋯⋯」她的眼睛移到他後腦勺的方向。「那道疤。」

他的手下意識摸了上去,指尖碰到那條凸起的線。「海生伯撿到我的時候就有了。可能是被礁石撞的。我不確定。」

海生伯。撿到。她把這兩個詞在腦子裡翻了一遍,每一個字都在割她。但她的臉上只是微微動了一下,像一扇被風推了又關上的窗。

「你知道你的 Agent 救了我們嗎?」

她說這句話的時候聲音很平。不是感謝、不是控訴、不是撒嬌。是陳述。就像說「今天天氣不錯」。

但她的眼睛不平。眼睛裡面有兩年份的東西——保險公司、評議中心、API 帳單、凌晨三點的對話框、一個人帶兩個孩子搭公車去辦事、一個人學會看 email 裡的英文帳單、一個人決定打電話給一個不熟的人求助。全部裝在「你知道嗎」這三個字後面。

程諳遠安靜了很久。

窗外有車經過。喇叭聲。花蓮的街道在白天很吵。

「⋯⋯但它不是我。」

他的聲音很低。這句話不是在否定 Agent,不是在說「AI 不夠好」。她聽得出來。這是一個工程師把所有的愧疚塞進一個邏輯框架裡——「程式在運行,但寫程式的人不在場」。他在把問題拆解,因為拆解問題是他唯一會的事。

她看了他三秒。

「它當然不是你。」她說。聲音輕了,但硬了。「你不會在我問完問題之後說『你還有其他問題嗎?』你會說『等一下,我查一下』然後查了兩個小時忘記回來。」

他的嘴角動了一下。不算笑。

「但那兩年,」她的聲音又回到那種平,「它在。」

這兩個字之間隔了一個停頓。「它」和「在」之間的空白裡,裝著另一句她沒有說的話——「你不在。」

他聽見了。

他沒有反駁。沒有解釋。沒有說「我也不想的」或「我什麼都不記得」。那些都是對的,但在這個房間裡,對的和有用的是兩回事。

「我想修好這個。」他說。

她的手指鬆開了掌心。指甲在皮膚上留了四道月牙。

「這不是修電腦。」她說。


晚上。孩子們在加出來的那張單人床上擠成一團睡著了。晏秋的腿壓在晏禾身上,晏禾的手搭在弟弟的背上——清醒的時候他不太碰弟弟,睡著了身體倒是誠實。

程諳遠拿起床頭櫃上她的手機。螢幕大、透明軟殼、拿在手裡的重量跟他那支裂螢幕的完全不同。他按下電源鍵,螢幕亮了,滑開鎖屏——她沒有設密碼,跟以前一樣。

主畫面上 App 排得整整齊齊。她以前的手機桌面是一場災難——圖示堆在同一頁,找什麼都要滑半天。現在分了資料夾:「學校」「錢」「生活」「醫院」。兩年教會她的事情都收在這幾個字裡。

他看到了那個圖示。對話框。

他點開。

兩年份的對話紀錄,排列在螢幕上。時間戳從最早排到最近,每一筆都有日期。

最頂端,第一條訊息。

「你在嗎?」

他盯著這三個字。他知道這是對 Agent 說的。他知道 Agent 回了什麼——它回了「在喔」,因為他就是這樣設計的。啟動語設定為任何問候語觸發簡短回應。技術上來說,這是一個正常的使用者行為,Agent 的回覆也在預設範圍內。

但。

她不是在問 Agent 在不在。

她坐在他的椅子上,腳搆不到地面,用不熟悉的機械鍵盤打下這三個字的時候——她在問的是他。

他的拇指往上滑。對話紀錄在螢幕上流過,像一條被壓縮的時間線。

早期的訊息很短。「保險那個要怎麼處理」「帳單上寫的什麼意思」「兩個小孩的學費要繳了」。措辭生硬,像在跟一台機器說話。Agent 的回覆規規矩矩的,帶著他設定的口語化風格,但她沒有接那個風格,每次都直接問下一個問題。

三個月後開始變了。

「它說備註裡有一句話,什麼意思?」——她在問別人這件事,但紀錄裡沒有別人的回覆,只有她自己後來打的:「算了我知道了。」

半年後。訊息的語氣不一樣了。「Agent,晏禾今天在學校被老師叫去,說他都不跟同學講話。你覺得我要怎麼辦?」Agent 回了一段建議。她回:「嗯,試試看。」隔了兩天:「他願意跟我講了。謝謝。」

她在對 Agent 說謝謝。

一年後。訊息變得更自然了。偶爾有碎念。「今天超市週年慶差點被推著走,幸好我長了手肘。」Agent 回了一句「採買辛苦了」。她回:「辛苦什麼,這是戰場。」

他繼續往上滑。

速度越來越快。拇指划過一個月、兩個月、半年。她從生硬到熟練,從只問事務性問題到偶爾聊兩句,從不接 Agent 的語氣到回嘴「你講重點好不好,跟你本人一樣囉唆」。她在學會使用這個工具。不——她在學會跟它相處。就像她當年學會跟他相處一樣,從「蛤你講什麼」到接住他偶爾冒出來的冷笑話。

然後他看到了那一條。

凌晨三點零七分。

「他還會回來嗎?」

Agent 的回覆在下面,隔了一秒鐘的時間戳。

「我沒有這方面的資訊。但你可以隨時問我其他問題。」

他的拇指停在螢幕上。

她在凌晨三點問一個 AI 她的丈夫會不會回來。AI 誠實地回答了它唯一能回答的東西。不是安慰,不是謊言,不是「一定會的」——是「我不知道」。

這就是他的極限。

不是 Agent 的極限。是他的。他能把所有的保單條款灌進去,能設定口語化回覆風格,能寫延時訊息,能在備註裡埋一句「她比我想的還勇敢」。但他不能讓它在凌晨三點說「我會回來」。因為那不是資訊。那是承諾。而承諾這種東西,不能被寫成程式碼。

他按下電源鍵。

螢幕暗下去的瞬間,他在黑色的玻璃面上看到自己的臉——黑的、瘦的、陌生的。他把臉埋進手裡。掌心壓住眼睛,指尖插進頭髮裡,指腹碰到後腦勺那道疤。

房間裡很安靜。孩子的呼吸聲,兩份,節奏不一樣,交錯著。這個聲音他在夢裡聽過——兩年份的夢,追不上、看不清、醒來時枕頭是濕的。

現在他們在三公尺外。呼吸是真的。重量是真的。

他坐在暗下來的房間裡,把臉埋在手裡,很久。


窗邊的光已經從白天的亮白轉成傍晚前的那種淡金色。

沈靖晞站在窗邊。窗戶開了一條縫,花蓮的風帶著山和海之間才有的溫度灌進來。遠處的街道上有摩托車的引擎聲,有人在樓下用台語喊了一句什麼,聽不太清楚。

她看著窗外。不是看什麼具體的東西。就是看著。

身後有腳步聲。很輕。步伐的節奏她認得——偏慢、落腳穩、重心略偏左。兩年不夠改掉一個人走路的方式。

他走到她旁邊。

兩個人之間隔了一個拳頭的距離。窗外的光照在他們臉上,把兩個各自被兩年改變了的人照成同一個顏色。

他的手慢慢伸出去。

她沒有轉頭。

她的手指接住了他的。

不是十指交扣。只是指尖碰著指尖,像兩條斷掉的線,剛剛碰上接點,還沒有焊好。

風從窗縫裡灌進來,吹動了窗簾。遠處的山在傍晚的光裡藍得不太真實。

很安靜。