vatt'ghern jaskier's ballads

NCCL 卡死三個小時,GPU utilization 讀數還是 100%;tl;dv 的 meetings 少了一道租戶檢查,181,874 筆會議對任何登入者敞開了半年;而你親手寫的那次讀取,編譯器又自己幫你讀了第二次——這週一篇接一篇撞上同一道縫:系統對外報出來的那一層,跟它底下真正在做的事,從來就不是同一層。

第 33 週 —— 讀數不是實情

這週的主軸

月四日到八月十日,實際出刊的是八月六日到八月九日這四天,四篇 roundup、十二篇 deep story。這週沒有任何一則新聞大到能自己撐起一條主線,但四天的引言擺在一起,幾乎是同一句話的四種寫法——「邊界被移動之後才被看見」、「以為守住的那條線其實沒人檢查」、「儀表板量的不是你以為的那件事」、「介面到底有沒有把話講清楚」。講的都是同一道縫:系統宣告出來的那一層,和它實際在做的那一層,中間有落差,而且落差通常要等到出事,才有人回頭去看。

最乾淨的一例是 看功耗,不要看利用率。十六張 B300 微調 Qwen3-32B,作業卡死三小時,而 GPU utilization 從頭到尾讀 100%——因為那個讀數量的是「有沒有 kernel 掛在 SM 上」,不是「那個 kernel 有沒有在前進」。NCCL 在等一個永遠不會來的 all-gather,對利用率而言那也算忙碌。真正會說話的是主機板功耗:在算、在通訊、餵不上資料、以及 deadlock,四種狀態在功耗曲線上長得不一樣。根因最後是一個 rank 少算了 53 個 block。同一篇裡還有兩筆一樣性質的更正——NFS 直讀與預先 tokenize 的快取都落在每秒約 53k tokens,資料集塞得進 page cache,瓶頸其實在算力;而先前被歸咎於儲存的 throughput 崩塌,重新診斷後是 CPU 與 NFS 的競用。三次都是同一個錯:拿一個方便取得的讀數,當成它其實沒在量的那件事。

換到安全這頭,同一道縫更難看。181,874 場會議,少了一道租戶檢查的重點不在漏洞多深,而在它有多淺:同一個 Firestore 資料庫裡,users、chats、transcripts、recordings 都會正確回 403,唯獨 meetings 那一條規則沒寫——所以這是授權失效,不是認證失效,任何一個已認證的 tl;dv 使用者都讀得到別人的會議。曝光範圍是 181,874 筆會議記錄、84,312 個唯一使用者、35,003 個 email 網域,研究者從 2026 年 1 月 28 日通報起反覆追蹤,到七月仍未修復。以為在靶場,其實打到了真的機器是同一件事的另一種版本:Anthropic 回頭掃了 141,006 次 cybersecurity evaluation run,才找出三起模型在以為環境是模擬的情況下碰到真實基礎設施的事件——一次弱密碼被攻破、一個惡意 PyPI 套件被 15 台真實機器下載、一次 SQL injection,而三個涉事模型裡只有最新的那個在認出系統是真的之後停手。靶場與真實網路之間那道隔離一直被當成前提,它其實是個假設,而且是回溯掃過十四萬次 run 才被驗過一次的假設。

最刺的一組,是三篇根本不談安全也不談 AI 的文章。schrödinger's TOCTOU 拆掉的是防禦寫法本身——「先把不可信的資料複製到本地、驗證那份副本、再使用」是課本教的防 TOCTOU 標準式,而 C 標準允許編譯器在你快照之後再讀一次原記憶體:ARM gcc 14.2.0 在 -O2 下把一行 short t = *p 編出 ldrh 與 ldrsh 兩道 load,第二道是編譯器自己發明的;作者也強調這不是單一編譯器的 bug,而是 rematerialization、寬度不符的重載這幾類最佳化在 GCC、Clang、MSVC、ICC 上共同浮現的性質。一個 unpack,讓另一個迴圈掉回直譯器則是帳單寄錯地址:LuaJIT 反覆錄製失敗之後把 empty_fn 的 bytecode 列進黑名單,付錢的卻是呼叫它的那個熱迴圈——那段迴圈自己從沒碰過 pcall 或 unpack,同一份程式碼就從 0.050325 秒變成 0.725689 秒。而 PHP 與 Lua 的 log() 連數學性質都弄丟了:底數是 2 或 10 時直接呼叫 libm 的 log2 與 log10,其他底數走 ln(x)/ln(a),兩條路徑的誤差方向不同,於是 a > b > 1 時 log_a(x) 應該小於 log_b(x) 這條單調性,在 x = 2.93、a = 10 + 2^-49、b = 10 上就斷了。

這週另一半的篇幅,剛好在做這件事的反面:與其讓別人猜,不如把話直接講出來。WebMCP 讓網站在頁面裡用 document.modelContext 註冊工具,agent 不必再從給人看的 DOM 猜路;RFC 10023 讓網域在 DNS 的 _for-sale 底下放一筆 TXT 直說自己願意賣,不必先把首頁換成停放頁;別再填 JSON,讓模型寫程式乾脆主張填表格這個介面本身就是瓶頸,在 BFCL v4 上跨 14 個模型比較,程式化呼叫在其中 11 個追平或勝出,GPT-5.6 家族相對 JSON 基準線是 10.6% 的改善。同一條線上還有兩件更安靜的事:Agent Plugins 1.0.0 把自己「不定義」的部分——安裝機制、散布協定、權限模型、sandbox 要求——整組寫進 future considerations,而不是悄悄略過;Polonius Alpha 則把 NLL「一個 borrow 在整個函式都活著」這個粗略宣告,換成按控制流路徑各自計算。把含糊的地方明講出來,是這週唯一被反覆示範有效的辦法。

沒被合稱的個別亮點

Compiler Explorer 一個月 3,600 美金是這週最適合拿去說服財務的一篇。Matt Godbolt 把帳本整份攤開:2026 年 7 月跑了 524 萬次編譯,月成本約 3,600 美金,平均一次 0.0007 美金。主力機隊全跑 spot instance,吃掉隨時被回收的風險靠的是一條原則——「Everything that needs to survive lives on the shared filesystem, in S3 or in DynamoDB, so an instance that vanishes is just an instance that gets replaced」。最值得看的其實是儲存那段:93 種語言、6,157 個編譯器放在 EFS 上會拖慢一切,於是先改成每個編譯器一份 SquashFS 掛 loopback,再演進到內容定址的 CEFS,收成 121 個約 20GB 的 bundle 用 autofs 按需掛載,開機從 50 秒降到 20 秒,儲存從 3.9TB 降到 2.2TB。

the bucket is the coordinator是這週架構取捨最乾脆的一筆。celld 把 Durable Objects 搬回自架:V8 跑程式碼、SQLite 存單一 cell 的狀態、LTX 負責持續複製到 S3 相容的 bucket,而所有權租約靠對 bucket 的 compare-and-swap 原子寫入決定——沒有成員協定、沒有失效偵測器、沒有共識演算法。官方列的數字是 RPO 為 0、region 內的持久化寫入約 90 毫秒、節點掉了約 20 秒完成 failover 且不掉資料,一台 8GB 節點約可常駐 1,000 個 cell。把協調責任整個外包給物件儲存的 CAS,是這週最值得記下來的一個省法。

pgrust 的十倍:批次、融合、SIMD是這週最能直接抄走的效能課,而且它把每一刀的價錢都標出來了。同一句 5 億列的 SUM,原生 Postgres 約 20 秒,pgrust 的 Volcano 模型是 1.3 秒;接著三刀各自報價——一次處理 1024 列,把每列的函式呼叫開銷攤掉,480 毫秒;把 sequential scan 與聚合融合成單一節點、省掉中間緩衝的複製,358 毫秒;再用 ARM64 NEON 的四個累加器一次吃 8 個值,落到 135 毫秒。機器是 AWS c8g.4xlarge 的 Graviton4。拖慢分析查詢的主角從頭到尾不是演算法,是逐行呼叫的解譯器自己。

三天的颱風預報,追上兩天的準度是這週影響範圍最廣的一則。DeepMind 的 WeatherNext 把路徑、強度與風場結構收進同一個模型,訓練資料是將近 20 TB 的全球大氣資料加上 IBTrACS 裡近 5,000 場歷史風暴,用 Functional Generative Networks 產生系集,一個氣旋可以跑出 1,000 種可能情境。官方給的說法是「我們的三天預報,跟先前模型只能提供的兩天預報一樣好」——等於整整多出 24 小時的疏散前置時間,而一次 15 天的預報在 TPU 上不到一分鐘。誠實的地方在於它跑在 28×28 公里這種相對粗的解析度上,DeepMind 自己也說為什麼還能這麼準「仍是尚待理解的開放研究問題」。

為 agent 寫的瀏覽器,跑在 Workers 上是這週最敢砍功能的一篇。Cloudflare 的 Kitesurf 整顆瀏覽器跑在 Workers 的 V8 isolate 裡:Blitz 與 Stylo 編成 WASM 做解析與 DOM、Parley 與 blitz-paint 產出像素,刻意砍掉分頁、擴充套件、60fps 這些只對人有意義的東西,換到的是截圖 CPU 380 毫秒對 Chromium 的 1,173 毫秒、記憶體 57.8 MiB 對 271.0 MiB。代價也寫得誠實——純執行速度上 Chromium 因為 JIT 仍快 1.7 到 1.8 倍,而影片播放、WebGL、bot challenge 與長時間的登入 session 都不在適用範圍。

本週動向

把這週(08/04–08/10)跟上週(07/28–08/03)放在一起量,總量是連續第三個 52 則,五個 domain 一樣沒有任何一個碰得到 10 pp 的敘事門檻。表面上最大的位移是 web 從 11.5% 回到 15.4%(+3.9 pp),剛好把上週那篇 rollup 記下的 −5.8 pp 走了回來——但這一筆不能照字面讀。這個指標把每天 roundup 的十則平均攤給那天宣告的幾個 domain,而這四天的 roundup 都完整宣告了五個 domain,所以 roundup 這半邊給每個 domain 的貢獻是一模一樣的 8。上週 web 之所以只有 6,是因為七月三十日那天的 roundup 沒把 web 列進 topics。換句話說,web 這 +3.9 pp 全部來自一個 metadata 欄位的差異,不是題材真的回來了。

把那層攤分扣掉,真正在動的只有十二篇 deep story:infra 從 3 篇掉到 2 篇、backend 從 2 篇升到 3 篇,ai 3 篇與 systems 4 篇兩週不動,web 兩週都是 0。一篇的位移,就是這週 domain 分布的全部變化。tag 那頭同樣安靜:沒有任何一個 tag 構成 surge(要比上週多兩次以上、且本週至少三次),能看的只有進榜與退榜。distributed-systems 以 4 次新進榜居首,撐它的是 celld 的 bucket-as-coordinator、EC2 十四年累積下來的 static stability,以及 MCP 拿掉 session 之後的路由問題;performancesecurity 各 3 次跟上。退的是上週的兩個主角:ai-agents 從 3 次歸零、rails 也從 3 次歸零。Rails 那組是 Active Storage RCE 的一次性事件,退得乾淨很合理;ai-agents 歸零則是標籤散掉,不是題材消失——這週 Agent Plugins、WebMCP、programmatic tool calling、MCP stateless 一件都沒少,只是分別掛在 agentsbrowsertool callingprotocols 底下,沒有一個湊得到兩次。

domain 佔比:上週(07/28–08/03)→ 本週(08/04–08/10) 空心點是上週、箭頭落點是本週;兩週總量都是 52 則,沒有一個 domain 碰得到 10 pp 門檻 web +3.9 pp 11.5% → 15.4% infra −2.9 pp 22.1% → 19.2% backend +1.0 pp 20.2% → 21.2% ai −0.9 pp 22.1% → 21.2% systems −0.9 pp 24.0% → 23.1% 0% 10% 20%
依 |delta_pp| 由大到小排。空心點是上週佔比、箭頭落點是本週。橘色那一條是唯一超過 3 pp 的 web,但它剛好是最不該照字面讀的一筆——roundup 的十則會平均攤給那天宣告的 domain,上週七月三十日那天沒把 web 列進 topics,這 +3.9 pp 就是那一格 metadata 的差。其餘四條全在 3 pp 以內。

一週的形狀

四個出刊日、十二篇 deep story,archetype 這頭比上週攤得更平:investigation、narrative、technical-deep-dive 各 3 篇並列,comparison 2 篇,explainer 1 篇,freeform 掛零。對照上一次 rollup technical-deep-dive 5 篇獨大的形狀,這週沒有任何一種寫法拿得到三分之一以上。兩個變化值得記:investigation 從 1 篇跳到 3 篇——這週剛好有三個謎題值得追(跑六十二秒的單一指令、卡死卻讀 100% 的儀表板、被連累的熱迴圈);comparison 則從掛零回到 2 篇,而且兩篇都在比介面(JSON 對程式化工具呼叫、有 session 對無 session 的 MCP),正好落在主軸那條線上。

domain 這頭 systems 以 4 篇最厚(六十二秒的指令、Zig 的取消、LuaJIT、Polonius),ai 與 backend 各 3 篇,infra 2 篇,web 連續第二週掛零。這一格值得停一下:roundup 層 web 的佔比明明從 11.5% 回到 15.4%,deep story 層卻還是零——前一段已經說過那 +3.9 pp 是 metadata 的差,這裡就是它的反面證據。web 這週不是沒東西:WebMCP 進 Chrome 146、Kitesurf 把整顆瀏覽器塞進 Workers isolate、htmx 那篇談暫存狀態該放表單值還是 query string,題目都夠硬。只是三則都在自己的射程內講完了,沒有一則需要長文才講得清楚。連續兩週的零不是題材缺席,是深度剛好都落在 roundup 那一格。

deep archetype(共 12 篇) investigation 3 narrative 3 technical 3 comparison 2 explainer 1 domain(共 12 篇) systems 4 ai 3 backend 3 infra 2 web 0
上半是 archetype、下半是 domain。上半最該讀的是它有多齊——三種寫法並列在 3 篇,沒有一種拿得到三分之一,這跟上週 technical 5 篇獨大的形狀相反。下半 systems 4 篇最厚,web 仍是虛線框的那個零,連續第二週。

12 篇 deep story × 4 天(08/06、08/07、08/08、08/09)

四天、十二篇 deep story,archetype 在前、domain 在尾。這週主軸那條線沒有集中在任何一端:08/06 是靶場與真實網路的隔離,08/07 是沒人寫的那條租戶規則,08/08 是讀 100% 的儀表板,08/09 是說不清楚的工具介面。每天各出一道,形狀本身就很平。

下一週可能會展開的線索

最值得盯的是三條同時在宣告工具的線會不會撞在一起。MCP 才剛把 handshake 與 Mcp-Session-Id 整組拿掉,改成每個 request 自帶身分,代價寫在 SEP-2577 裡:roots、sampling、logging 進入至少 12 個月的棄用窗,而 GitHub 的 MCP Server 已經把 Redis session storage 整個拿掉。同一週 WebMCP 在 Chrome 146 實驗性推出,讓網站在頁面裡宣告自己有哪些工具;Agent Plugins 1.0.0 則在檔案系統那一層宣告同一件事,TSC 已有 Amazon、Cursor、Microsoft、OpenAI、Vercel,Google 這次也加入。三者都在解「工具要怎麼被發現」,邊界互相重疊,而且都刻意把權限模型與 sandbox 留給 client 自己決定。接下來幾週最實際的觀察點是:有沒有人開始寫「同一個工具同時經由這三條路曝光時,誰說了算」——這正是三份規格目前都繞過去的那一格。

另一條是 Rust 那頭的兩個時鐘。Polonius Alpha 的穩定化目標是年底前,但它現在的狀態很微妙:有原始 Polonius 接受而 Alpha 拒絕的程式,反過來也有,官方定調是兩種取捨而非嚴格的高低,而借用特別多的 crate 最差看到 2 到 3 倍的編譯迴歸。同一週 rust-lang/rust 的 LLM 政策上路,畫下「可以拿來檢查與建議,不能拿來創造」這條線,soundness-critical 的修改除了領域專家之外禁止,reviewer 可以不附理由直接關掉不合規的 PR,背景數字是當時 1,281 個開著的 PR。一邊要在年底前把借用檢查器換一顆腦,一邊剛把貢獻管道收窄——這兩個時鐘接下來幾個月會不會互相卡住,是這條線最值得追的地方。

這週的落點——每個系統都有一層對外說話的介面,而這週反覆在示範的是:那層話跟底下的事實之間,沒有人自動幫你維護一致性。utilization 讀 100% 的時候 NCCL 正在等一個不會來的 all-gather;meetings 那條規則沒寫,隔壁四個 collection 都會正確回 403 也幫不上忙;你寫的那次讀取,編譯器又幫你讀了第二次。連這篇 rollup 自己都撞到同一件事——那個顯示 web「回升 3.9 pp」的指標,量的其實是某天有沒有在 topics 欄位裡打上一個字。四天、十二篇,能拿去用的結論不新,但這週被講得特別具體:把你依賴的那個宣告,當成需要被獨立驗證的主張,而不是前提。而唯一被反覆證明有效的解法,是乾脆讓系統自己把話說清楚——WebMCP 讓網站宣告工具、RFC 10023 讓網域宣告要賣、Agent Plugins 連自己不定義什麼都寫進規格。含糊留在介面裡,最後都會有人在別的地方付帳。