2026.08.16 —— 今日 10 則
TODAY'S THREAD 今天多半在講同一件工程動作:把原本看不見的東西挪到看得見的地方——MCP 流量靠一個協定標頭現形,curl 的效能靠一張每 20 分鐘更新的圖現形,Registry 的 race 靠 model checker 走完一千四百多萬個狀態才現形;而 Claude 的浮水印剛好反過來,是把訊號藏進本來就要擲的那顆骰子裡。
浮水印沒有改字,改的是抽樣的骰子
Anthropic 給 Claude 的文字輸出加上浮水印,技術基礎是 Google DeepMind 在 2024 年發表的 SynthID-Text;它不改寫內容,而是換掉「在語意等價的候選詞之間挑一個」時所用的隨機來源,改由密碼學金鑰加上前文脈絡決定。官方說法是「在內部測試中,我們沒有看到浮水印對 Claude 文字的內容、創意程度或可讀性造成影響」,而且不產生額外 token、不帶可追溯到特定個人、組織或對話的資訊。代價寫得同樣清楚:候選詞太少的事實性句子、樣本太短、或被大幅改寫過的文字,訊號都會變弱甚至消失。
Qwen-Max 這一級,第一次開放權重
Qwen3.8-2.4T-A95B 把「總共 2.4T、啟動 95B」的 MoE 放上 Hugging Face,官方說這是「Qwen3.8 首度把 Qwen-Max 等級的模型帶進開放釋出」。架構走的是混合注意力——92 層裡混用 Gated DeltaNet 這類線性注意力與 Gated Attention,512 個 expert 每個 token 路由 10 個外加 1 個共享 expert。脈絡長度原生 262,144 token,可延伸到 1,010,000。
擴縮的單位,從模型改成算子
這篇 arXiv 論文問的是一個基本卻沒定論的系統設計題:LLM serving 的擴縮單位到底該是什麼。現行做法多半把整個模型當成單一的擴縮單位,簡單,但抓不到推論負載的細部動態,於是不是在突發需求下違反 SLO,就是讓 GPU 大幅閒置。OpScale 改以算子層級的彈性當作擴縮原語,在最多 40 顆 A100 與 24 顆 GB200 上用生產環境 trace 評估,達成 SLO 時最多少用 36.3% 的 GPU 與 28% 的電力,或在固定成本預算下多拿到 44% 的吞吐。
先讓數字看得見,人就自己來了
Daniel Stenberg 給 curl 架了一套很土的持續效能量測:三支 shell script,一支從 git 更新 curl 並跑測試,一支解析 log 產圖,一支用 crontab 每 20 分鐘叫起前面兩支,目前 24 個測項跑完一輪大約六分鐘。他對這個做法的自評是「有總比沒有好」,長期趨勢那一段則用 LTTB 降採樣配上 Mann-Kendall 檢定與 Sen's Slope,另外替每個測項手工設一條叫 stake 的門檻線。效果快得出乎意料——「只花了幾個小時,我們就收到第一批改善數字的提案」。
省下來的編碼,中斷時付了回去
這篇長文把 RISC-V 的設計取捨逐條攤開,最具體的一組數字落在中斷處理:沒有硬體協助、暫存器得自己收,RISC-V 大約要 44 個 cycle,ARM Cortex-M0 是 27 個。其他幾刀砍在定址模式缺了 scaled register(陣列存取被迫從一道指令拆成多道)、compressed load/store byte 的 offset 只到 0 至 3 而 ARM 到 31、以及立即數被拆散在不連續的位元上沒有規律可循。作者也數了 Linux kernel:「平均每兩個函式就有一個用到、或本來可以用到依位元值分支的指令」,共 35,393 處。
一個標頭,把影子 MCP 照了出來
Cloudflare Gateway 判斷 MCP 流量的依據,從 hostname 與 URL pattern 這類很基本的訊號,多加上了協定層的 MCP-Protocol-Version 標頭;舊訊號留著找舊版 client 與看歷史軌跡,但會漏掉架在一般網址上的 MCP server。MCP 2026-07-28 規格「更進一步要求每個 POST 請求都帶上它」,於是「Gateway 在每個經 TLS 檢查的請求上檢查該標頭並據以分類」。policy 端露出的是 experimental.is_mcp 這個布林 selector,另加一個 mcp_portal 的 Traffic Source 標籤,用來把經 Portal 代理的請求和直連的請求分開。值得分兩件事想:未經核准的 shadow MCP server 是一種威脅,核准過卻繞開 Portal 直連是另一種。
最快的求值,是不求值
nixpkgs-multiverse 用單一 flake input 提供 Nixpkgs 歷來每個套件的每個版本,新加的 fast 模式乾脆整段跳過求值,直接從 cache 取預先算好的 store path,作者的說法就是「最快的求值是不發生的那一次」。機制是 mkFakeDerivation——把 Nix 的 string context 掛到 store path 上,做出不需要 .drv、也不需要求值的類 derivation 物件。截至發文,索引到的 271,187 個套件版本全部還活在 binary cache 裡,大約 14.8 TB,最早回溯到 2013 年。
無聊,才是它贏的理由
這篇的論點是 ActivityPub 之所以成為真的跑起來的聯邦協定,正因為它的核心刻意平凡:JSON 物件、HTTP GET 與 POST、URL、collection、actor 與 inbox/outbox,作者的結論是「無聊才做得出來」。分層同樣樸素——client-to-server 與 server-to-server 兩層,activity 就是主詞動詞受詞的句子,而 user@domain 這種帳號寫法其實來自 WebFinger 而非協定本身。代價寫在同一頁上:認證用的 HTTP Signatures 在 Fediverse 用的是過期草案而不是 RFC 9421,端對端加密沒有內建,「instance 就是信任邊界」。
兩邊都做對了,資料還是不見了
Depot 把 Registry 的三層 garbage collector 寫成 TLA+ 模型,TLC「探索 14,290,224 個相異狀態,約 21 分鐘,證明 10 個 safety invariant 與 2 個 liveness property」,順帶找出一個測試與 code review 都沒抓到的 race。GC 標記某個 blob 待刪的同時,客戶端重新上傳一份 byte-for-byte 相同的內容(同 digest、同 S3 key),交錯之後被刪掉的是剛提交的那一份——根因是 reference 在 MySQL、bytes 在 S3,兩個系統之間做不出 atomic transaction。修法是把 S3 bucket versioning 當成 delete fence:標記時記下 version ID,清理時只刪那一個版本。
把 session 從請求路徑上拿掉
MCP 2026-07-28 規格把協定從需要常駐 session 改成完全無狀態的 HTTP 設計,initialize/initialized 握手與 Mcp-Session-Id 標頭一起從請求路徑上消失,每個請求自己帶協定版本、client 身分與能力,「沒有協定 session 需要保存」。新增的 Mcp-Method 與 Mcp-Name 標頭讓 gateway 與 WAF 不必解 JSON body 就能路由與限流;原本依賴串流的 elicitation 換成 Multi-Round-Trip Requests,server 回 input_required,client 帶著收集到的輸入重試。授權那側改成有優先順序:先是預先註冊的 client,其次是給動態註冊用的 Client ID Metadata Documents,Dynamic Client Registration 退成 fallback,另外採用 RFC 9207 的 issuer 識別。