「凡未錄進改不動的帳本的文字,都不可輕信;只憑腦子記得的,遲早會被人悄悄改掉。」
——《阿帕契開源審計錄》¹ 卷三·稽核篇
幕間⁴
黑夜裡二號揮刀刺殺女巫,狼隊滿心以為終局落幕,等候勝利宣告。
晨曦破曉,法官的座位已空——可那個寒冰般的聲音仍從穹頂響起:「遊戲——繼續!」
帷幕後,獵人冷靜睜眼。自以為屠邊、自以為帶走了幕後黑手的狼,全盤皆輸在一段被竄改的記憶。
白天發言輪到我的時候,我看著長桌上僅剩的五位玩家。
這是一個險象環生的五人殘局:我(明狼)、二號——那隻披著獵人皮的深水狼隊友(平安夜那晚自己捅了自己一刀,被女巫救了回來,身披好人陣營至高光環「女巫的銀水」)、手握毒藥的女巫、始終沉默寡言的真獵人,以及七號,那個沒有輪迴特權、一路靠著紮實筆記走到最後的平民。
在我前幾世累積的記憶深處,我清清楚楚地「記得」獵人昨夜就已經倒下了——昨天在不屬於他的輪次拍出獵人身分的那個人,挨了狼刀,又被女巫親口認下那瓶毒,連一槍都沒能開,我認定那就是真獵人。前幾世這個座位也這樣說過,我從沒親眼見過他開槍,卻從沒懷疑過——我被一個演得太好的好人騙了。在我的算計裡,場上的神職只剩下女巫一人。狼人殺競技中有一個經典的殘局戰術,叫做**「狼人自爆控刀流」:只要我現在拍桌自爆,就能以犧牲自己的代價,強制中斷白天的發言與投票流程,直接將賽局推進到黑夜;天黑之後,二號只需手起刀落將最後一位神職(女巫)刺殺,狼隊就能達成「屠邊規則」(殺光 3 位神職)**,奪得整場遊戲的勝利。更要緊的是,女巫剛認了毒,下一句就可能把她手上剩下的情報全說出來;我這一拍,也能讓她的話停在半句。
但這一世,我心裡還藏著另一個更大的盤算。
熬過這麼多輪,我終於看懂一件事:那個在穹頂之上報時、敲法槌、宣判生死的「法官」,根本不是什麼中立的系統。他是一個戴著面具的人——一個強大到不需要講理的個體,這座永不散場的牌局就是繞著他轉的。我一直以為要贏的是這局遊戲,其實真正把我們鎖在這裡的,是他。
而此刻,城堡上空那輪總是慘白、從不移動的月亮,正被一道暗影緩緩啃食、染成血色——月全食²。這是這片永夜裡唯一會變的東西。不知道為什麼,我就是知道:只有在血月遮天的那幾分鐘,法官的掌控會出現一道縫。
所以我的自爆有兩層。明面上,那是「狼人自爆控刀流」:拍桌犧牲自己、強制中斷白天、把賽局推進黑夜,讓二號補刀女巫、狼隊屠邊。暗地裡,我要趁血月當空、法官鬆手的那一瞬,把這一擊狠狠砸向他——我賭的是,只要法官死了,這座牌局就會跟著塌掉,所有人都能回家。
這是我演得最逼真、也自以為算得最精準的一局。我站起身,雙手按在石桌上,在血色月光透過彩繪玻璃灑滿長桌的肅靜中緩緩開口:
「不用再盤了,我是狼人。」
話音落下的那一瞬間,空氣凝固了整整三秒。隨即,穹頂之上傳來了法官那冰冷、宏大、毫無人類情感的權威聲音:
【上帝之聲】
「狼人自爆!天黑請閉眼!」
法槌重重落下。依照標準狼人殺競賽規則,狼人一旦拍桌自爆,立刻翻開身分底牌宣告死亡,當場喪失一切發言權與投票權。白天的討論被硬生生截斷,長桌旁的燭火瞬間熄滅,冰冷的黑幕無情籠罩了一切。
我死了。我的靈魂脫離了肉身,飄浮在城堡冰冷的大廳上方,以一個無法干涉現世的旁觀者視角,注視著黑夜的運轉:
【夜間行動】
「天黑請閉眼……」
「狼人請睜眼,狼人請殺人。」
(二號眼中閃過寒芒,手勢精準指向女巫。)
「狼人請閉眼。」
「女巫請閉眼……」
二號的刀法乾淨俐落,女巫甚至連開出毒藥的機會都沒有就倒在血泊中。我在半空中長舒了一口氣——三個神職(預言家、女巫、以及我記憶中早已死去的獵人)全滅,狼隊屠邊成功,這場糾纏了我無數世的輪迴噩夢,終於要以狼人的全勝劃下句點了。
晨曦破曉,陽光穿透高聳的彩繪玻璃,灑在長桌那具毫無生息的女巫身軀上。上帝的宣告再次響徹大殿:
【第四天 清晨】
「天亮了,昨晚有一名玩家倒下了。沒有翻牌,沒有遺言。」
死寂籠罩著議事廳。我滿懷期待地等待著那句終結一切的判詞:「屠邊成立,狼人獲勝」。
然而,上帝的聲音在沉寂了數秒後,平靜而冷酷地宣讀了五個字:
「遊戲——繼續!」
「遊戲繼續?!」
飄浮在大廳半空的我如遭雷擊,整個人陷入了前所未有的戰慄與恐慌。為什麼遊戲會繼續?如果女巫死了,三個神職應該已經全部陣亡才對!
直到這時,我才看見長桌角落坐著的那個人——那個我一直以為是普通村民的男子,正用冰冷的眼神擦拭著腰間的槍套。那是真獵人!他根本沒有死!
我下意識抬頭望向那張高台。血月正一分一分退去,而法官的座位——空了。面具、長袍、那柄法槌,連同他這個人,在我自爆的同一瞬間憑空消失。趁著血月遮天的那道縫,我確實把他帶走了。
可是那個宏大、冰冷、毫無起伏的聲音,卻依舊在穹頂之上迴盪:「遊戲——繼續!」原來把我們鎖在這裡的,從來不只是那張高台上的人。
還有一件事不對勁。這座牌局一直有條沒人明說的規矩:每一次我死,法官的法槌就會落下,把整個世界重置回第一夜,所以這局牌從來沒有真正打到最後,永遠停在「我輸了、重來」的半途。可這一次沒有重置。我沒有回到壁爐旁,沒有睜開眼,只是懸在原地,像一枚卡在兩次呼吸之間的念頭。握著法槌的人被我連同血月一起帶走了,從此沒有人能敲下那一槌,也就沒有人替這個世界重來。佛家把人死之後、下一世之前的這段懸空日子叫做中陰³。我既回不去,也走不掉,只能看;而這是第一次,這局牌有了打到終點的可能。
這一刻,《阿帕契開源審計錄》裡那句每天讀、卻始終讀不透的銘文,如同鐘鳴般在我腦海中轟然炸裂:
「只憑腦子記得的,遲早會被人悄悄改掉。」
我太自負了。我以為輪迴賦予了我超越常人的全知視野,卻從沒懷疑過:我腦中那些「歷史記憶」,本質上就像寫在粗糙紙張上的脆弱墨水,每跨越一次輪迴,就被這局遊戲幕後的「上帝」——或者說,操縱著這個聲音的那隻手——悄悄改寫與微調。我確信獵人早已被毒死,那只不過是上一世留下來、又被人改過一筆的殘影。而唯一沒被動過的,是七號那卷不歸這個輪迴管的羊皮紙。
在軟體工程中,人類大腦的記憶同樣是最不可靠的載體。多少開發者憑著「我記得這段代碼昨天還能跑」、「我印象中那個 bug 已經修過了」的模糊感覺上線系統,最終引發災難性崩潰?唯有不可變日誌(Immutable Logs)、經過 SHA-256 簽章的 Git Commit 歷史、以及在 CI/CD 流水線上跑出全綠的單元測試,才是現代軟體工程中唯一改不動、賴不掉的真理。
我們以 Go 語言來精確模擬這段「自爆中斷白天、夜間刺殺、以及因認知狀態漂移導致屠邊失敗」的狀態機邏輯:
package main
import (
"errors"
"fmt"
)
// Role represents the identity assigned in the Castronegro session.
type Role string
const (
RoleWerewolf Role = "WEREWOLF"
RoleSeer Role = "SEER"
RoleWitch Role = "WITCH"
RoleHunter Role = "HUNTER"
RoleVillager Role = "VILLAGER"
)
// PlayerSession tracks a player's role, living state and the two auras.
type PlayerSession struct {
ID string
Role Role
IsAlive bool
HasSilver bool
HasGold bool
}
// GameBoard encapsulates the game state machine (five players left at Day 29).
type GameBoard struct {
Players []*PlayerSession
}
// SelfDestruct executes immediate werewolf sacrifice, aborting daytime.
func (b *GameBoard) SelfDestruct(actorID string) error {
for _, p := range b.Players {
if p.ID == actorID {
if p.Role != RoleWerewolf {
return errors.New("only active werewolf can self-destruct")
}
p.IsAlive = false
fmt.Printf("[GOD_VOICE] Werewolf %s self-destructs! Daytime aborted immediately.\n", actorID)
return nil
}
}
return errors.New("actor not found")
}
// EvaluateSideSlaughter checks if wolves have slaughtered all gods or all villagers.
func (b *GameBoard) EvaluateSideSlaughter() bool {
livingGods := 0
livingVillagers := 0
for _, p := range b.Players {
if !p.IsAlive {
continue
}
switch p.Role {
case RoleSeer, RoleWitch, RoleHunter:
livingGods++
case RoleVillager:
livingVillagers++
}
}
fmt.Printf("[AUDIT] Current living tally -> Gods: %d, Villagers: %d\n", livingGods, livingVillagers)
return livingGods == 0 || livingVillagers == 0
}
// WouldSlaughterAfterKilling answers "what if the wolves had chosen this target tonight?"
func (b *GameBoard) WouldSlaughterAfterKilling(targetID string) bool {
livingGods := 0
livingVillagers := 0
for _, p := range b.Players {
if !p.IsAlive || p.ID == targetID {
continue
}
switch p.Role {
case RoleSeer, RoleWitch, RoleHunter:
livingGods++
case RoleVillager:
livingVillagers++
}
}
return livingGods == 0 || livingVillagers == 0
}
func main() {
board := &GameBoard{
Players: []*PlayerSession{
{ID: "NarratorWolf", Role: RoleWerewolf, IsAlive: true},
{ID: "DeepWaterWolf", Role: RoleWerewolf, IsAlive: true, HasSilver: true},
{ID: "Witch", Role: RoleWitch, IsAlive: true},
{ID: "RealHunter", Role: RoleHunter, IsAlive: true}, // Alive contrary to false memory!
{ID: "GoldVillager", Role: RoleVillager, IsAlive: true, HasGold: true},
},
}
// Day 29: Narrator self-destructs
_ = board.SelfDestruct("NarratorWolf")
// The door nobody looked at: killing the only villager would have won at once.
fmt.Printf("[COUNTERFACTUAL] kill Witch -> win: %v | kill GoldVillager -> win: %v\n",
board.WouldSlaughterAfterKilling("Witch"), board.WouldSlaughterAfterKilling("GoldVillager"))
// Night action: Wolves kill the Witch
for _, p := range board.Players {
if p.ID == "Witch" {
p.IsAlive = false
fmt.Println("[NIGHT_ACTION] Witch was assassinated in the dark.")
}
}
// Dawn evaluation
if board.EvaluateSideSlaughter() {
fmt.Println("[GOD_VOICE] Werewolves win by side-slaughter!")
} else {
fmt.Println("[GOD_VOICE] Game continues! Entering final three-player wheel.")
}
}
這段代碼赤裸裸地印證了殘酷的現實:livingGods 統計輸出依然為 1(真獵人存活)。我的自爆不僅沒有贏下遊戲,反而親手葬送了狼隊原本的人數優勢,將二號推向了孤立無援的「三人生死輪盤」。
其實還有一扇更顯眼的門,我和二號誰都沒推開:場上唯一的平民是七號,那一刀若落在她身上,三個平民全滅,同樣算屠邊成立。我們沒往那裡想,只因為都深信「殺掉女巫就已經贏了」——一個確信自己快贏的人,連最明顯的第二條路都看不見。
飄在半空的我忽然想通,我剛才那一拍,在開源世界裡有個精確的名字。
Apache 軟體基金會把權力畫成一座金字塔。最底層是任何人都能當的貢獻者(Contributor);往上是拿到寫入權、被社群認證過的 Committer;再往上是負責專案方向與釋出的 PMC(專案管理委員會);頂端是扛資金與法律責任的董事會(Board)。往上爬的標準只有一條——貢獻的質與量,這就是 ASF 掛在嘴邊的「社群重於程式碼」(Community Over Code):先長出信任,才給你權限。
決策靠投票,而票是有重量的。任何人都能回 +1、0、-1,但只有 PMC 成員的票具約束力(binding)。在程式碼修改的投票裡,一張帶著技術理由的 binding -1 就是一次否決,提案必須停下來處理它,不能繞過;釋出(release)的投票則不同——釋出不能被否決,規則是至少三張 PMC 的 +1,而且正票要多於反票。這跟九人局的警長 1.5 票是同一個東西:平票時誰來裁決、誰來指定發言方向——權威不是拿來壓人的,是拿來在僵局裡收斂出一個決定的。
那我的自爆算什麼?一張沒有理由、也不能被覆議的 -1。我用一個單方面的動作把整場白天的辯論直接掐斷,不留給任何人回應的縫隙。在 ASF 這叫濫用否決權;在 CNCF 那套「沙盒→孵化→畢業」的成熟度階梯裡,畢業門檻本來就寫著「決策過程公開、可被外人稽核」——一個靠強制中斷推進的專案,永遠畢不了業。
而 binding 的重點從來不是那張票本身,是它背後那份可以被翻查的紀錄。七號手裡那卷羊皮紙,比我拍桌的聲音更接近真相。

我拍桌自爆的衝動,正是犯了典型「Vibe Coding」的盲動罪過——自以為掌握了全局,實則只是一場由幻覺驅動的冒進。
陽光普照大地,長桌前只剩最後三道身影:
這就是九人標準局中最震撼人心的殘局——「三人生死輪盤」。而在這一局的最後一天——明天,七號將為我們展示什麼叫做真正的工程審計力量。
這三十天不是我一個人走完的。俗話說「前人栽樹,後人乘涼」——第 422 隊的前輩們,是為我們指導、指引、開路的人:九位鐵人各自挑了一條很硬的底層路,走成了九個很不一樣的系列,從 GPU、查詢引擎、LLM 到 PyTorch 編譯器。我只是在樹蔭下乘涼的那一個,想把這片樹蔭也介紹給你:
團隊頁面:第 422 隊・源來適愛開緣。
我們今天能這麼容易地找到文件、找到人問、找到一條可以跟著走的路,靠的是老大和所有的前輩們,對台灣開源社群長年累積、無法計量的貢獻:有人寫文件、有人回答新手的問題、有人辦聚會、有人默默審了一個又一個 PR,把門檻一塊一塊鋪平。這些幫助我們拿得太順手,順手到差點忘了它們不是理所當然。謝謝你們。這三十天裡我們能走到這裡,是因為你們先走過、也先把路修好了。
「所謂大成若缺,有缺憾才能進步。」⁵
——電影《一代宗師》
有人把自己的三十天走完了,團體賽卻沒能全員走完——前輩們如此,我們這一隊也一樣。可是缺憾不是終點,路是一代一代接著走出來的,這就是傳承:前輩把路修好,我們走過、再把它修得更好一點,留給後來的人。這份感謝,我們收下了,也會接著傳下去。明天的 Day 30,換看和我同一隊的第 436 隊。
"Apache Way Community Over Code" "ASF binding vote -1 veto override" "CNCF sandbox incubating graduated criteria" "狼人殺 警長 1.5票 平票裁決"
¹ 註:本書名為情境設定之虛構文獻,非真實歷史或開源紀錄。
² 註:現實彩蛋——今天是 2026 年 10 月 5 日,而今年的中秋滿月早在 9 月 26 日(臺北時間 9 月 27 日凌晨)就過了。依 NASA 月食目錄,2026 年真實的月食只有兩次:3 月 3 日的月全食與 8 月 28 日的月偏食,9 月和 10 月都沒有;下一次月全食要等到 2028 年 12 月 31 日(見 維基百科:21 世紀月食列表)。所以城堡上空這輪血月在現實天空裡沒有對應——它是這座牢籠自己的月亮,和 Day 19、Day 20 註腳裡那輪中秋的真月亮終究是兩件事,這條線就收在這裡。
³ 註:中陰(antarābhava)是佛教所說人死之後、下一世之前的過渡狀態,傳統上以四十九日為期;這裡只借這個詞,指敘事者被留在死與重生的縫隙裡。
⁴ 註:本系列每天開頭的〈幕間〉,都是七號那卷羊皮紙上的摘錄,是一切結束之後才被抄出、排好的,取自任何一世、任何一個時刻;所以它們不照文章的順序,也不一定正好是當天讀到的那一天。其中女巫、獵人與預言家私下交談的那些片段,也都是前幾世的殘影,不是最後這一局的事:在最後這一局裡,他們彼此並不相識,也沒有人私下串過話。
⁵ 註:台詞引自王家衛導演的電影《一代宗師》(2013)(https://zh.wikipedia.org/zh-tw/%E4%B8%80%E4%BB%A3%E5%AE%97%E5%B8%AB) 。