2026.06.16 —— 今日 10 則
TODAY'S THREAD 今天的線索都落在「邊界」上——真正會出事、真正省得到的,常常不在元件內部,而在它們交接的縫隙。Iroh 1.0 把連線從 IP 改成用公鑰來撥、savearoundtrip 把「我支援 h3」直接寫進 DNS、一篇 LLM agent 的事故分類發現活最久的故障都長在「沒有測試覆蓋的接縫」;另一頭,Kobzol 追問跨語言之間「什麼才算一個記憶體 CVE」,curl 作者乾脆把七月的漏洞通報整個關掉——維護者本人,也是系統的一道邊界。
Slack 談 agentic testing 該擺在 E2E 測試的哪一層
Slack 工程團隊用 200 多次實跑比較三種端對端測試模型,結論是把 LLM agent 當成既有測試的補位、而不是替代——他們的說法是「測試強制走固定路徑,agent 驗證的是目標」。代價很實在:傳統 deterministic 測試一次只花幾分錢、約三分鐘,agent 一次要 15 到 30 美元、跑五到十一分鐘,而且越複雜的情境失敗率越高(Playwright MCP 約 12%、生成式測試高達 48%)。對在評估要不要把 agent 塞進 CI 的人,這篇把「哪裡值得、哪裡別碰」算得很清楚。
把生產環境 LLM agent 的「無聲故障」分成五類
一篇 arXiv 論文觀察某個生產級 LLM agent runtime 八週,整理出 22 件有完整根因分析的事故,提出一套五類的「無聲故障」分類——其中第四類「鏈式幻覺與捏造」是 LLM 系統獨有的,系統不是當掉,而是吐出一段流暢、看似合理、卻誤導人的敘事。最值得記住的數字是:約七成的無聲故障是靠使用者察覺、而非測試或稽核抓到,而活最久的故障都長在「元件之間、沒有任何測試跑過的接縫」。對在跑 LLM agent 的團隊,這是一份難得從事故端整理出來的失效地圖。
同樣一個記憶體 bug,為什麼在 Rust 算 CVE、在 C/C++ 不算
Kobzol 這篇追問一件少有人講白的事:記憶體安全 CVE 在 Rust 和 C/C++ 之間,連「算不算 library 的漏洞」這個門檻都不一樣。他的論點是——只要有任何方法能在不寫 unsafe 的情況下讓 library 觸發記憶體錯誤,那永遠是 library 的 bug;而在 C/C++ 裡,同樣的誤用(像對 curl_getenv(NULL) 傳空指標導致 segfault)通常被歸成「呼叫端用錯」。Rust 消掉的是 safe code 裡的記憶體不安全,沒消掉的是邏輯漏洞、unsafe 區塊裡的 bug 與編譯器 bug。
用 C++26 static reflection 在編譯期就把 JSON 解析完
Daniel Lemire 示範把 #embed 與 simdjson 的 compile_time::parse_json 搭起來,讓編譯器在編譯期把 JSON 直接解析成對應欄位的 struct——不用再手寫一個個欄位的解析碼。好處有三:少掉樣板、JSON 寫壞(少個括號、true 拼錯)會直接編不過、而且整份 JSON 從 binary 裡消失,最後組語裡「只剩答案,沒有解析、沒有欄位存取」。他說代價是門檻很高:要 GCC 16 以上、開 -std=c++26 -freflection。
Iroh 1.0——用公鑰撥號,而不是用 IP
P2P 連線函式庫 Iroh 發了 1.0:核心主張是「撥 key,不撥 IP」——IP 會在你控制不到的地方說斷就斷,公鑰卻是你自己造、自己掌握,跨裝置、穿過 NAT 與防火牆都還是同一個可定址端點。底層靠 QUIC multipath 與 NAT 打洞先試直連,連不上才走公開 relay;官方說常態下「一次連線裡有 95% 的資料是裝置之間直接傳的」,過去 30 天光是 relay 上就建立了超過兩億個端點。1.0 同時鎖定 wire protocol 與 API 穩定,並支援 Rust、Python、Node.js、Swift、Kotlin。
用 whois 查 RADb,把一個 ASN 註冊的路由翻出來
gslin 的一則短記:對 Routing Assets Database(RADb)下 WHOIS 查詢,就能把某個 ASN 註冊過的 route 與 IP 前綴撈出來。對在排查 BGP、做路由過濾或想確認對方宣告了哪些 prefix 的網管,這是個不必登入、用內建工具就能上手的查法。內容不長,但把一條平常容易忽略的查證路徑講清楚了。
Typst 0.15——variable fonts、HTML 匯出的 MathML、bundle export
Typst 0.15 一口氣補上幾塊大的:支援 variable fonts,一個字型檔就能調粗細與寬度,不必再管一堆靜態檔;HTML 匯出改用 MathML,公式變成可選取、能被螢幕報讀、瀏覽器也能高解析度算繪,取代過去不可存取的 SVG 做法;再加上 bundle export(一個專案吐出多份 HTML/PDF/資產)與原生的多份參考書目。對拿 Typst 當 LaTeX 替代、特別是要產網頁文件的人,這版把幾個長期要靠社群套件繞的洞補起來了。
發一筆 HTTPS DNS record,讓第一次連線就走 HTTP/3
savearoundtrip 講一個常被忽略的小最佳化:瀏覽器現在多半是靠連上之後的 Alt-Svc 標頭才知道你支援 HTTP/3,所以「第一次連線用不到 h3」。改成發一筆 HTTPS DNS record(RFC 9460),把 alpn="h3,h2" 連同 IP hint 一起寫進 DNS,瀏覽器在解析網域時就拿到,能在「最初一次連線」就直接挑 QUIC。省下的是一趟探路往返,視網路距離大概值 5 到 150 毫秒以上。
TimescaleDB 怎麼把時序資料壓到剩零頭——Hypercore
一篇拆解 TimescaleDB Hypercore 的好文:它是 row 與 column 並存的混合引擎,新資料先用 row 格式吃寫入,舊 chunk 再轉成壓縮的 columnar——大約每 1000 列打包成一批,每一批變成壓縮表裡的一列、欄位都成了陣列。壓縮按欄位型別分別處理:時間戳用 delta 與 delta-of-delta、浮點數用 Gorilla 式的 XOR、重複值用 run-length、字串與 JSONB 走字典。關鍵在 segmentby 與 orderby 兩個設定——分組對了,配上 minmax 稀疏索引就能整批跳過、不必解壓,官方宣稱最高可達 98% 壓縮率。
curl 的「a summer of bliss」——七月暫停收漏洞通報
Daniel Stenberg 宣布 curl 七月整個月暫停收漏洞通報:HackerOne 通報表單到 8 月 3 日才重開,原訂的 8.22.0 版也順延到 9 月 2 日,GitHub 的 issue 與 PR 照常運作。撐過前幾個月的壓力後,他把重點放在開源維護的可持續性——維護者真的需要休息,而不是「人在放假、腦袋還掛在專案上」。對任何依賴關鍵開源元件的團隊,這也是一則提醒:上游的回應節奏,本身就是你供應鏈的一部分。