vatt'ghern jaskier's ballads
本文 2 個互動圖表在手機上以重點摘要呈現,互動版請以桌面瀏覽器開啟。

這週有六、七篇文章在做同一個動作:把一條長年靠「預設值」撐著的邊界,重新當成需要明寫、需要強制的契約來對待。strncpy 的 NUL 結尾、DNS 的驗證、agent 的角色、safe 與 unsafe 的那條線——它們本來都靠慣例與善意守著,這週一篇接一篇地說:別再把邊界託付給預設,把它釘死。

第 27 週 —— 把鬆掉的預設釘成硬邊界

這週的主軸

月二十三日到二十七日,五天十五篇 deep story,散在四個 domain 上,但有一條主線把其中好幾篇綁得很緊:這週特別多「把一條鬆掉的預設邊界,重新釘成硬契約」的故事。問題不在某個系統設計得好不好,而在它原本把一道該守的界線交給了預設值、交給了善意與慣例——然後總有人證明那道界線守不住,於是這週的工作,是把它從軟推論改寫成不可繞過的規則。

最有耐性的一例是 Linux 花六年拔掉 strncpy()。strncpy 的危險,在於來源長度等於或超過目的緩衝區時,它不保證 NUL 結尾——只有來源較短時才補零。換句話說,「字串會被正確終止」這件事,C 標準庫一直當成呼叫者自己要顧的預設,而不是函式的保證。Kernel Self-Protection Project 帶著三百六十多個 patch、走了六年,讓 Linux 7.2 成為第一個 strncpy() 呼叫點掛零的 kernel 版本——把「會不會 NUL 結尾」從「看你怎麼用」改成「編譯器幫你保證」。

同一個動作換到網路那層,是 忽視 DNSSEC,等於替 MITM 鋪好一條路。Hugo Barrera 的論點很直白:絕大多數作業系統與發行版預設不驗 DNSSEC,於是任何靠 DNS 委派去找伺服器的協定,都暴露在 DNS 欺騙導致的 MITM 之下。他把反 DNSSEC 的那套說辭,類比成當年反 HTTPS 的同一批理由——「驗證很麻煩、攻擊很罕見」——逐條拆掉。重點不是 DNSSEC 這個技術本身有多漂亮,而是把「要不要驗 DNS」從一個各自決定的預設,推回成一道理應預設開啟的邊界。

換到 AI 這頭,邊界鬆掉的方式更隱晦。prompt injection 其實是 role confusion 點破:LLM 靠文風、而非靠標籤去辨認「誰在說話」,所以系統提示與使用者輸入之間那道角色界線,根本是一種軟推論,不是硬邊界——這正是 prompt injection 防不乾淨的根。ICML 2026 那篇研究給的解法叫 destyling,把輸入的文風抹平後,攻擊成功率從 61% 砍到 10%:與其求模型「別被騙」,不如先承認角色不是天生的硬牆,再想辦法把它加固。

而工具這一側,這週連著兩篇是直接去「把安全變成預設」的。Reboot 把 C 直譯器幾乎全自動翻成 safe Rust:用 feature reduction 把翻譯拆成可測試的里程碑階梯,再以 multi-agent 編排原本不可靠的 coding agent——六個 6k 到 23k 行的直譯器原測試全過、validation 達 62 到 92%,過程中還順手揪出 mujs 的 heap buffer overflow 與 use-after-free。把舊 C 的預設輸出從 unsafe 改成 safe,等於把記憶體那道界線一次搬進型別系統。Lambda microVMs 則是把 Firecracker 的 snapshot 與 suspend/resume 包成兩個 API,讓沙箱同時拿到 VM 級隔離、近乎即啟、與 session 內保狀態——把「強隔離很貴所以省著用」這個預設,改成隨手可叫的廉價邊界。strncpy、DNSSEC、role confusion、safe Rust、microVM——五篇排成同一個方向:別再讓最重要的那道界線吃預設值。

沒被合稱的個別亮點

多模型併用的共同失誤天花板是這週最該收進選型筆記的一篇。把多個 LLM 用 routing、voting、cascade 或 mixture-of-agents 併起來,準確率上界其實被 β——所有模型同時答錯同一題的比率——釘死在 1−β。傳統那套 pairwise ρ 看不到這道天花板:相同的 marginal 與 ρ,可以對應到完全不同的全錯率。作者實測 67 個前沿模型,把這個 β 量了出來。一句話的教訓:堆模型不會替你跨過大家一起踩空的那些題。

每小時 4100 萬請求,Rails 拆成八個資料庫是 backend 這週的硬核代表。Andy Atkinson 拆解 Aura Frames 怎麼撐過 2025 聖誕尖峰——一小時 4100 萬次 API 請求(約 11.4K req/s)、所有資料庫尖峰 TPS 加總 22.6 萬、背景工作 1180 萬次/小時,app 一度衝上美加 App Store 免費榜第一。謎題是單一 primary 撐不住,答案是把工作負載按職責切到八個資料庫上——又是一個把「一台主庫扛全部」這個預設拆開來的故事。

Silk——ClickHouse 的 fiber runtime把併發的調度權收回自己手上。它是個 M:N 的 cooperative fiber runtime,把上千條 fiber 對映到每 CPU 一條 pin 住的 OS thread,用 io_uring 做 async I/O、再以 topology-aware work stealing 補負載不均。當你不想把調度交給作業系統的預設搶佔,這就是另一種「自己定義邊界」。

Cloudflare Workflows 的 saga 式 rollback補的是 durable execution 的一個洞:它保證每步剛好跑完一次,卻管不了「跑到一半、外部副作用已經生效」那段。解法是把補償邏輯當成 metadata 掛在 step.do() 上,failure 時按 reverse step-start order 反向執行——替「一致性」這道邊界,補上它原本不負責的那一截。

當 harness 迴圈接管程式碼是 Armin Ronacher 這週的 opinion essay,調子跟前面都不太一樣。他擔心的是:當判定「完成」的權力,從 model 移到外層那圈 harness 迴圈,軟體會從一台可理解的確定性機器,慢慢變成一個只能被診斷、不能被推理的有機體。他承認這套 loop 對有界任務很有效(他用它把 MiniJinja 移到 Go、也引了 Bun 從 Zig 移到 Rust 的報導),但對長存系統存疑——這篇正好替本週那股「把邊界釘死」的勁,提供一個反向的不安:有些邊界,我們可能正在不知不覺地交出去。

本週動向

把這週(06/23–06/29)和上週(06/16–06/22)放在一起量,盤子比前兩週動得稍多一點,但仍沒有任何一個 domain 接近值得寫進敘事的門檻:最大的位移是 infra 從 18.1% 升到 23.1%(+5.0 pp)、systems 從 24.7% 退到 20.0%(−4.7 pp),backend −2.5 pp、web +2.2 pp,而 ai 幾乎沒動(21.4% → 21.5%)。infra 這週的份量來自 DNSSEC、45°C 機房、Lambda microVM、saga rollback 一連串落在基礎設施上的題目;systems 的回落則是上週那批 Rust/kernel 重砲過去後的自然收斂。本週總量也從上週的 78 則進一步收到 65 則。

真正的換血照例在 tag 這層。上週還有五次的 gpu 這週直接掛零(−5),同一批退場的還有 systemsarm;接棒上來的是 agents(3 → 5,+3),postgres 也從 1 升到 3——配合 A2A 跨語言協定、agent skill 粒度、多模型天花板這幾篇,這週坐上桌的明顯是談 agent 編排與其極限的人,而不是上週談硬體吞吐的那一桌。

domain 分布變化:上週(06/16–06/22)→ 本週(06/23–06/29) infra +5.0 pp ↑ 上週 18.1% 本週 23.1% systems −4.7 pp ↓ 上週 24.7% 本週 20.0% backend −2.5 pp ↓ 上週 22.5% 本週 20.0% web +2.2 pp ↑ 上週 13.2% 本週 15.4% ai +0.1 pp → 上週 21.4% 本週 21.5%
每個 domain 一區,上週(淡)/本週(實)各一條 bar,按 |delta_pp| 排序。最大的變化是 infra 的 +5.0 pp——比前兩週稍大,但仍沒一個 domain 碰到 10 pp 的敘事門檻,真正的位移依舊在 tag 層。

每個 domain 一區,上週(淡)/本週(實)各一條 bar,按 |delta_pp| 排序

domain 盤子比前兩週動得稍多——infra 從 18.1% 升到 23.1%(+5.0)、systems 從 24.7% 退到 20.0%(−4.7),但仍沒一個破 10 pp;真正的換血在 tag 層——gpu 從 5 掉到 0,agents 從 3 升到 5。

一週的形狀

五天、五篇 roundup、十五篇 deep story,每天三篇。archetype 分布:explainer 5 篇居首、technical-deep-dive 4 篇次之、narrative 3 篇、investigation 2 篇、freeform 1 篇——這週「從零講起」的解說型偏多,正好配合主軸那股「先把一道邊界講清楚、再說它該怎麼釘」的勁。domain 上則明顯偏科:infra 5 篇最多、ai 4 篇緊隨、systems 與 backend 各 3 篇,而 web 連續第二週在 deep story 這一格掛零——這是這週形狀上最該標記的一筆。

15 篇 deep story × 5 天(06/23–06/27),每天三篇

五天、十五篇 deep story。archetype 在前、domain 在尾——這週的形狀是 infra 與 ai 領頭、web 連續第二週缺席,解說型與技術拆解並重。

五天、十五篇 deep story

本週五天十五篇 deep story——explainer 5 篇最多、technical 4 篇次之、narrative 3、investigation 2、freeform 1;domain 偏 infra(5)與 ai(4),systems、backend 各 3,web 連續第二週掛零。

下一週可能會展開的線索

最值得盯的是 Reboot 那條線。把不可靠的 coding agent 編排成「幾乎全自動」的 C→safe Rust 翻譯,這週給的數字是六個 6k–23k 行直譯器、validation 62–92%——但真正的試煉,是有人把同一套 feature-reduction 階梯丟到一個更大、更髒、測試覆蓋更差的 C 程式碼庫上,然後誠實貼出哪一階開始崩。下週若出現這類「我拿它翻了我自己的 legacy code」的實戰帖,才知道這個 62–92% 在野外站不站得住。

另一條是 agent 互通。這週 agents 這個 tag 一口氣衝到 5 次,A2A 把跨語言協作做成 wire-level 協定、agent skill 粒度在談怎麼不把 context window 塞爆、多模型天花板則替「堆 agent」畫了上界。三篇剛好從協定、組裝、極限三個角度逼近同一個問題。下週若再有一篇把這些接起來——例如一個多 agent 系統撞上 1−β 那道牆的 postmortem——這條線就從「各說各話」收斂成一個可對照的主題了。

這週的落點——「把邊界釘死」聽起來像潔癖,不像進度:它不長新功能、不上發表會,只是把一句「應該不會出事吧」的預設,改寫成一條編譯器、型別系統或協定會替你強制的規則。但這週一篇接一篇地提醒,工程跟僥倖的分界正落在這裡——strncpy 不再賭來源比較短、DNS 不再賭沒人在路上動手腳、safe Rust 不再賭呼叫者很小心。五天、十五篇,從 NUL 結尾到 microVM,這週做的事,是把最重要的那幾道界線,從善意搬到契約。