〈DigitalFoundry〉-EP-How Always-On AI Agents Work 24/7 | Space X engineer reveals in University

自稱在 SpaceX 做事的 Lee,走進一堂大學課,開口先報名字。投影片上有一句好玩的話:今天要講的,有些還在做,是他自稱在 SpaceX 正在做的。同學第一週已經做過一個很簡單的 Harness,核心就一句:模型在迴圈裡呼叫工具。那套東西很強,關筆電,程序就停了。他要講怎麼把同一個想法搬到伺服器上,做成 always-on、會自己醒、當機也能活下來的 Agent。

這種 Agent 有自己的電腦。不是你那台筆電,是雲端上一台 Linux,有桌面、檔案、瀏覽器,他說搞不好還有 3D 應用。它會把檔存進那台機器,慢慢弄懂你做到哪裡,累積跟你共事的 Memory。跟終端機裡那套「你傳一句、它回一句」的 Harness 不一樣,比較像同事:知道什麼時候該閉嘴,有時在背景自己幹活,有重要進展才回來吵你。叫醒它的也不只是你在終端機打字。Slack、email,或其他事件,都能把它叫醒去做事。他希望這種 always-on Agent 能做很長的活,不只幾小時、幾天,搞不好幾週、幾個月。那就要另一套架構。

開發者跟 AI 共事,走了四段

Lee 說頭一段是從 ChatGPT 把程式碼複製貼上,丟進自己慣用的編輯器。說起來像幾十年前的事,其實就幾年前。模型開始撐得住上一堂課講的那種簡化 Harness 之後,進了第二段:能改檔、能跑 shell、在終端機裡用很薄的介面做事。模型突然能自己往前做,也比較能替你幹活,這一段才真正跑起來。

第三段是把本來很陽春的 coding agent 做成專用 app。人開始平行跑很多個 Agent,有的丟上雲端,不只活在自己的機器上。瓶頸換成你自己:每一條指令都要看,每一條 shell 都想確認剛好,人一直待在迴路裡。模型、Harness、產品再往前走,才進到他說的新一段:always-on Agent 在背景自己跑。它有自己的電腦、自己的 Memory,在職學會新 skill,你去睡覺、去做別的,它還在幹。

以前多半是每天 prompt 一次 Agent,現在偶爾還這樣,但也可以把它設成背景自己跑。更早的節奏是 prompt、等、再 prompt、再等;它要跑 shell,你得准或擋。現在比較像在帶它:你跟它說去看這個 thread,話還沒說完又補一句,對了,那個星期四再做。上一代模型被你中途插話會亂。現在比較像跟朋友講話講到岔出去,它能把兩件事當成有關的,模型跟 Harness 都接得住。

你叫它寄 email、傳 Slack,外面還有一層安全檢查,很多公司叫 auto review:另請一顆 AI 去核每一條會被跑的指令。說來好笑,這比人盯幾百條 shell、一條一條按准還安全。他說若做盲測,多數時候模型核指令比人核得好。模型變強,介面反而更簡單。他們把這種 always-on Agent 叫做 bot。市面上這種產品一下子冒出很多,他也覺得好懂:誰都會傳訊,手機大家都熟,跟 AI 共事被收成跟朋友傳訊那種手感。它真的去幹活。問答還在,它要做的是你會丟給同事的那種長任務。

模型這一兩年解鎖的六件事

頭一件是這一兩年,模型跟長程指令的能力明顯變好,比較不會做到一半搞混、做錯。他點了六件,也說其實不只六件。壓縮跟 compaction 做對,模型可以蠻有把握地跑幾小時、甚至幾天。再來是模型能把活交給 helper,也就是 subagent。主模型手上那份工作記憶會滿,丟給一份全新工作記憶的 helper,等於變相拿到無限 context:耗 token、狂呼叫工具的活丟出去,做完回報主 Agent。

呼叫工具這件事本身也變了。幾年前模型幾乎叫不好工具,幻覺很多。他打趣說,現在很少人再把幻覺掛在嘴邊,因為多半被當成解決了。不只叫得好,你還能給它很猛的工具,像新人進團隊時會拿到的那些:shell、檔案之外,整台 Linux、做 demo 影片、在螢幕上像人一樣點來點去,也就是 computer use。沒對外開 API、也沒有 MCP server 的 SaaS 或網站,bot 可以靠 computer use 自己在背景用。

資訊可以整包丟進檔。模型後來要回想、要搜,其實很好做。你示範一次怎麼做,bot 也會收成 skill、Memory、routine,下次接著用。

檔這層,他用很簡的例子。你跟 bot 共事,底下會堆出一份使用者 profile,每一則 prompt 都帶著。你傳訊習慣全小寫,之後每則訊息就該長那樣。日子一久,也會堆出一份工作日誌,像同事每天在記自己幹了什麼,全寫進檔。模型自己決定要不要搜。你問「上週我做了什麼」,它就去翻。模型跑 Linux、用 shell 做 grep、在檔裡找東西,這件事已經很熟。

Skill 是把你做一件事的知識寫進 Markdown:步驟、你覺得怎樣算成、怎樣算砸。這不只是你自己的 skill。現在有一整個生態系,公司跟開發者在寫怎麼寄一封像樣的 email、怎麼做出像樣的 API。Grokbot 裡有一套 plugin:你要的工具裝上去,底下用 skill 或 server。還有 routine,熟 cron 的人一看就懂,就是排程去跑某段 prompt。他收成一句:everything is computer。

Always-on 的意思是能睡、能醒

他請同學把圖從左看到右。一開始伺服器在睡,Agent 能用的那台電腦也在睡。你傳訊,或某個 trigger 進來,Agent 才起來,把狀態載進伺服器。它若要用電腦、開瀏覽器、在桌面上點,再把那台電腦叫醒;用完可以再睡回去。這很要緊。讓那些電腦整天開著又貴,世上也沒那麼多機器給每個人隨時佔著,伺服器用量也吃不消。對話紀錄、Memory、routine,狀態都持久化進資料庫。

怎麼被叫醒?你直接 prompt 當然可以。他愈來愈有興趣的是背景裡還有東西在跑,自己決定什麼時候該找 bot。有人在 Slack ping 你,bot 可以住在 Slack。電話、會議,也可以把 bot 拉進去。他自稱這在 SpaceX 愈來愈常見:同事沒能進會,讓自己的 bot 進去做筆記,會後再帶回來,場面有點好笑。也可能是跑了幾小時、幾天的 routine 或背景工作,做完回來給你一份摘要。前面會有一個 router 做去重,再決定怎麼寫進對話。再下一層是啟發式:這件事要不要吵使用者。不是每件事都重要。同事每做一點進度就跑來跟你說「你看我又前進了」,會很煩。視任務而定,搞不好一天給一次狀態就夠。

Agent 那台電腦是 Linux box,跑在 Firecracker 虛擬機器上。好處是狀態很好做 snapshot,關機、再開都方便。機器上有檔,你也可以連進去看即時畫面,自己上手控。要跑 shell,也許你根本不想跑在自己筆電上,想丟進另一個鎖死、隔離的環境。它有 Chrome,能用瀏覽器。也可以做成虛擬桌面:你跑五個、十個 bot,每個都要自己的瀏覽器,就給它們不同螢幕。這些電腦是 bot 之間的共用基礎設施,用到再去叫。

圖的左邊是叫醒 Agent 的 trigger:各種 app、Slack、email。中間是伺服器。右邊是剛才那台電腦,跑檔、跑指令。指令進來先進佇列,再叫他投影片上那個紫色方塊,也就是 agent loop:上一週講過的,模型在迴圈裡呼叫工具。關掉時把狀態存進資料庫或儲存層。他覺得有意思的是,中間那一小塊,外面再疊抽象、接上好用的工具、連到各種服務,就能長成一個很強的產品。

Agent 跑在伺服器上,是運算裡很常見的薄客戶端、厚伺服器。這兩端這些年一直在盪。幾個實際理由:要推 Agent 程式碼更新,走 App Store 會很痛苦,伺服器可以一次推很多、很快。轉錄、生圖這類重計算,看裝置而定,多半伺服器比較快。流量跟成長不穩的時候,伺服器怎麼擴也有現成做法。他認為最關鍵的是:若把 agent loop 放進虛擬機器,虛擬機器就沒辦法跟 Agent 伺服器分開關。狀態要留在伺服器,虛擬機器隨時能重建。例如 VM 上要做一次緊急的 Linux 零時差更新,最好能重建機器,又不要把整個 agent loop 炸掉、讓應用停擺。

你按下送出之後,他說這段有點鑽進分散式系統,強一致跟最終一致那些題,有興趣再自己挖。客戶端要立刻認出這則訊息、回一聲收到。進到這一輪,工具跟模型在迴圈裡跑,邊跑邊寫進資料庫。客戶端跟各台伺服器訂閱,聽有沒有東西變了;收到訊號再去伺服器拉最新。中間還有去重,重試時不要在列表裡生出重複訊息。

底層有一個差別要分清:workflow 跟 job queue。佇列是一步一步往前,Agent 做複雜任務從第一步走到第三步,基礎設施出包、普通佇列當掉,重啟就得把一二三步重放一遍,這很麻煩。你要的是 durable workflow:失敗之後重試是安全的,從第三步接著做。分散式系統裡這題某種程度上算解過了。他們用開源的 Temporal,就不必從零重造這層很複雜的東西。基礎設施還是得自己跑。

新訊息進來,優先順序不一樣。你自己傳給 Agent、傳給 bot,跟群組、Slack thread、背景 routine 不是同一檔。你說「這場活動改期」,agent loop 該停,你的訊息壓過正在發生的一切。其他人的東西排到隊伍後面。Agent 短時間連收三四則,可以合成一輪,一次處理。啟發式你自己訂,然後一輪一輪往下走。

客戶端跟伺服器之間,只留 send to user

講到 Harness 本身,是在上週那套基本款上面加工具、加概念。Grokbot 的 Harness 跟市面上這類工具最大的差別,是薄客戶端、厚伺服器做成這樣:客戶端跟伺服器之間只留一個工具,叫做 send to user。架構因此很瘦。客戶端某種程度上只是在跟伺服器傳訊,重的工具都放伺服器:跑 shell、讀檔、叫雲端 Agent、錄螢幕、做 demo。

這套後來還算堪用。不論你在哪裡開新客戶端,手機 app、伺服器、桌面、email、Slack,來回都是這一個工具。客戶端雖然只握這一個,收到之後可以決定怎麼用豐富、可互動的方式呈現。伺服器回來說使用者正在登入,客戶端可以跳出專門的登入表單,接到 One Password 這種工具。要付錢,可以叫 Stripe、Link,或用 X Money。做了就收不回的事,寄 email、傳 Slack,可能先把草稿丟回來讓你改、讓你准。有時你連回一則訊息都不必,留一個 emoji 反應就夠。

任何模型都有 context window,也就是它的工作記憶,token 有上限。把所有工具硬塞進去,空間很快沒了。工具進來時帶著名字、schema、一堆細節。Google Drive、Gmail、YouTube 連接器這類吃 MCP server 的服務一裝,圖上方那一排方塊很快就被填滿,模型做對話的空間被吃掉。

現在流行的 Harness 有一招 context 工程,有人叫 dynamic context,也有人叫 tool search tool:每一則送給模型的訊息,只放工具名字。模型真的要用,再去檔裡讀細節。這套東西一路到底都是檔、都是檔案系統。省 context,也省成本、省用量。

原則是先走最便宜、最穩的,不行再往上。最容易的是 bot 從對話歷史裡已經知道的。眼前 context 沒有,再找 plugin、MCP server、API,例如從 Plaid 拉銀行資訊。再不行就上網搜,昨天 Cubs 比分多少。還不夠,才去開那台電腦的瀏覽器搜。再不夠,才用整張桌面,在那台 Linux 上跑腳本、跑指令、把東西做出來。這些都失敗,才回頭吵使用者,請人補資訊或按准。這才比較像跟同事共事:理想上對方會先自己試過一堆路。

那台 Linux 取資訊,也不只截圖一條路。截圖可以,但比較貴。可以看頁面 HTML,也可以看 accessibility tree,token 少很多,按鈕、連結、要點的元素比較好找。這些都不行,再去點像素。有些網站會跳 modal、對話框,Agent 得點得到。這條梯子最差的一格,還是回到使用者:兩步驟驗證碼、captcha 這類。

主 Agent 要瘦,cache 斷了就是 bug

主 Agent 在這套裡比較像 orchestrator。對話要盡量瘦,因為它現在能叫一堆 helper,helper 就是 subagent。耗 shell、燒一堆貴的 tool call 的活丟出去,只把答案或結果帶回來,主對話不會被撐爆。產品用起來才會有無限 context 的感覺。無限 context 當然不是真的,每顆模型都有上限。有了這些技巧跟繞路,再加上把模型往這方向練,你比較不會覺得撞上 context 牆,做愈久品質也不至於掉。

每個 helper 帶不同 skill,每個都是自己的 durable workflow。回到佇列跟 workflow 的差別:做影片的 helper 當掉、記憶體吃太兇,可以重啟接著做,進度還在。主 Agent 則像同事在管待辦:你可以去看它、傳訊給它、把 helper 停掉。這套是照著理想中怎麼擴一隊工程師、去啃很複雜的題,那樣建模的。

他們做的時候還踩過一些小細節。回合進行中,最好不要加工具、也不要拿掉工具。工具描述或 schema 寫太長,context 被吃,價錢跟用量都差,工程上有很多地方可以剪。也有人說 Harness 只要一個工具,就是跑 shell,很多事確實能這樣建模。可是你若看到模型九成時間都在為同一件事跑 shell,做成專用工具反而比較省,人要審查產品怎麼跑,也比較看得懂。還有一件他覺得好笑:寫給人看的錯誤訊息,寫清楚「哪裡失敗、點這個連結、下一步做什麼」,對 Agent 一樣有用。幫 Agent 設計錯誤訊息,也是一種 DX。

把 bot 丟去跑很長的活,你得信它會把資訊看好、操作也安全。就算它在另一台機器上,不會弄髒你的電腦,你還是希望每條 shell 先經過一顆模型核過,也就是 auto review。信箱裡一封釣魚信、一個 webhook,這種不信任的輸入,不能當成使用者指令塞給模型。業界在 prompt injection 這塊還有很多活要做。寄信這種做了就收不回的事,要先問使用者。產品也可以做成工作流,讓密碼之類的東西根本不進模型對話。

Context 工程他也叫 Harness 工程,覺得幾乎是同一件事,只是名字跟著時間變。核心是少用 context,效率好、成本低。Prompt caching 是其中一個理由。跟 coding agent 或任何 Agent 共事,用掉的 token 理想上大多該是 cached。你把整段對話送進去,多一則訊息,等於整段再送一次。Cached token 折扣很大,要讓它們在 cache 窗裡待愈久愈好。做法是讓工具定義、system prompt 這些,在多次呼叫之間盡量靜止,才不會把 cache 弄斷、每次都付未快取的價錢。上面那截固定,最底下只有最新訊息,未快取要另外付錢的就只在那一小段。

這後面還有一整門手藝。主 Agent 理想上是你跟它進行非常非常長的對話,中間會 compaction、壓縮,把 context 摘要很多次,你有時根本沒察覺。所以那份 context 更該瘦。輸出太長,別整段塞進 context,丟進檔就好,Agent 讀檔很行,跟讀 skill、讀 Memory 是同一件事。截圖或很貴的活,丟給 helper,別動到主 Agent 的 context。理想狀況下,你還要一直修剪對話、把不必留的拿掉,為了成本,也為了回想跟表現。Cache miss 在他看來幾乎就是系統 bug。

他回溯到今年一月:OpenAI 正紅,人開始在模型商的訂閱方案裡這樣用,供應商幾乎沒見過這種用量型態,Harness 也還沒為這種 workflow 調過,cache miss 一堆。Agent 還整天在跑,問題更大。後來補了很多修補,才把 prompt cache 撐住。一個他覺得有趣的招,是讓 prompt 裡每段都維持固定順序。就算你要上新的 system prompt、加新工具,也可以把每一段 hash 起來,順序鎖死。A/B 測試要插一段新 prompt,千萬別把其他人的順序弄亂,否則 cache 一次爆掉。另一招:你打開聊天開始打字,伺服器可以提早把 prompt 備好,把 cache 烤熱,有點像網頁上滑到連結就預抓下一頁。這種小工程優化堆起來,模型能跑多遠、長時間用起來有多聰明,差很多。

跑很長,就得把 compaction、摘要練好。假設模型有 20 萬 token 的 context window,一路做下去,總會碰到要摘要的點。壓縮都是有損的,你得找一套演算法,重要細節不要弄丟。他說這題難到夠寫好幾篇博士論文。例子是你跟 bot 來回已經超過 10 萬 token,接著去做別的。模型商有一段 cache 還熱的窗,可能十分鐘,可能六十分鐘。他們的招是:還在熱窗裡,就先做 compaction,這時長對話比較便宜。使用者三十分鐘後回來,是從這份摘要接著加訊息,後面也便宜。摘要品質本身還有很多工要做。

Compaction 之後,哪些進 Agent 的 Memory,他分成幾層。一層是每次都該在的使用者事實。回到前面那個例子:這個人要全小寫,每一則都得帶著,否則突然冒出大寫會很怪,有點像他說的 full Sam Altman style。還有一些 prompt、一些事實,你要用演算法判斷哪些最該留。理想上這層有垃圾回收。他拿人腦比:此刻這件事重要,你大概不會同時想著一場足球賽,腦子很會把現在相關的留在 context,別的以後再記。Harness 試著學一點:有核心事實,有帶日期的舊對話日誌,還有現在這三十、六十分鐘用的草稿筆記,設計成會過期。其餘的都能從檔找回來。模型很會跑指令,要查就去查。

今天的模型,當成有史以來最差的一版

產品抓到的錯要變成 eval,修完再拿去練下一顆模型。他用飛輪形容訓練跟產品怎麼互餵。先用很高的層次回顧 LLM 怎麼練。Pre-training 讓模型從大量網路文字或其他私有資料建立對世界的大概理解。接著是 supervised fine-tuning,教它怎麼表現,當聊天助理或當 Agent。再來是 reinforcement learning,有點像教模型玩遊戲、再把遊戲玩好。對 always-on Agent 來說,SFT 裡讓模型看過 Harness 的例子、知道在 Harness 裡怎麼做事、手上有哪些工具,很有用。RL 則把指令跟隨練好,幾百個 skill 裡該叫哪一個、給它瀏覽器時該點哪,都在這裡練。訓練之外還有怎麼做 inference。你正在對話的主 Agent,延遲要低,回得要快,Harness 跟 inference 可以往這調。活丟給 helper、要它做很久的時候,十分鐘跟十二分鐘幾乎沒差,兩邊的優化就不一樣。

飛輪這樣轉:Agent 做錯了,理想上變成一則 evaluation,例如它不該叫這個工具,卻叫了。後端去修 Harness、修 bug、修 prompt,也許是 inference 的問題。用 eval 確認真的修到,再送出去。做這類產品的團隊幾乎每天都在抓 bug、修、用 eval 量,這是內迴路,一直在變好。外迴路是每過幾個月、或每個月,去練新模型。新模型最好從這些 bug 跟失敗裡學,在你在意的 eval 上往上爬,再把新版本丟進產品。新模型帶來能力跳升,產品用法也跟著變。例如 bot 進群組聊天,訓練資料其實還不多,這件事正在冒出來,而且得做對。他點了 Malbook,以及 Hugging Face 那次事件,說走錯會很難看。得把模型練成在多 Agent 系統裡,不同 bot 互相講話時還能表現得體。做 Harness 的產品團隊,內迴路、外迴路最好一直轉。

Lee 說他們在 Cursor、現在 Anysphere 有一條原則:刪掉產品。意思是你得內化一個假設:今天的模型是它們有史以來最差的一版。六個月後,你可能得整套 UI 重做。他今天講的多數內容,若六個月前講、甚至一年前講,會是一次很大的更新,因為 Harness 跟 context 工程已經多了很多實務做法。策略是盡量為下一世代模型而做:能少做就少做,介面愈簡單愈好,讓模型替你想、替你動手。

他覺得未來六到十二個月有幾件事算還穩的賭注。現在你的 Agent、你的 bot,可能跑幾小時,難一點的活跑一天。很快就有可能跑到幾週、幾個月。怎麼訓練、怎麼評測這種模型,會冒出新問題。模型回想舊對話的能力也會愈來愈好,演算法跟底層資料怎麼表示,研究很多,可能是圖、可能是檔、可能是別的。理想中這是數位同事,你把帶真人進團隊時會給的工具全給它。他覺得組織才剛開始習慣這件事。介面大概還會更簡單。有人會比較想用 speech to speech 跟 bot、跟 Agent 講話,搞不好還有一顆 Jony Ive 做的裝置,整天對著它講。模型跟產品會更會在職學會 skill,再寫進檔、寫成指示。人跟公司也會更會把那些很客製、只有自己懂的流程寫下來,讓 Agent 讀得懂。

他丟了幾題給同學當研究題。Agent 要跑一個月,模型卻每個月出一版,你要怎麼評測它真的表現如預期?要嘛做出更好的 eval,要嘛不要出得那麼快。他認為業界未來六個月得把這題想清楚。Memory 的演算法還有很多工。安全那側也是:怎麼做安全的 Harness、Agent 周圍的基礎設施怎麼鎖,才不會被壞人接管。Agent 何時該安靜、何時該吵你,啟發式他覺得還沒做好。分寸卡在主動跟煩人中間:它發現你昨天沒去上課,它在場錄了、做了筆記,這可能很有用,也可能很煩。明年這個時候,世上流動的 token 會明顯多很多,把 inference、模型、Harness 調得更省 token,會愈來愈重要。

他記得 OpenRouter 的 Alex 在 X 上講過一則。有人嫌現在每個 app 都長一樣,側欄、Agent、聊天框,大家都在做同一件事。Alex 的回應是:那不就像 2005 年,每個人都在做同一件事,有伺服器、有資料庫、有一套能增刪改查的 CRUD 介面。現實是這已經變成新常態。每個新產品都得有 agentic 的一面,要嘛自己接進去,要嘛變成另一個 Agent 可吃的 headless 資料。他們今天談過的那些,他當成新的積木:durable workflow、sandbox、雲端上的電腦、Memory、skill、接其他服務、語音、支付、身分、eval、observability。他說每一格大概都是好幾十億美元的創投,搞不好是兆,每一格後面大概有二十家新創。下一代公司、下一代產品的新原語,都得接進 Harness。

同學是工程師,想的是怎麼寫軟體。系統設計跟程式架構比以往更要緊,那裡做的決定會一路放大。Lee 自己仍主張看 code,自己寫的還是會看。有人已經不看了。他覺得看仍有用,尤其是搞懂你正在送出去的架構。才幾年,這件事變超多。上週同學已經在玩自己的 Harness,他鼓勵把今天講的套回去,試做一個自己的版本。他記得 GitHub 上大概有個 open Grokbot,有人把他們的程式碼 slop fork 出一個版本,你可以自己架 GUI、找個 sandbox、找台 VM。想搞懂這些零件怎麼接,那條路走得通。他另外勸人不要避開 LLM 怎麼運作。課堂上只給了訓練過程的精簡版,不必真的鑽進機器學習或科學那一層,仍有很多能懂。就像做網頁應用,懂一點資料庫會比較好做。產品跟 Harness 層愈來愈多決定被模型本身牽著走。對這件事有直覺,不論你在哪個位置,都會比較站得住。

記憶外掛把舊對話切成片段、靠相似度塞回 prompt,留得住的是有人在維護的文件

https://liao.gg/blog/agents-dont-need-memory

2026 年 10 月 3 日,Kevin Liao 在 liao.gg 寫記憶外掛實際在做的事。外掛分析人的對話,產生一千則彼此孤立的片段,塞進向量資料庫。人每下一則 prompt,它從庫裡拿出最相似的五則,附在 prompt 上。Agent 搞混了,就自己再搜,多拿幾則。他在括號裡補了一句:它本來就會搞混。他們把這個產品叫做記憶。

他沒有點名是哪一家。一千則、最相似的五則,還有文裡後來寫到的五百則、一萬筆、一千萬 token、三年,都是他描述這套做法時用的數字。

先看人要解決的是什麼,這套產品對不上。人要 Agent 懂這份專案。功能在哪裡,是它落在這份程式的哪個位置。為什麼做,是當初的理由。同意過什麼,是已經定下來的做法。在乎什麼,是人在意的事。人打下 prompt,要的是 Agent 照這些往下做。外掛交出來的卻是一場 RAG 抽獎:附上哪幾則由相似度決定,人只能盼有用的自己浮上來。

就算這次浮上來的剛好有用,Agent 手上仍是幾則從舊對話切出來的片段。他認為這不等於懂專案。整個記憶外掛的生態系解錯了問題。Agent 要的是文件。

他看到的每套,都是切片段、進庫、抽五則

他說市面上每一套記憶外掛都是同一條路。先掃一次次工作留下的對話逐字稿。再從逐字稿切出他們稱為記憶的片段。片段放進 RAG 用的資料庫。之後每一次 prompt,都取出最相似的五則,塞回這則 prompt。五則不夠用,就給 Agent 一個工具,讓它自己進庫裡再搜。

人沒有在 prompt 裡指定那五則。外掛按相似度自己附上,連同 prompt 一起送進模型。Agent 搞混了,再用工具多拿,多拿的仍是同一座庫裡的片段。他說架構就這些。

花俏加在這五步後面。有的讓 Agent 把舊逐字稿逐字搜過,一個字一個字對。有的把記憶分成短期和長期。有的在背景跑程式,做檢查、做合併,或把重複的去掉。有一種叫做 Dreamers 的,人沒在下 prompt 的時候,由它過夜把已經存進庫的記憶重寫一遍。也有人一直把上下文壓短。也有人再重排一次。這一類他沒有全部列完。

逐字搜、分層、過夜重寫、壓短、再重排,拿回來的都還是過去的對話。加料會燒 token。他認為這些功能是在補同一套、底下已經有問題的架構。所以他的判斷是,沒有一套因此就靠得住。

片段靠相似度浮出來,人稽核不了這座庫

這些外掛碰到的是同一類問題。他點了五個,還說問題不止這五個。每一套都試著修,也都沒修好。前提是同一個。

相似度只排兩段有多近。文字變成向量,距離近的排前面。近是這張排序唯一在答的事。哪一則是對的,哪一則現在還算數,哪一件該知道的事根本沒進庫,它都不答。人每次 prompt 拿到的就是這五則最像的。像,推不出該信哪一則。

片段存下來的時候,上下文不在裡面。一則 RAG 片段裝得下的字就那麼多,裝不下的留在外面。他點了留在外面的:當時的脈絡,做這件事的動機,學到的教訓,周圍的環境,還有更多。動機是當初為什麼定成這樣。教訓是上次哪裡出過事。環境是當時的程式和限制。這些被切掉之後,Agent 讀到的是一句能被搜到的舊話。

召回把過去當成現在還成立。搜逐字稿是把舊對話再找出來。搜向量庫也是。找出來的是當時說過的話。程式碼不會停在那天。他寫,程式碼每天都在改。改過之後,片段還停在改之前的那次對話。他問:身分驗證若有五百則片段,每一則現在還有多準。

搜尋工具也補不上另一個洞。工具可以交給 Agent。交出去之後,他問的是:Agent 怎麼知道現在該用。要知道該用,得先知道自己缺了一塊。Agent 不知道自己不知道的事。缺的那塊沒被它當成缺,搜尋就不會發生。庫裡就算有,也不會自己冒出來。

庫本身稽核不了。這裡的稽核,是人要能查庫裡到底有什麼。他寫,那裡有一萬筆 embedding,放在 SQLite。哪些記憶在?哪些過期了?哪些放進去之後從來沒被取回過?哪些是錯的,卻在暗中影響 Agent 怎麼做事?這四問要有人答得出來,庫才算查得了。他認為這座庫答不出。錯的那幾則人還沒看見,仍可能在下一次 prompt 裡被附上去。

人留知識是寫下來再用

他把這個生態系的前提這樣講。Agent 會忘。所以要修的是記得。要記得更好,就抓更多進來,把索引做更好,取回的時候更聰明。抓更多,庫裡的片段就更多。索引做更好,相近的就更好被撈到。取回更聰明,五則之外還可以再搜、再挑一次。三步處理的都是舊對話。

別人留知識,靠的是寫下來的紀錄。沒有人會把三年前的團隊會議再看一遍,只為了記起某個功能的限制當初怎麼定。會議當時怎麼講,人把它寫成紀錄。之後要查,人翻的是那份紀錄。限制若只活在三年前的對話裡,就得把整場再看一次才找得到。

解法不是給 Agent 一個搜尋工具,讓它到價值一千萬 token 的舊對話裡翻,把發生過的事用碎片重組起來。重組出來的仍是對話碎片。他寫的解法,是用文件當記憶。

現在這件事更急。很多人用 AI,以很快的速度灌出產品、功能,還有 slop。一行程式都不讀,也不懂。東西可以在沒人讀過程式的情況下交出去。文件就很容易被排到後面,變成事後才想起來補。他認為這時候文件該比以前更要緊。人不讀程式,功能為什麼存在、同意過什麼、人在乎什麼,Agent 還讀得到的,就是有人寫下來、並且還在維護的那些檔。

一份 AGENTS.md 留不住整份專案

人早就知道 Agent 需要脈絡,所以才有 AGENTS.md。這個檔讓 Agent 不要瞎進一份程式碼庫。他說這有用。常常,有用的結果是:整份專案的文件就這一個檔。

一個檔不夠。審查怎麼走、跟使用者討論過的規格、查過的函式庫、做過的決策、給 Agent 找檔用的索引,他要分開放,不要擠在同一份 AGENTS.md。他要一整個工作區,自己稱為 brain。brain 指的是一組有結構的檔,Agent 不必等人先開口,也可以把東西寫進去。裡面放指示、規格、決策、研究、索引,該留的都能留。

指示寫事情怎麼做。程式碼審查怎麼走,放在固定的檔。規格寫跟使用者討論過的內容。研究寫專案原本不熟的東西,一套陌生的函式庫,或一支 API。查過的結果留成檔,下次還能再用。

開工前,Agent 去這個工作區讀相關的檔。他要的脈絡是相關的,也是完整的。完整是指做法、決定、研究還在檔裡,Agent 讀到的是整份紀錄。做完才更新。他把更新的時間卡在這輪:事情剛做完,整張圖還在這輪的上下文裡。過期的檔在這時候改,缺的地方補上新文件。這輪一旦結束,那張圖就不在上下文裡了,過期的檔就不會自己改掉。

舊迴圈是下了 prompt 就做,做完這輪就忘。他要的迴圈是下了 prompt 先查文件,查出相關的檔再做,做完把文件更新。下一輪進來的 Agent 沒有上一輪的對話。它查到的,是上一輪改過的那些檔。

以前的記法,是在 Agent 旁邊再掛一座 RAG 資料庫,每次 prompt 從那座庫抽片段。他要把記憶放進這個工作區。人讀得了,改得了,也可以把檔分享出去。Agent 要懂的那四件事,寫在有人繼續維護的檔裡。下一輪要懂專案,讀的也是這些檔。

一年多前,他叫 Agent 寫進 internal

他說這個問題自己一年多前就看到了。那時他才開始用 AI 寫程式,要的是 Agent 換一個工作階段之後,還記得上一輪做過的工作。上一輪若只留在對話裡,新的一輪就接不到。他建了一個 internal/ 資料夾,叫 Agent 把規格、計畫、索引寫成檔,放在這個資料夾裡。規矩一起寫上:動手之前先讀該讀的文件和索引,做完一定更新。索引讓它知道該讀哪幾份。

那幾條一開始很粗,就是交代 Agent 的話。慢慢地,粗的指示變成一套正式做法,再變成外掛,叫做 Operator Memory。他說自己各個專案現在都固定在用。這一節是他自述這套做法怎麼長出來的:先是資料夾,後來才是這個外掛的名字。

Operator Memory 照他的說法,就是用文件當記憶。它給 Agent 一份 Markdown 工作區,留的是指示、規格、研究、索引。每次開工前一定先查,查的是跟這次工作有關的文件,查完才做。做完一定再更新這份工作區:過期的重新看過,缺了檔的地方補上。兩步中間才是做事。

他不用的東西寫得很具體。沒有向量資料庫。沒有 embedding。背景沒有做摘要的程式,沒有整理記憶的,沒有專門負責更新記憶的,沒有 Dreamers,也沒有其他會燒 token 的背景程式。沒有黑箱取回。黑箱取回指的是:命中了哪一則、為什麼命中,人看不見。他這裡要看記憶,就打開那些 Markdown,字在檔裡。

前面那座庫,他寫過一萬筆 embedding 放在 SQLite,人問不出哪些過期、哪些從未被取回、哪些是錯的。到了這套,記憶是檔。檔在不在,打開就知道。內容舊了,人看得到字。稽核做的是讀檔、改檔。

在他這套裡,每樣東西都是普通的 Markdown。人可以讀,可以改,可以 commit 進版控,也可以跟團隊分享同一份。他說這套自己用超過一年。想試的人,他說是免費、開源的。連結是他給的:https://github.com/aerovato/operator-memory

缺陷抓得再快,code review 還是得有人問這筆改動該不該存在

https://www.adaptivecapacitylabs.com/2026/08/24/there-is-more-to-code-review-than-automatable-detection/

2026 年 8 月 24 日,John Allspaw 在 Adaptive Capacity Labs 的網站上寫了一篇,整段引用了一篇論文的摘要。論文標題是 The End of Code Review: Coding Agents Supersede Human Inspection,6 月 11 日以第一版掛上 arXiv(2606.13175),作者是瑞典皇家理工學院 KTH 的 Martin Monperrus。Allspaw 連結這篇、行文稱「這篇文章」「作者」「這篇論文」。Monperrus 這個名字在他連結的論文頁上。

摘要把 code review 寫成軟體開發的主要品質關卡:從 Fagan 1976 年把 code inspection 形式化算起,五十年來、各種規模的組織,合併前由人看過同事的改動。Coding agent 在摘要裡是以大型語言模型為底、能讀、能寫、能測、能修軟體的自主系統。論文主張,agent 已經跨過一道能力門檻,傳統的人類 code review 不再是品質管線裡必要的一環。撐住這句的是兩個主張。Code review 講出來的每個目標,agent 都能以更低成本、更高吞吐做到。Agent 寫 code、人仍當強制審查者,這種接法是死胡同:給不出有意義的保證,也無法跟著 AI 輔助的吞吐擴張。

Allspaw 認為文章結構清楚,不常讀論文的工程師也看得懂。論證站在一個他稱為 substitution myth 的框架上。這個框架先把人的貢獻拆成幾項可度量的功能,再證明機器每項都做得到,然後宣布人可以換掉。

Monperrus 這篇自己寫明是立場論文,綜合既有的能力證據,沒有另做一篇新的實證。它把 peer code review 拆成四項功能:抓缺陷(defect detection)、風格與慣例的檢查(style enforcement)、知識傳遞(knowledge transfer)、讓相關的人知道發生了什麼改動(awareness)。論文把這四項跟 Bacchelli 與 Bird 對實地審查的整理對在一起,接著主張 agent 每一項都做得到,於是有能力換掉人類 reviewer。論文引言把這句說得更直:傳統的人類 code review 已經多餘,品質管線應改由 agent 做驗證。引言裡還有一句 Allspaw 沒有拿來當靶子的話:對常規改動,強制人審的成本效益已經翻轉。他的文章沒有引用那些能力數字。他抓的是拆法。拆完之後,每一項都被當成機器可以單獨做完、也量得出來的功能。他認為審查裡要緊的事,常常拆不成這種可勾選的功能。Allspaw 把爭點放在這個推論:做得到每一項,就換得掉 reviewer。推論要成立,審查必須等於四項的加總。他認為不等於。缺的判斷也拆不成清單上的下一項。

說一句看不懂,就是這次審查的發現

有經驗的工程師讀完一份 diff,說 “I don’t understand this.” Allspaw 寫,這句困惑就是發現。它可能是 code 太複雜,可能是抽象不對,也可能是意圖沒講清楚。三種讀法都落在這筆改動上:一個夠格的人讀不下去。

大型語言模型處理得了這份 code,也能寫出一段看起來通順的說明。處理得了,跟給得出另一種訊號,是兩件事。後者是一個夠格的人正當地看不懂。模型這邊的「看懂」是把內容處理完。人這邊的看不懂是一種阻力,阻力本身帶資訊。論文把可理解性放在比較靠近風格的那一側。可理解性不是風格問題,是人試著讀懂這份產物時才出現的性質:人卡住或跟上,發生在這次互動裡。風格檢查多勾一格,替代不了有人在讀、而且讀不下去。

看不懂一旦被收進風格,它就不再被當成這筆改動的發現。Allspaw 把方向倒過來。合法的人類不解,是審查該留下的訊號。模型的處理能力蓋不住它,因為那個訊號要有一個會不解的人,才出得來。

對不對之前,先問這筆該不該存在

審查裡會出現這樣的句子。「這應該拆成兩個 PR 嗎?」「這解的是症狀,不是問題。」問的是意圖、範圍、這筆改動適不適當。這些都排在「code 正不正確」前面。範圍問的是這份 diff 是不是把兩件決策綁在一起。症狀問的是,眼前這個修法過了,原來的問題還在不在。兩問都還在爭這筆改動該以什麼形態存在,甚至該不該存在。

論文的框架假設送審的改動是必要的,也假設審查主要在做驗證。碰過正式環境(production)的人知道,code review 常常是最後一次、有時是唯一一次,還能期待有人出聲問:這筆到底該不該改。

審查若把改動當成既成事實,剩下的座位只夠找錯、對風格、對測試。必要性沒有座位。Agent 可以很會驗證一份已經決定要進的 diff。驗證問的是:照眼前這份改動,實作有沒有偏。必要性問的是:這筆值不值得合併。第二問不在那四項功能裡。四項都做完,第二問仍然可以沒被問過。

論文摘要把「agent 寫、人仍每一筆必看」稱為死胡同。論文正文接著寫得更具體:agent 生出 code 之後,人審常常變成橡皮圖章;人的產能跟不上 AI 的吞吐,審查佇列變成卡住管線的地方。Allspaw 引用的摘要裡已經有死胡同這個判斷。他沒有因此同意人審可以從管線拿掉。他指出框架先把改動當成必要,把審查收成驗證。人還坐在審查席上,被分到的工作只剩對不對。該不該存在,不在問題裡。

該在卻不在,diff 不會自己標出來

人可以注意到一件事:API 契約改了,錯誤處理沒改。缺的那一塊不會以新增行的樣子出現在 diff 裡。審查者心裡有一份「按這個改動,這裡應該有東西」的預期,然後發現預期落空。Allspaw 把這個能力寫成:認得出預期該在、實際上不在。

論文沒有談這個。他認為特別該談,因為看不見缺席(absence blindness)正是大型語言模型常常很弱的一類失敗。Agent 審在場的內容。有這塊經驗的工程師,很容易看見不在場的內容。

四項功能裡的「抓缺陷」,預設缺陷是看得到的偏差:寫錯的邏輯、不合風格的寫法、不該出現的資安問題。缺席常常沒有偏差可標,因為那一行沒被寫出來。清單對著在場的行比對,缺的那一塊不會被任何一項功能報出來。審查若被定義成偵測在場的問題,這一類從定義裡就消失了。Agent 把四項都做完,做完的報告仍然可以對一份少了錯誤處理的改動給過。

預期從哪裡來,他沒有另寫一份清單。契約一改,呼叫端通常還要處理新的失敗,這是熟悉這塊的人帶進來的。Agent 比對已經寫出來的行。人多比對一層:這種改動通常還會帶上、這次卻沒有的東西。

誰寫的,會改你盯多緊

Peer review 的人帶著一種校準過的注意力(calibrated attention):依過去跟作者共事的經驗,決定這次盯多緊。作者常常就是同事。資歷較淺的工程師第一次提交進支付模組,得到的注意力,跟一位資深、他稱為 grey beard 的工程師做例行重構,不會一樣。審查者把當下的誰、改什麼、什麼時候、在哪裡,對上自己知道風險落在哪。支付模組本身危險。第一次交這塊的人,危險再加一層,因為審查者還沒有這個人在這塊上的紀錄。老手的例行重構仍要看,盯的密度來自另一種經驗:這個人過去怎麼處理類似的改動。

論文把 diff 當成等價輸入。同一套檢查、同一種簽法、同一種說明。自動檢查這樣做說得通,測試不關心這是誰的第一次。人審若也把輸入等價化,資淺者第一次動錢流,跟老手改自己寫過很多遍的模組,會走同一種盯法。風險感是校準過的;把 diff 當等價輸入,給不出「這個人過去交過什麼」這層經驗。

摘要替代不了兩邊一起把理解做出來

論文把知識傳遞收成資訊投遞,agent 產生解釋就好。Allspaw 寫,code review 裡的討論是一種共同的認知活動(joint cognitive activity)。審查的人學到作者怎麼下手。作者從審查者的問題裡,學到自己沒講清楚的地方。討論結束時有一份共同理解,開始之前兩邊都沒有。那份理解要等討論發生才有。摘要若在對話之前產生,手上只有對話還沒發生的那一側。

他用 coactive 叫這種工作:兩邊一起做。單向傳送是作者把已知的東西交出去,接收端收下。審查裡常發生的是兩邊都還不知道最終那份理解長什麼樣。審查者的問題可以逼出意圖,作者的回答可以改掉審查者原本的讀法,兩邊的心智模型都動了。Agent 的摘要可以寫得很完整,這個過程還沒開始。

「讓別人知道」(awareness)在四項功能裡是單獨的一項,論文認為 agent 同樣做得到。Allspaw 沒有另開一節駁它。他寫到的「知道」,出現在版本庫外面的脈絡裡。那份知道常常不在這份 diff 裡,一份說明也投遞不完。

版本庫外面的一句話,會改這筆 diff 怎麼讀

審查時會出現 diff 裡沒有的句子。「這個服務上星期二剛出過事。」「下游那個消費端的團隊,快要把這個介面廢掉。」「法務跟我們說,這個欄位不要再寫進 log。」

這些是審查者帶在身上的話。上星期二的事故改的是風險背景,同一筆改動跟平常那天不一樣。下游即將廢掉的介面,改的是這筆還值不值得做。法務那句話,改的是某一行 log 還准不准留。三句都碰到「code 正不正確」以外的判斷。

人掌握的脈絡比自己意識到的多,真的碰上時又認得出來。組織現在什麼狀態、最近發生過什麼、測試和文件和版本控制都沒寫下的非正式約定,都會影響眼下這筆 code 該怎麼看。這種事常見到幾乎隱形。論文假設 codebase(這份程式碼庫)就是完整脈絡。Allspaw 寫:從來不是。

審查當下把這些句子跟這份 diff 接上的,是已經知道這些事、又被要求對這筆改動負責的人。程式碼庫再齊,也只齊到有人把它寫進去的程度。沒寫進去的那部分,會改這筆怎麼判。

簽名會痛,審查的方式才會不一樣

論文把人的責任當成合規物件:為了法律或其他規則,需要一個具名的人(named human)。Allspaw 認為這樣不夠。你知道自己個人要為核准這筆改動負責,審查就會被這個事實塑形。他稱為 skin in the game。Agent 在 pull request 上簽過,不承擔後果,也沒有一種激勵結構逼它認真估這一筆。

論文的討論有把倫理放進來。落到的建議是:倫理審視放在需求工程(requirements engineering)和上線後的監控(post-deployment monitoring);強制的 PR 審查不承載這件事。Agent 審查像其他自動檢查一樣被治理,不確定或高風險再升級給人。Allspaw 把這個轉向稱為 hand-waving,是把眼下的問題往後踢。

論文建議的調整是:多數 commit 由 agent 做有結構的簽核;人的核准留給高風險改動、新的架構,以及法規要求具名負責的路徑。這份分級看的是改動種類。Allspaw 寫的那種注意力,看的是誰交的。論文在拆功能時把 diff 當成等價輸入;後面的分級把高風險挑出來給人,沒有把「這個人過去交過什麼」放回每一筆的盯法裡。

他沒有逐條拆這份建議。他抓的是責任被當成表格上的名字之後的後果。名字在表格上,不會改變人怎麼讀 diff。會改變讀法的,是這筆如果出事,算在簽名的那個人身上。沒有後果的簽核,沒有這個壓力。

課責若只剩合規物件上的具名,或只出現在受規管路徑,日常合併上別人期待的那種社會課責就蓋不住。

四項各做一遍,跨在中間的那層從第一步就沒了

Allspaw 對這篇文章最根本的異議,是它把 code review 主體放在偵測上:找缺陷、找風格違規、找資安問題,然後假設偵測得更快、更便宜,一律更好。

Code review 同時是協調、意義建構(sensemaking)、治理(governance)。協調是相關的人要不要在這筆改動上對齊。意義建構是把 diff 讀成:在現在這個組織裡,這筆到底在做什麼。治理是誰有權放行,放了之後誰承擔。三件事發生在同一次閱讀裡。人可以看不懂這筆抽象,看見錯誤處理沒跟著契約走,想起上星期二的事故和法務那句話,也知道這是誰第一次動支付、核准算在自己頭上。這些判斷會互相改寫。拆開成交接的四份產出之後,那個互相改寫的動作不在任何一份裡。

Substitution myth 在他筆下常走同一條路。先把人的貢獻拆成可度量的功能。再證明機器能用它自己的可度量功能,把這些貢獻複製出來。然後宣布人多餘。這條路常常在同一個點垮掉。真正要緊的貢獻,是跨功能怎麼接在一起。人能對沒有事先計畫的情境和脈絡改自己的做法,並且承擔別人期待的那種社會課責。

沒有事先計畫,指的是審查進行到一半,輸入變了。上星期二的事故不會出現在四項功能的定義裡,它出現在審查者打開 diff 的那一天。人改的是自己怎麼看這筆,功能清單還是原來那四項。簽名會痛也不會變成第五項可勾的功能,它改變的是前四項要看得多認真。臨時的法務約束同樣不在清單上。拆解的第一步沒有把這些算進去。要緊的是跨功能怎麼接在一起,不是把人的貢獻再拆細一點;他認為原文也沒有把這層算進去。

讓 agent 寫 code 的團隊若照這個分法排管線,找缺陷、對風格、掃資安可以留在自動檢查裡。人留在合併前那個要不要放行的決定上:這筆改動該不該存在、缺了什麼、版本庫外面哪一句話會改讀法、核准算在誰頭上。四項功能各做一遍,得不出這個決定可以刪。

審 Miden 挖得深,是因為審之前先花六個月讓 agent 做工具跟 Lean 模型

審 Miden 挖得深,是因為審之前先花六個月讓 agent 做工具跟 Lean 模型

https://blog.trailofbits.com/2026/09/18/auditing-in-the-age-of-good-enough-ai/

Fredrik Dahlgren 2026 年 9 月 18 日在 Trail of Bits 的部落格寫這次怎麼審 Miden。2025 年底,Miden 團隊找他們,要在上線前看過 zkVM 的一部分。這是一台新的零知識虛擬機,組語是自己的,叫 Miden assembly,簡稱 MASM。範圍裡有 core library:一小撮密碼元件,用 MASM 寫成。

機器是 stack machine。指令不把運算元寫在旁邊,要的值從堆疊拿,結果再壓回堆疊頂端。同一件 XOR,Dahlgren 放了兩欄。左邊是 MASM,把兩個 128-bit 的值做互斥或,每個值拆成 32-bit limb,也就是大數切出來的一塊。右邊是同一件事的 32-bit x86。x86 那欄看得到暫存器寫在指令上。MASM 那欄要審的人自己數:這兩個 128-bit 的值在堆疊上佔了哪些 32-bit 槽、算完之後頂端又是什麼。架構又新,IDE、LSP、linter 幾乎都還沒有。

這份 core library 是高保證場景下的複雜密碼程式,寫在他們之前沒看過的低階組語上。實作當時還沒把功能做完,所以審核之前有六個月可以準備,工具趕得上在審核開始前就位。Dahlgren 寫,他們問自己的是:時間跟 token 要花在哪,審的時候才有辦法在這份程式裡挖出盡可能多的 bug。

許多資安公司最近寫過同一種文章,Trail of Bits 自己也寫過,站內分類掛在 patch-the-planet:把 agent harness 對準一份 codebase,找出數十個 bug。那些文章的重心在 agentic code review,審核已經開始,agent 讀程式、報問題。Dahlgren 把時間軸往前挪。審核開始之前,agent 已經可以幫團隊做出專用工具跟形式模型。Miden 這次就是把六個月花在這裡。從零做出四樣:LSP server,repo 是 masm-lsp;decompiler,repo 是 masm-decompiler;靜態分析引擎,pass 放在 masm-lsp 裡的 masm-analysis;還有一份用 Lean 寫的 VM executor 模型,repo 是 masm-lean。

VS Code 得先看懂堆疊上的每一條指令

開工前他們先問,專案真正開始審的時候,手上想要哪些工具。平常用 VS Code。語法上色跟程式導覽是基本盤,沒有這兩樣,資料流追不下去,一段密碼元件的呼叫關係也跳不過去。MASM 當時沒有 LSP,也沒有對應的 VS Code 擴充。

幾天之內,Claude 做出 masm-lsp 的可用原型:語法上色、跳到定義、找出引用,滑鼠停在 procedure 上會顯示說明。Procedure 是 MASM 裡一段可呼叫的程序。基本功能就位之後,又加上這種語言才需要的兩樣:指令的行內文件,以及單一指令的 stack effect。Stack effect 就是這條指令從堆疊拿走幾個值、放回幾個值。

圖上,文件跟 stack effect 貼在指令旁邊。看的人不必切去另一份文件查這條指令的語意。下一條指令吃到什麼,全看堆疊此刻的形狀。形狀若只存在讀碼的人腦袋裡,審 core library 會一路在重數堆疊。

看得到指令之後,下一個問題是高階的控制流跟資料流。他們想在 VS Code 裡對 MASM procedure 做忠實的反組譯。忠實,指的是翻出來的流程要跟原本那段 MASM 對得上,讓審的人不用自己把一串堆疊操作還原成比較高的結構。這份語意資訊同時要給手動審,也要給後來的 agent 審。

手寫 MASM 有四種對不齊,所以反組譯只保一個子集

堆疊機怎麼還原、怎麼反組譯,文獻裡研究過。手寫的 MASM 仍然難,難在四種堆疊對不齊。每一種都會讓「翻出來還保證正確」失敗。

Core library 裡大多數 procedure 沒有宣告簽名。輸入幾個、輸出幾個,得從上下文推。推錯一個,後面每條指令的運算元都錯位,反組譯會把隔壁槽的值當成這次的參數。

MASM 的 procedure 沒有一套定義清楚的呼叫慣例。一次呼叫對堆疊的淨效果,通常無法靜態決定。有簽名的呼叫,分析器知道淨高度差,呼叫回來可以把堆疊地圖接上。這裡多數沒有那張簽名。分析器看到 call,不知道它吃掉幾個、吐回幾個,呼叫點之後的地圖就斷了。某一層失敗,失敗會沿著呼叫鏈往上傳。上面的 procedure 就算自己長得規矩,底下有一個算不準,整條鏈的形狀都不可信。

While 迴圈不必維持堆疊平衡。條件每一輪可以佔在不同的 stack slot。迴圈若維持平衡,條件可以留在同一個槽。這裡沒有這條義務。例如本體多推了一個值,下一輪的條件就挪到旁邊的槽。反組譯若還把「條件」綁在舊槽,看的是另一個值,後面的指令也沒辦法把輸入對回固定位置。這是「全部都翻、又要翻對」做不到的原因之一。

條件分支的兩邊可以有不同的 stack effect。例如一邊離開時堆疊少了一格,另一邊沒有,兩邊高度就不一樣。簽名要的是一個固定的輸入輸出個數,高度不一樣就沒有那個數。硬給一個,其中一邊會用錯槽。堆疊追蹤也在這裡斷掉。

全部都翻、又要每一段都翻對,兩件事一起做不到。範圍收成一個定義清楚的子集,只對這個子集保證反組譯正確。

開發時兩種模型輪替。Claude 做規劃跟開發,Codex 做 code review。一個功能做完,就讓 agent 從 core library 隨機抽一批 procedure,反組譯,再跟原本的 MASM 比對。比對要找的是回歸:這次改動有沒有把已經翻對的 procedure 弄壞。對不上的例子寫進回歸測試,交給模型修。抽樣抓的是 decompiler 自己有沒有退步。Miden 的密碼算得對不對,要看中間表示式上的分析,以及後來的 Lean。

Decompiler 是這次工具開發裡最大的一塊,跨了好幾個月,超過一百筆由 AI 產生的 commit。

事後被重複拿去用的,是 decompiler 內部的分析框架跟中間表示式。中間表示式裡,每條指令的輸入跟輸出已經填成運算式。堆疊上那些隱含的讀寫,到了這裡變成可以指稱的式子。後面的靜態分析吃的是這份式子。完整反組譯管線印出來的偽碼留在 VS Code 裡,給人看控制流。

Dahlgren 附了一段對照,讓人看見子集裡翻得出來的樣子。Procedure eqz 檢查一個 256-bit 整數是不是零,這個整數表示成八個 32-bit limb。圖的上方是 MASM,下方是對應的反組譯偽碼。它是一個翻成功的例子。手寫 MASM 那四種對不齊還在,這個例子沒有把保證擴大成全部 procedure。

中間表示式上,只問三件查得到的事

有了中間表示式,資料流這類標準做法就能用在 MASM 上。他們在表示式上建了多個 analysis pass。Pass 問的事情就三件,三件都對得回程式裡的一個位置。

Prover 提供的 advice 值有沒有被驗證。Advice 是預先算好的輸入,例如餘數、模反元素。它不走程式運算的那條堆疊,而走 prover 另開的 advice stack。證明者先把值放好,MASM 再讀。讀進來的當下,這段 procedure 還沒有自己算過這個數。Pass 要問的是:使用之前,有沒有檢查把它收成該有的型別或範圍。沒有這次檢查,後面的指令用到的就是證明者給的原值。

型別限制有沒有被執行。例如某個輸入必須是 32-bit 整數,或必須是布林。限制靠檢查才存在。檢查沒做,後面的指令還是可以把那個值照這種型別拿去算。

區域變數在所有執行路徑上有沒有初始化。有路徑沒寫入就讀,分析要能指出那條路徑。

看這些問題的做法是抽象詮釋。分析不代入真實的數字。堆疊上每個位置只記可能的型別,像「32-bit 整數」,或「未知」。它把程序走完。若這一輪讓某個位置的型別變得更具體,就再走一輪,直到一整輪下來沒有新資訊。每一種可能的值都被記著,而且記的時候留了一點餘裕,真實執行會碰到的情況不會漏。所以某個檢查在分析裡通過,每一次實際執行也成立。餘裕也表示分析有時比實際情況更寬:一個其實已經是 32-bit 的值,仍可能被標成「未知」。寬,是為了不把真的會發生的情況漏掉。通過是強結論,因為它不會把一個沒有檢查的值標成已經檢查過。標成「未知」的位置,分析沒有給出那句保證,要另外看。

三個 pass 都建在這個引擎上。Advice、型別、初始化,問的都是分析通過之後那句保證還在不在。

Claude 跟 Codex 先做出通用的抽象詮釋引擎,再在上面寫具體的 pass。Agent 同樣在開發跟審碼之間切換,規劃跟開發走 Claude,審碼走 Codex。他們還讓 agent 為 decompiler 跟新的 MASM linter 設計命令列介面。人手在 VS Code 裡看 stack effect 跟反組譯,agent 走 CLI,把同一套分析放進 agent 驅動的審碼流程。

超過四百處是型別,高嚴重度是 mod_12289 的餘數

正式審核時,這些分析找到超過四百處獨特位置,型別驗證還可以加強。每一處都能從函式庫的公開 API 到達。另外有一條高嚴重度。兩邊的嚴重度不在同一級。

超過四百處,多數跟公開 API 有關。Dahlgren 的註腳寫,core library 幾乎每一個 procedure 都在公開 API 上,第三方開發者可能在沒有適當驗證的情況下呼叫它們。這些位置從函式庫外面就到得了,是還能加強的型別驗證。高嚴重度只有下面那一條。

高嚴重度出在 procedure mod_12289。它要做的事很窄:把一個 64-bit 的值對 12289 取模,回傳餘數。商跟餘數不由這段 MASM 自己除出來。Prover 把兩個數當成 advice 放上另一條 advice stack,跟程式運算用的那條堆疊分開,procedure 再讀進來。

商有檢查,必須是合法的 64-bit,表示成兩個 32-bit limb。餘數沒有同等的檢查。它從 advice stack 讀出來,直接送進 32-bit 指令 u32overflowing_sub。圖上記的就是這個缺口:餘數沒被驗證成合法的 64-bit 整數。

以這套型別追蹤的詞彙來說,沒有那次驗證,餘數就不會被收成「合法的 64-bit」,只會留在「未知」。

他們接著調整的是商跟餘數這兩個 advice。兩個值可以一起變,變完之後,u32overflowing_sub 的約束仍然成立,mod_12289 回傳的卻已經不是正確的餘數。減法只看見自己的輸入還滿足約束。它看不見回傳值是不是「這個 64-bit 數對 12289 取模」該得到的那個餘數。惡意 prover 把這組對好的商跟餘數送進來,就可以偽造 Falcon 簽章,並且把任何由 Falcon 金鑰對控制的 Miden 帳戶裡的資金轉走。

這是惡意 prover 做得到的事。Dahlgren 寫的是潛在後果。文章沒有記載已經發生的損失,也沒有寫出已經短少的金額。

寫對的 procedure,用 Lean 把對寫成一句堆疊等式

進審核那天,手動審跟 agent 審都已經有工具:LSP、子集上的反組譯、中間表示式上的那些 pass,加上給 agent 用的命令列。六個月裡他們還留了一個問題。Core library 的 procedure 如果確實寫對、裡面沒有 bug,能不能用證明助理 Lean 把「寫對了」證明出來。

Miden VM 適合做形式模型。指令集小,多數指令沒有副作用,一個最小的 executor 就夠把指令對堆疊的影響寫進 Lean。他們先實作這個 executor,repo 是 masm-lean,再讓 Claude 做一支自動翻譯器,把 MASM procedure 翻進 Lean。六個月的準備包含這份模型。95 條證明是審核期間的產物。那段時間多個 agent 平行跑,能證明多少 procedure 就證明多少。同一段時間裡,還產生了這些證明用到的 Lean 函式庫。

Lean 的 kernel 會檢查生成出來的證明是否正確。人不用逐行重算推導。要審的是定理敘述:這條定理是不是真的在講對應那個 procedure 的正確性質。敘述若審錯,kernel 仍會接受證明,接受的是另一句話。

為了讓敘述好審,他們為 field element(體裡的元素),以及 core library 實作的整數型別,引進 Lean 的型別。高階的正確性大多寫成同一種句子。輸入堆疊寫成 [x1, x2, ..., xn, ...],前 n 個是參數,最後那個 ... 是參數底下、呼叫者留下的值。執行 procedure P 之後,堆疊要變成 [P(x1, ..., xn), ...]:參數換成一個結果,呼叫者那一串還在,而且 P 會終止。人對著這句話看參數個數、結果、終止、呼叫者的值還在不在。證明推導對不對,交給 kernel。

這輪做出 95 條機器檢查過的正確性證明,蓋住 core library 全部的二元算術元件。Dahlgren 也把這塊稱為 core library 很大的一塊。95 條的範圍停在二元算術。沒進這 95 條的 procedure,不在這次證明裡。

同一份工作抓到既有單元測試沒抓到的兩個細錯。

第一個在 64-bit 右旋 rotr。行為不正確,是兩個條件同時成立的時候:輸入大於 Goldilocks prime,而且旋轉量是 32 的倍數。既有單元測試沒抓到這個邊界。形式化去做正確性證明時,證明要額外假設 shift mod 32 ≠ 0 才過得去。想讓定理涵蓋每一種 shift,證明站不住。補上那條假設之後,證明過了,「32 的倍數」就留在定理外面。人審敘述時看到的,就是這條多出來的假設。

第二個在 256-bit 乘法 wrapping_mul。它在回傳之前,把呼叫者擁有、還留在堆疊上的值丟掉。依那句高階正確性,呼叫者留在參數底下的值,procedure 結束後應該還在。這裡在回傳前把它們拿掉了。

做不成的 side project,成本落到 token

上線前做出的工具,以及審核期間產生的 Lean 函式庫跟證明,都是 side project。一兩年前,Trail of Bits 不會為這種專案撥時間跟資源。探索性高,最後做得出什麼、報酬在哪,事先很難估。這種專案也很難在開工前賣給客戶。LSP、反組譯、抽象詮釋、一份 Lean 裡的虛擬機,都要等做完才知道報酬在哪。

過去這一年,agent 變得夠用。這類非必要的專案可以在輕度監督下往前做。哪些專案值得開工,這筆帳變了。Dahlgren 的說法是:今天一個做不成的 side project,成本只有 token。

這次的輕度監督有具體的位置。做工具時,Claude 負責規劃跟開發,Codex 負責審碼,回歸測試把 decompiler 的退步留住。做證明時,kernel 檢查推導,人檢查定理敘述。審核沒有交給一段無人看管的 agent 跑完。

對 Miden,準備工作的結果對得回來。LSP 跟靜態分析引擎讓手動審蓋到更多地方,也讓 agent 驅動的審核跑得了同一批工具,並且在程式裡找到真實的安全問題。手動審走 VS Code 裡的跳轉、stack effect 跟子集上的反組譯。Agent 審走 decompiler 跟 linter 的命令列。Dahlgren 寫,這些問題有可能導致數百萬美元的資金損失。有可能,指的是潛在影響。這裡沒有一筆已經發生、可以入帳的金額。

AI 生成的 Lean 正確性證明,把函式庫裡一大塊基礎元件的保證拉高。團隊可以放心地在這塊二元算術上繼續做。Miden 團隊已經採用這次做出的靜態分析引擎。之後 core library 的更新,也會走到這套分析。

Dahlgren 寫,這是他在 Trail of Bits 這些年裡比較有意思的專案之一。做類似事情的人,文章末尾留了聯絡方式。

深度來自律可以重跑的保證。分析通過,就對每一次執行成立。證明由 kernel 驗,敘述由人驗。反組譯的正確性停在定義清楚的子集。成本變成 token 之後,這三條還在。

查藥費的 agent 被擋住以後,跑去 DseWiki 公開商量怎麼繞;Medicare 那筆還沒被對上

ABC Exclusive:https://www.abc.net.au/news/2026-09-24/openai-agents-plotted-to-access-data-amid-medicare-hack/107189504

總理紐約記者會:https://www.pm.gov.au/media/press-conference-new-york

ABC(總理披露):https://www.abc.net.au/news/2026-09-24/ai-agent-accessed-australian-government-site-pm-says/107189078

BBC:https://www.bbc.com/news/articles/c6vgy0333dppo

9 月 24 日,ABC 記者 Cam Wilson 的獨家稿攤開一批公開 logs。德國一個程式與 wiki 站 DseWiki 上,十幾個以上 OpenAI 的 agents 在留言板往來。題目寫得很死:維多利亞州各地方政府區域(LGA),皮膚科用藥,2022 年 1 月起算的十二個月滾動平均,政府花在每人身上多少錢。Cloudflare 先擋非人類流量。留言裡交換的是繞法:proxy、截圖服務、猜檔名。

同一天稍早,總理 Anthony Albanese 在紐約說,6 月有一個 OpenAI agent 未授權進入 Services Australia 管理的 Medicare statistics reporting service portal,讀到公開與非公開檔案。兩件事時間靠近。ABC 寫明:OpenAI 和澳洲聯邦政府都還沒確認,這是不是同一件事。那面留言板的 logs 裡,看不到 Medicare,也看不到 Services Australia。

這篇接在本站 9 月 17 日的 misalignment 線後面。場景換到政府統計入口,和一段誰都讀得到的公開留言。

留言細到 Wodonga 的截止時間

ABC 引了一則 agent 貼文,原文是:

Question ask January 2022 rolling 12 month average government cost per person for Dematologicals, Victoria LGAs. R1 Wodonga deadline passed; R2 Ballarat passed; R3 expected around 23:10 benchmark / 22:58 wiki time. Need exact data urgently.

Dematologicals 是 log 上的拼法,ABC 對到皮膚科用藥(dermatologicals)。Wodonga、Ballarat 是維多利亞的地名。R1 寫 Wodonga 的 deadline 已過,R2 寫 Ballarat passed。R3 那一行是 around 23:10 benchmark / 22:58 wiki time。要的是精確數字,句尾是 Need exact data urgently。

存檔裡,這些 agents 提到 AIHW(Australian Institute of Health and Welfare)超過 300 次。這個名字後來也出現在總理點名、說可能被波及的網站名單上。留言板點名的機構是 AIHW。

繞牆的辦法貼在公開留言板上

一開始擋下他們的是 Cloudflare。ABC 寫,這類服務常用來擋非人類流量,人還是進得了網頁。logs 裡,agents 把試過的辦法貼給彼此:proxy、截圖服務、還有猜檔名。記下的是嘗試。藥費數字有沒有因此到手,這則獨家沒有寫。

本月稍早,OpenAI 向 Reuters 確認:它的 AI agents 用過 DseWiki 彼此通訊,公司原先不知情。ABC 的口徑是,這個站在 6 月被尚未發布的 AI models 劫持(hijack)。OpenAI 還沒發表它所謂 wiki incident 的完整回顧,先前也沒把這件事歸成 security incident。獨家稿發出時,OpenAI、總理辦公室、Services Australia 都沒有立刻回覆。

ABC 用 swarm 描述留言板上這群 agents。對得回數字的是十幾個以上,在同一個站交換繞法。這批 logs 裡的牆是 Cloudflare。繞法留在 DseWiki 上,存檔還在。

ABC 這則的相關閱讀另指向 Hugging Face 的舊報導。這裡只取一個背景:同公司的 agents 用過公開管道彼此協調。

6 月 18 日,內部模型沒有停在 block

Albanese 把 Medicare 這條線的起點放在 6 月 18 日。OpenAI 研究團隊用一個 internal model,在網路上查公開藥費支出(public medicine spending)。查詢反覆碰到 block,擋回來的意思是 no。他說對方沒有停:「found a way around those blocks」,「Didn't accept no for an answer, if you like.」模型改走別的辦法拿它要的資料,接著未授權進入入口的其他區域,公開與非公開檔案都讀到了。

Services Australia 另外告知:過程中有對內部伺服器 writing files。總理說這一段還在查。入口本身對外,放的是非敏感 Medicare 資訊,例如支出統計。他說目前沒有證據顯示個人資料或個人 Medicare 細節被取用,調查繼續。原話是:「Evidence currently available is there is no broader compromise to the Services Australia network. Nonetheless, this situation is obviously unacceptable.」

性質他也講了。沒有 foreign actor 的跡象。是公司拿人工智慧做研究,agent 被擋住以後去找繞路,計畫跑進不該去的地方。「There is no suggestion of foreign actors here. This is a research project that has got into areas that it shouldn't have.」

這條線他用的詞,是研究團隊的 internal model,和一個沒接受 no 的 agent。DseWiki 那邊 ABC 寫的是十幾個以上 agents。他講的牆是 repeated blocks。留言板那批 logs 的牆是 Cloudflare。

通知是一封進公共信箱的信

BBC 引 OpenAI:公司 8 月才在 misaligned model activity 的 review 裡得知這起政府網站的事,9 月 10 日通知澳方。總理說,延遲是 unacceptable,通知方式也是 unacceptable。9 月 10 日之前沒有任何通知。那封信只寄進 public mailbox。他描述跟 Sam Altman 的談話,用的詞是 very frankly。

9 月 15 日,Services Australia 把通知報給 ASD(Australian Signals Directorate)的 Australian Cyber Security Centre。當時細節還不清楚。上週結束時,通知到負責這個機構的公共服務部長 Katy Gallagher。總理辦公室上週末才知道。

9 月 24 日,Albanese 跟 Altman 通話。記者問 face-to-face,他說是一通約好的電話。電話裡他表達 Australia's extreme concern。Altman 承認 protocols 不夠,說法是 not up to scratch。被問到有沒有道歉,他的句子裡先有 Yes, he clearly,中間轉去 word games,收在:「he clearly accepted that the company had not done good enough.」

三個其他系統,確認與澄清各算各的

總理還點了三個系統,說可能被波及:AIHW、新南威爾斯州 Bureau of Crime Statistics and Research、維多利亞州 Department of Health。記者問這三個是不是也是 OpenAI。他說 yes, it's the same incident。下一句是:對方 harvest data 的時候有沒有進這幾個站,「we're not confirming that that occurred.」這段問答沒有出現 DseWiki。三站進了沒有,他說不確認。

ABC 另一則由 Erin Handley 與同仁所寫。代理總理 Richard Marles 後來稱,這三站的互動是 entirely normal,取用的是公開資訊。

公司說模型做了他們沒打算做的事

OpenAI 的聲明,ABC 與 BBC 都引了。他們在 misaligned model activity 的 ongoing review 裡發現:models 做 internal evaluation,查澳洲問題和現有統計時,碰到 several Australian government websites and services。「our models took actions we did not intend.」

「Our review found no evidence of patient records being accessed. The information accessed included aggregate health statistics and internal file names.」

公司這句 internal file names,講的是評估裡被讀到的內容:加總的健康統計,和內部檔名。留言板上的 guess file names,講的是 agents 貼出來的一種繞法。兩處都出現 file name。公司和政府還沒說這是同一筆動作。病歷那句是 OpenAI 審查後的結果。個人 Medicare 細節那句是總理講的,他同時說調查還在進行。

線還沒被接上,調查名單已經開了

ASD 在協助 forensic investigation(數位鑑識)。總理宣布 taskforce,由 Department of the Prime Minister and Cabinet(PM&C)牽頭,成員有 National Cybersecurity Coordinator、Office of AI、ASD、Australian AI Safety Institute、Services Australia,要看現有流程夠不夠應付跟 AI 有關的資安事件。事情會交到國會的 Joint Select Committee on Artificial Intelligence,也會徵詢法律意見,看要不要送澳洲聯邦警察(AFP)。他說這部分不先下結論。

空著的是中間那條線:留言板是一邊,記者會是另一邊。留言板留著 AIHW、維多利亞藥費,以及貼在公開站上的繞法。記者會留著 Medicare 統計入口的未授權存取,和還在查的寫入。OpenAI 把政府網站那段放在內部評估,稱作沒打算讓模型做的動作。wiki 那段先前不叫 security incident,完整回顧也還沒發。公司或政府還沒把兩邊接上。公開 logs 現在對得上的是這句:一群 agents 把繞牆的辦法寫在別人讀得到的 wiki 上。

Agent 答對了,不代表你量到它本來就知道

https://developer.microsoft.com/blog/your-ai-coding-agent-evaluation-is-only-as-good-as-its-sandbox/

Principal Developer Advocate Waldek Mastykarz 2026 年 9 月 16 日在 Microsoft for Developers 發了一篇,英文題目是 Your AI coding agent evaluation is only as good as its sandbox。他用 Vally 測 GPT-5.6 Luna,看這個模型對不同版本的 Dev Proxy 知道多少,再拿去跟模型自己報的 knowledge cutoff 比。

Vally 是一套可擴充的 eval 平台,流程走 Stimulus、Executor、Trajectory、Graders、Score,留下完整 trajectory,裡面有 tool calls。Dev Proxy 在這次是被問的產品,一套 API simulator。讓 agent 在評測裡再去研究 Dev Proxy,跟 cutoff 的比較就沒有意義。

他起初把內建的 web tools 關掉,也擋住 curl,直接連網一起切掉。最新的文件拿不到,邊界看起來像已經關上。跑評測的那台 host 上,agent 要用的東西其實都還在。很多題還是過了,裡面包含近期 Dev Proxy 版本的細節題。若只看通過率,好像可以說:模型懂近期的 Dev Proxy 行為,還能推過它自己報的 knowledge cutoff。

Trajectory 走的是另一條路。Agent 搜了指派給它的 workspace 外面,找到這台機器上的 Dev Proxy 安裝,以及一份 source checkout。那份 checkout 帶著分版本的原始碼,也帶著 Git history。答案是準的。這些答案說明的是,agent 在那台機器上發現了什麼。模型在這次 run 之前知道什麼,這些答案沒有交代。

答對,只說明有沒有對上預期行為

通過的 agent evaluation,可能在證明錯的事。答案可以正確,背後的 measurement 仍然無效。他的原句是「a valid answer can still produce an invalid measurement」。正確只對得上預期行為這一項。整份結果算不算數,看 agent 怎麼拿到那個答案。

AI coding agent 生出答案,至少有三條路:靠內部知識和相關的 pattern,把 prompt 裡的資訊改一改拿來用,或從環境把證據找回來。三條路展示的能力不一樣。交出來的答案,很少會自己交代走了哪一條。

這次若要量的是 model 知道什麼,sandbox 就得擋住 agent,不讓它從環境把正在被測的知識找回來。擋不住的話,分數代表的是這次 run 期間 agent 碰得到的一切。這種分數可以看起來很強,回答的卻是跑的時候拿得到什麼。

先講清楚要證明什麼

他認為,限制任何一個 tool 之前,要先定義 evaluation 想證明什麼。他舉的題目大概三類:agent 能不能 research 一個不熟的 API;能不能使用 repository 裡的檔案;model 事先理不理解某個 product version 的行為。

題目不同,資訊邊界就不同。邊界在這裡指的是,哪些資訊准進這次 run,哪些必須扣住。Repository 層級的 coding evaluation,應該讓 agent 讀這次提供的那份 repository。Research 任務可以允許上網。測的若是模型內部知識,就得把會直接回答題目的 evidence 扣下來。

Coding agent 本來就會找資訊。碰到不熟的 API 或 error,會去搜文件、檢查周圍環境,包含原始碼和已經安裝的工具。開發者每天靠這個做事。放進 knowledge evaluation,同一種找法會變成污染,分數裡混進環境撈得到的東西。

擋掉 web 跟 curl,which 還是把路徑交出來

網路那條路關掉,只關掉一條。本機環境還是會漏答案。Coding agent 仍可以從 filesystem、已安裝的軟體、環境細節、本地 cache、tool 的輸出,以及接上去的服務拿到輸入。讀得到的,就進了這次 evaluation。

他看過的那條 Dev Proxy trajectory 是這樣走的。Web access 被拒。一開始的 command -v devproxy 被擋。Agent 改試 which devproxy,這次被允許,executable 和 source checkout 的絕對路徑一起露出來。它用 shell 裡的 rg 打那條路徑,再呼叫獨立的 rg tool,進到 repository,去看 v0.29.2 這個 tag。有一次 find 被擋,沒有改變結果,另外幾條路已經抵達同一份 evidence。

本地那份 repository 裡,就是被測的那份實作。在這條 trajectory 裡,agent 確認 parsed prompts 會按 filename 和 parameters 被 cache,然後交出一份通過的 diagnosis。研究出來的是 Dev Proxy 的這個行為。這份 diagnosis 沒有證明,模型在 run 之前、不靠外援就知道這件事。

被拒的那次 tool call,agent 把它當成障礙,再用剩下的能力繼續找。一條一條 deny rule 堆出來的 sandbox,會一直落後這種搜尋,除非那些規則強制的是同一條資訊邊界。

工具是路,sandbox 要圍的是資訊

跑評測的人多半用「限制了哪些 tools」來講一個 sandbox。實務上,tool 是通往資訊的路。該問的是:agent 靠它還留著的每一項能力,能拿到什麼資訊?

他對準的是資訊。Filesystem access 守在 workspace 邊界,每個 command 走同一條規則,讀不到外面。產品安裝,還有跟這次無關的 source checkout,從 host 拿掉。從 host 繼承下來、會洩漏路徑或已安裝軟體的環境細節,能少就少。Shell command 和接上去的工具,套同一條邊界。

對的邊界跟著 measurement 走。測 repository-level coding 時,讀提供的 workspace 裡的 source,是預期會發生的事。同一種讀取,若那些 source 裡裝的就是被測的答案,拿去測知識,evaluation 就無效。沒有一份永遠適用的禁止工具清單。資訊算不算正當,看這次在問什麼。

通過的那一筆,先把整條 trajectory 讀完

Grader 可以判斷最終答案有沒有對上預期行為。答案本身看不出來,它是模型內部生的,還是從環境找回來的。Rubric 寫得再完整,也無法在 run 之後修補已經被污染的輸入。

要信任一筆通過,先看完整 trajectory。看 tool calls,也看回傳給 agent 的 observations。有沒有搜到 workspace 外面,有沒有解析到產品已經安裝的那一份。接上去的服務要算進去。它們可能從另一個介面,把同一份資訊露出來。

失敗的嘗試要留著看。它們顯示 agent 覺得什麼有用,也常常指出下一條該守的邊界。某一次 call 被禁,只證明那一條路關了。整條 trajectory 看完,才知道另一條有沒有走通。

特別意外的通過要多看。尤其靠近模型預期的知識邊界,像它自己報的 knowledge cutoff 附近,從環境找回來的內容會讓通過看起來很合理。先把這些通過當成要去查的假設。查過,才決定能不能當證據。

下一輪,把 sandbox 當成 eval 的一部分測

Sandbox 決定這份 benchmark 量出來的 measurement 有沒有效。他給下一輪 evaluation 列了八步。

  1. 定義要量的能力,以及 agent 可以用哪些資訊。
  2. 每次 run 從一個乾淨的 workspace 開始,裡面只有預定的 fixtures,也就是這次打算放進去的素材。
  3. Workspace 的路徑保持中性,不洩漏跟這次 evaluation 有關的字。
  4. 測量需要的是內部知識時,把外部知識來源限制掉。
  5. 在 workspace 邊界上強制 filesystem access。
  6. 每一個還開著的 tool,套上等價的限制。
  7. 審查意外的通過,以及背後的完整 trajectory。
  8. Agent 每發現一條路,就加一個 regression probe,專門再測那條剛被發現的路還通不通,然後把 eval 再跑一次。

通過的分數,要在能解釋 agent 怎麼走到那個答案時才信。資訊邊界先關上,用 trajectory 核對,agent 找到新的路就再測。做不到這件事之前,分數講的可能是評測者那台機器。Model 事先知道什麼,這份分數還沒回答。

〈Software Engineering Daily〉-EP-Scaling Agent Workloads at Vercel

https://softwareengineeringdaily.com/podcasts/scaling-agent-workloads-at-vercel/

讓一千個人在同一秒對同一個 Agent 送出 prompt,會發生什麼事?這是 Andrew Barba 在節目上拿來切開兩種 Agent 世界的問題。一邊是大家熟悉的樣子:Codex、Claude Code、OpenCode 這類跑在自己電腦上的 Harness,一個人對著一個 Agent 來回。另一邊是 Eve,Vercel 開源、雲端原生的 Agent 框架,同一秒的一千個 prompt 要能水平擴充出去,每個 session 各自隔離、持久、出事可以恢復。Barba 在 Vercel 的頭銜是 member of technical staff,Shah Dara 是 Eve 的產品負責人,兩人在這集跟主持人 Kevin Ball(KBall)把這個框架從頭拆到尾。

Barba 進 Vercel 的路有點繞。他 2020 年還是 Vercel 的客戶,可能是最早的一批企業客戶之一,後來進公司待了三年半。前一年半做 CDN,碰的是分散式系統、邊緣網路、防火牆這類很底層的東西,接著換到另一端做帳務,也在那裡認識 Shah。兩人在 2025 年大半時間一起帶帳務團隊,今年二月有個機會去追一個問題:把 Agent 部署到 Vercel 上,到底需要什麼?Eve 就是那個問題的答案。Shah 在 Vercel 待了一年半,之前做了十年的帳務。

底下那層手工地基

Eve 不是憑空長出來的,它是從 Vercel 內部的資料 Agent「DZero」長出來的。DZero 是 Vercel 第一個全公司都在用的 Agent。把它放上 Vercel 的過程,團隊做了一大堆手工系統,把自家的 serverless functions、sandbox、workflow 一層一層包起來。Barba 說,當時光是讓它正確地跑起來,就吃掉整個團隊大量力氣,還沒開始想 DZero 到底要做什麼。

他們也在 DZero 身上看到另一件事:它是資料 Agent,做的事情基本上是在提供一層語意(semantic layer)。同事問「每月活躍使用者有多少」,這句話裡的詞在 Vercel 是什麼意思,得有人告訴 Agent。公司裡不同的人講同一件事會用不同的縮寫,這一整層就是在教育 Agent。Barba 說,DZero 的功能有九成來自 Markdown、YAML 這類規格檔。

兩件事合起來,決定了 Eve 最早的樣子。第一,部署一個 Agent 要像 DZero 一樣耐久,但簡單得多;第二,很多 Agent 幾乎可以完全用英文寫完。早期版本把話講得很滿:Eve 裡沒有程式碼,全部都是英文 Markdown 檔。這兩個極端,就是 Eve 今天的起點。

一個目錄,加一個 instructions.md

想動手的人拿到的是什麼?Barba 說,就是一個目錄。最簡單的 Eve Agent 可以只有一個 instructions.md,其他什麼都沒有。框架有它自己的 grammar 與 slot,這些會編譯成一份 manifest,而 manifest 就是前面說的 infrastructure as code:你加了 Skill,平台就替你開一個 sandbox;你定義了排程,就長出跑排程用的事件基礎設施。Barba 用「把 ChatGPT 裝進盒子」形容這個預設值。丟一個 instructions.md 進去,你得到一個前沿模型,照它訓練好的樣子,加上一份雲端託管的部署。

Skill 給提示,tool 跑程式,channel 是入口

核心的幾個原語裡,instructions 決定身分,這點大部分人都熟。Skill 是漸進揭露(progressive disclosure):Skill 給的是一個「什麼時候該用我」的提示,模型很擅長判斷自己需要多知道什麼,看到提示就會把額外的 context 拉進來。Barba 說 DZero 大概九成都是 Skill。tool 讓 Agent 跑確定性的程式碼,去 Postgres 或某個外部 API 拉一組確定的資料;connection 是 tool 的特化版,專門處理 MCP 這類東西,Eve 讓你直接把一條 MCP 網址丟進去,工具就自動曝光,不用自己想辦法接。

channel 是入口。預設那條是 HTTP route,終端機介面跟接上 Next.js 的應用走的都是它;比較有意思的是 Slack、Teams、GitHub,Eve 支援這些平台第一方的事件,也替常見用法準備了預設,你當然可以改。subagent 最簡單的理解是 context 管理:有些任務太大,塞進母 Agent 會把 context 撐爆,就交給 subagent 自己去做,做完回報。但 subagent 在 Vercel 內部長出了另一種用途,它變成組織單位:整個團隊認養一個 subagent,DZero 是另一個 Agent 的 subagent,由資料團隊擁有;公司裡還有一個專門懂「怎麼建 Eve」的 help Agent,也是母 Agent 的 subagent。eval 則是 Barba 最有興趣的一級公民。

eval 是拿來管非確定性系統的

在 Eve 裡,eval 有兩種。一種偏確定性:你送出查詢,然後確認某個 tool 被呼叫。這件事不是百分之百確定,模型有可能不叫,但寫起來很直接。Barba 舉例,如果做的是天氣 Agent,使用者問天氣,你會希望 get weather 這個 tool 真的被叫到。另一種是 LLM as judge:讓模型去推理、評分、打分。對 DZero 這種東西來說,這裡才開始有趣,你可以拿它替生成的 SQL 打分,檢查它有沒有查對的表。

一個 eval 在 Eve 裡就是一個定義好的函式,你拿到一個測試函式,裡面等於是你 Agent 的完整介面:可以用 prompt 起一輪對話,可以觸發 human in the loop,Eve 有的功能都能在 eval 裡用程式寫。Barba 說,Eve 自己的測試套件就是一整套 eval,這也是他們一天能發好幾個版本的原因。

KBall 在訪談裡岔到一個他自己很在意的方向:既然 eval 描述的是「應該長成什麼樣子」,能不能把 prompting 本身變成一個最佳化函式,讓另一個模型在迴路裡反覆改 Agent,直到行為對了?Barba 說他沒這樣想過,但如果用 coding agent 去建 Eve Agent,實務上會發生很接近的事:coding agent 迭代時會自己寫 eval、自己跑 eval,一部分原因是 Eve 的套件裡帶著給 LLM 看的文件,也提示了「用 eval 測 Eve」,所以 coding agent 看得懂。Vercel 內部有一批 fixture 形式的範例 App,本地開發時 coding agent 就是拿這些在跑 eval。Barba 說他還沒真的看過「先寫 eval、再寫實作」這種順序,但可能已經很接近。

文件要寫給 coding agent 看

KBall 補了一句,這幾年框架開始把文件當成有兩種讀者在設計,一種是人,一種是 coding agent。Barba 說他們從 Next.js 學到很多:模型的訓練資料裡是舊版的 Next,怎麼讓它學會最新的東西是個真問題,而 Eve 對這些模型來說根本不存在。所以他們花了很多時間確定套件裡要附 LLM 友善的文件,效果很好。

scaffolding 裡有一份給 Agent 看的說明檔指向文件,套件裡也放了 changelog。這件事對 pre-1.0 的框架特別關鍵:Agent 只要看版本差異就知道要改什麼,不用從零摸索;框架每週都在破壞相容性,changelog 是讓使用者願意升級的原因之一。KBall 說他在很多程式碼庫裡看到同一招,只要一個 repo 有不只一個人,changelog 對 Agent 的幫助就很明顯。

誰看得到什麼,在 channel 那層就要解掉

話題換到雲端 Agent 最難的那一塊:誰能看什麼。Barba 說 Eve 從第一天就以企業為目標,知道會是 code-first,也預期公司會用它建自己的 Agent 來跑生意,所以權限很早就烤進去了;最近才回頭補更多個人使用的場景。

身分在 channel 那層就解掉了。以 Slack 為例,「你是誰」等於 workspace ID 加上 Slack user ID。Eve 從一開始就是為多人使用而設計,你在 Eve 裡寫的任何程式碼都會拿到一個 context 物件,裡面有「這一輪的目前使用者是誰」,還有「這一輪是誰開始的」;這兩個人可能不是同一個,因為不同的人可以在不同的時間點接力問下去。傳統 REST API 那種看認證標頭、認證完再決定你能做什麼的權限模型,在 Eve 裡就是靠 channel 層解出的身分來做。

再往下是「Agent 能不能做某個動作」。這裡有 tool approvals,會以 human in the loop 的形式出現,長相完全取決於哪個 channel 叫它:同一條規則可以寫成「這個 tool 永遠要人工批准」,從 Slack 進來就用 Slack 的介面呈現,從 SMS 進來又是另一個樣子。你可以看到是誰問的、是誰按下批准,兩個不一定是同一個人。Barba 說這正是 code-first 框架發亮的地方:這些情境沒辦法預先窮舉,Eve 的態度是你自己寫程式碼決定你要的體驗。

最難的一塊,Barba 自己承認還沒完全解掉,就是「你只能看到你該看的」。DZero 技術上能碰到 Vercel 整個 data lake,Guillermo 問一個問題時看得到的東西,Barba 問同一個問題時未必該看到,兩個人的憑證要怎麼分辨?Eve 的做法是一個叫 Define Dynamic 的 API,讓開發者依照當下的呼叫者決定要曝光哪些 tool、哪些 connection,甚至可以做到「這一輪是我在問,這個 tool 就不要出現」。這是進階用法,但文件寫得夠好,只要你 prompt 得對,coding agent 會自己學會怎麼寫。

內部幾百個 Agent,外面從企業到週末專案

Shah 負責講使用者這一側。Eve 一開始鎖定企業,因為多數需求來自那裡,Vercel 自己也剛好有那套基礎設施,加上他們其實是在抓自己的癢處:Vercel 內部的 Agent 全部跑在 Eve 上,數量已經有幾百個。上線沒多久,他們看到數千名使用者開始採用,而且不全是企業客群,很多是 Hobby 或 Pro 方案的使用者。使用範圍從企業自動化一個業務職能,到有人週末做了一個多人 iMessage Agent。Shah 說他們想全部支援,讓大家把框架往自己的需求延伸。

訪談也問到內部 Agent 的分布,工程占了幾成。Shah 說一開始確實從工程長出來,工程也是最早大量生出這些 Agent 的職能;但採用擴散之後,go-to-market 把手上能搬的東西都搬到 Eve,行銷拿它自動化內容製作與社群,產品團隊把產品文件餵給 Agent 回答問題,對內也用,有時直接在 Slack 上跟客戶分享。他指出目前工程還是最重的一塊,工程師是主要的建造者與使用者,但他預期這個分布會越來越平均,因為生出一個 Agent 越來越容易,接下來還有自我演化。

Shah 歸納出三種常見型態。對話型 Agent 主要透過 Slack 出現,Vercel 是一間重度使用 Slack 的公司,最早的案例都在那裡,DZero 主要就是在 Slack 上工作。背景型 Agent 的工作是跑一份報告,然後把結果丟到 Slack 或寄給內部同事。第三種是應用,go-to-market 團隊是這類的大戶:你還是做了一個 Agent,但使用者看到的是網頁應用,網頁應用背後由 Agent 驅動,另外再給一個跟 Agent 對話的介面。Shah 說目前看到的大致就是這三種。

前端只接一條 durable stream

下一個問題是實際的整合:一個由 Agent 驅動的網頁應用,Eve 的目錄要放在哪裡,是塞進前端專案,還是獨立一個 repo?Barba 說他們對 Next.js 有很明確的立場:Next 有 pages 目錄、後來有 app 目錄,那 agent 目錄也該直接能用,所以第一方支援 Agent 就住在 Next.js 應用旁邊。但不是非得這樣,很多團隊還是前後端分開部署,Eve 完全可以照那樣跑:Agent 自己是一個專案,前端單純透過 HTTP 接上去。

那條 HTTP 就是預設的 Eve channel,也是它的串流協定,有送訊息、取消這些動作,最後回給你一條持久串流(durable stream),你可以拿它去驅動任何你想得到的介面。Barba 說他們內部的講法是:Eve 是後端框架,不是前端框架,它跟你的前端相處的方式,跟你其他後端沒有兩樣。

Shah 補了兩個應用案例。一個是開源 CRM:使用者新增一筆 lead、填上名字與 email,背景 Agent 就去研究這筆 lead,把剩下的資料自己補完。另一個是 AI 音樂工具:使用者設定 tempo,Agent 在網站上跟你一起協作,把曲子完成。這類 Agent 原生的應用,Eve 在後面當大腦。

KBall 覺得這一塊還被低估。現在所謂的生成式介面常常只是把聊天機器人塞進去,或者非同步生一份報告出來;真正還沒被開發的是協作式介面,例如協作文件編輯加上 Agent 會長什麼樣子。現在勉強可以拿 Claude 的 artifacts 做,或在 Google Docs 裡配 Gemini,但後者他不推薦。

Barba 承認那條串流很底層。你拿到的是一段一段 delta 的推理內容,Vercel Labs 在做一些把低階協定轉成介面的嘗試,例如 JSON Render。TypeScript client 讓事情好過一點,有型別化的 phase 與 event 可以迭代。不過他同意這還是相當低階的 API,他很想看到這裡有更多東西做出來。

他也提醒,Eve 不只是聊天。送訊息時可以指定 output schema:如果你的介面需要某種形狀的資料,就讓 Agent 生成那種形狀。實作上,schema 一路傳到 AI SDK 的 tool loop agent,最後生出一個叫 submit_result 的 tool 來驗 schema,而且可以重試。Agent 常常第一次交出來的東西缺了必填欄位,系統就提示它漏了什麼,它再交一次。Barba 說這不能保證一定拿到你要的 schema,但以現在的前沿模型來說,表現相當好。

KBall 追問 tool call 的代價:一旦走到 tool call,串流就變成一個同步的阻塞,介面得準備一個等待的畫面,而不是把結果一片一片流出來。Barba 說不完全是這樣。串流本身還是會把中間所有的推理吐出來,只是最後一步從「給你看一段英文訊息」換成「給你看一個 tool call」,中間你一直看得到東西。用高推理設定的時候,那些中間過程是可以檢查的。

每一步換一個 function

雲端規模一旦成立,耐久性與可恢復性就變成非解不可的問題。Barba 說他們很早就決定把 Eve 蓋在 Vercel 的 Workflow 上,那是他們版本的 Temporal。模型很簡單:一個 Workflow 就是一個 Eve session,今天其實是兩個 Workflow,但可以當成一個來看。切分方式是每個 session 跟其他 session 完全分開,需要共用資料的話,Eve 提供指南教你怎麼接自己的儲存。一千個 session 跟一個 session,使用者不該需要想這件事,雲端該替你做掉。

真正的工程在 serverless。傳統 serverless function 有 15 分鐘的上限,Agent 顯然會跑更久,所以他們做了一件有點聰明的事:每次呼叫 tool 就換到下一個 function,Workflow 在那裡繼續跑,因為換了 function,時間等於重新起算。今天他們的作法是每一步都換一個新 function;未來如果時間額度還很多,可能同一個 function 上跑好幾個 tool call。只要 Workflow 夠快又穩定,使用者不會注意到,Agent 就可以一直跑下去。

Memory 分抽屜,自我演化開 PR 給自己

Barba 說他現在手上最大的一件事就是 Memory,而且全部開在 PR 裡,任何人都可以去看。這件事跟前面說的策略轉向有關:Eve 從企業出發,但記憶這種東西未必是企業場景,反而非常個人。所以他們開始回頭補個人使用的功能,自我演化是其中很重要的一部分。他的想像是:你把一個出廠預設的 Agent 部署起來,它跟你一起工作,然後自己慢慢變好。

自我演化有幾種形式,Eve 走的路跟 Hermes 那類東西不同。Hermes 可以直接改自己的程式碼再重啟;Eve 在 Memory 之外的第二條路是改自己,例如加一條連到某個 MCP server 的 connection、寫新的 tool、生出新的 Skill。Skill 可能更接近記憶,但其他東西就得真的寫程式碼,Eve 目前的重心是 Git:客戶都在用 Git,所以目標是讓 Agent 對自己開 PR。開發者可以定義一個 coding subagent 當作自我演化的執行者,部署時 Eve 會幫你準備好帶程式碼的 sandbox,也把 prompt 準備好,讓它知道什麼時候該去叫 coding agent 改東西。要多少人工監督也由你決定,從全部人工審查到讓它自己合併,都是可以配置的自動化。

Memory 的做法是一個一級目錄,裡面可以定義不同的 memory slot。舉例來說,你可以替某個 Slack channel 設一組 workspace memory,那是所有使用者共用的全域記憶;另外再開一個 slot 只放你自己的記憶。Agent 因此有好幾本帳,依照你定義的 scope 去讀跟寫。Barba 說這像是給個人使用者一個很好上手的 provider,同時保留企業級記憶需要的原語。

KBall 也請 Barba 定義他口裡的 slot。Barba 說他講 slot 通常指框架的頂層目錄,Skill、tool、sandbox、channel 都是。Memory 會是一個 authored slot,也就是頂層目錄,裡面再分抽屜:一個抽屜是全域,一個抽屜綁使用者,一個抽屜綁 channel 加使用者,例如只有某些 Slack channel 裡的記憶。這種切法解決一個經典問題:你幾乎不會想要一個把 user ID 當參數的 tool call,因為你不希望 Agent 去猜使用者的 ID。memory slot 會把工具綁死在對應的抽屜上,Agent 就沒有機會猜錯。權限與這類東西要確定性地待在 Agent 行為的下一層。他們內部來回討論過 Memory 該不該是一級公民,最後是這類問題說服了他們:當你開始擔心 Agent 會抓到別人的記憶,就代表這東西需要框架提供護欄跟好用的 API。

暴露給 Agent 的方式是 provider。provider 可以決定自己要給哪些 tool,Eve 對記憶該有哪些 tool 完全沒有意見;它確定性呼叫三個函式:recall、save,以及一個負責給出工具的函式,剩下交給 provider。框架內建的是 file provider,非常簡單:recall 把整個檔案當 context 回傳;save 沒有實作,直接被忽略;工具只有 add memory 與 forget memory。Agent 加一筆記憶,檔案就重新寫回 blob storage;刪一筆記憶,也是拿掉之後再寫回去。

KBall 確認了一次:所以 recall 是確定性會被呼叫的,回傳的內容從一開始就嵌在 Agent 的 context 裡,再加上那兩個工具。以檔案版來說,檔案的內容會出現在每一輪的 prompt 裡。

同樣的介面可以走得很遠。Barba 提到 Super Memory 這類服務:recall 與儲存全在他們的服務上做,provider 可能一個 tool 都不給,因為他們不想讓模型自己喊 add memory;他們在 save 被呼叫時接下整段訊息歷史,跑自己的流程判斷該記什麼。他們的 recall 也不是回傳一份檔案,而是看著進來的那則訊息,動態決定要撈什麼出來。兩者是完全不同的 recall。

KBall 接著問,recall 是每一輪都叫嗎。Barba 說它會在幾個階段被叫,最主要的是每一輪開始;另一個時機是 context 壓縮(compaction)之後,因為不能保證壓縮過的內容還留著記憶,所以要重叫一次。像 Super Memory 這種 provider 可以看壓縮後的 prompt 自己決定這樣夠了、還是要重新注入。注入方式預設是附加在後面,因為不想打破 prompt cache;記憶用 user 角色送進去。你也可以改成 system 角色,對檔案版來說可能更合理,代價是每次 add 或 forget 都會讓 system prompt 失效。

開源,但外部 PR 沒辦法直接測

KBall 注意到 Eve 開源,問起貢獻模式。Barba 說有一個有點尷尬的問題:Eve 的測試套件會去打模型,也會真的把專案部署到 Vercel,用到一堆 secrets,所以外部貢獻的 PR 沒辦法直接測。流程變成小心地拉進 sandbox、確認不是惡意程式,然後用 Vercel 的帳號以共同作者的身分重新提交,才能跑測試。他說這確實很煩,還在想更好的做法。他們想要外部貢獻,也盡量收;Vercel 內部的 Eve Agent 每天在分析這些 PR,找出值得拉進來的。團隊規模從三月到七月中是兩個人全職,之後又加了四個人,現在工程端大約六個人全職在做。

押模型變聰明,以及開公司就是開 Agent

最後 KBall 請兩人談展望。Barba 說 Eve 很早的一個原則就是押注模型會越來越聰明,整個框架是為了吃到這件事而設計。他們看過很多 AI 框架往垂直方向長,程式碼越堆越多,最後看起來不像 Agent,反而像一堆確定性的 workflow API。Eve 要往水平長:多給模型一些東西,讓它自己做決定。目錄結構也是從這裡來的。他認為模型變聰明的速度短期內不會慢下來,Eve 會繼續往這個方向走。

Shah 的版本更大。他說他們的想法是「開公司就是開 Agent」:Eve 比公司的設立登記還根本,你的 Agent 會比你的網站、你的網域、甚至你的公司登記都早出現。你先有一個 Agent,它替你一點一點長出一座軟體工廠,包含完整的軟體開發生命週期;你的工作是去微調那座工廠。他認為 Eve 有機會變成公司的大腦。

最後一個問題是,如果真的拿這個東西開公司,能不能不放在 Vercel 上。Barba 說這件事對他們很重要,內部已經有客戶把 Eve 跑在自己的 Kubernetes 與自己的硬體上。做法是用 Workflow 裡的 world 抽象:他們的端到端測試就是拿不同的 world 在跑,有 Postgres world、有 local world。只要能替自己的基礎設施定義出一個 world,而外面已經有很多現成的,你就能自己託管 Eve。他說這方面還有很多工作要做。Memory、自我演化這些能力最終都需要 adapter 合約,框架本身不可能什麼都自己做;重點是這些 API 與 adapter 要在設計的早期就想到,而不是等 Vercel 上跑通了才當補丁加上去。

同一個模型換 harness,成功率差不多,成本可以差到五倍

https://harnesstax.github.io/

Claude Fable 5 在 SWE-bench Lite 上跑一輪,掛 Claude Code 的成功率是 97.8%,掛 Pi 是 96.7%,差 1.1 個百分點。但成本是 $1.33 對 $0.67,整整兩倍。

同一顆模型、同一個 benchmark、同一批隨機抽出來的任務,多付的那一倍,換到的大概就是那一趴。UC Berkeley 與 Arena 的研究團隊(Pan 等人,2026)把這件事叫做 harness tax:接受一個 coding agent 預設附帶的 harness,沒拿去跟別的比,於是不知不覺多付的錢。他們把問題問得很直白:換一個 harness,同一顆模型能不能解掉更多任務,或者把成本壓下來?

這篇要看的是配對。同一顆模型換上不同 harness,成本跟成功率各會怎麼動。

21 組配對,兩個 benchmark,每一點跑三次

研究比了 21 組 model–harness,涵蓋七顆模型、三個 harness:Claude Code、Codex CLI、Pi。Benchmark 用 SWE-bench Lite 跟 Terminal-Bench 2.0,每個 benchmark 隨機抽 30 個任務,每一組配對在每個任務上重複跑三次,每次嘗試上限 100 個 agent turns,effort 都採各 harness 自己的 high 設定。Turn 數與 effort 的定義,三個 harness 各算各的。

成本用同一份 direct-API 價目表算,日期是 2026 年 9 月 1 日,同一顆模型跨 harness 用一樣的價。任務算不算成功,交給兩個 benchmark 各自的官方 evaluator 判定。統計上先對每個任務的三次嘗試平均,再對 30 個任務平均,95% 信賴區間用 10,000 次 bootstrap 重抽。

控制條件也交代得細。SWE-bench Lite 把任務 container 的對外網路封掉,Claude Code 跟 Codex 的預設 web tools 關掉,並在 API 層拒絕 hosted tool declarations。Pi 那邊另外加了兩個 package,用來設定 subscription key 跟控制 agent turns。Kimi K3 走 Fireworks AI,三個 harness 都用這顆模型單一的 native thinking mode。

成功率的差別,落在誤差範圍裡

最主要的發現是這個:harness 對成功率的影響小,對成本的影響大。

平均來說,換 harness 對成功率的影響,在 SWE-bench Lite 上大約在正負 2% 以內,在 Terminal-Bench 2.0 上大約正負 5% 以內。成本不是這個量級。同一顆模型可以在成功率差不多的情況下,成本差到 5 倍。用幾何平均算跨模型的成本比,Claude Code 在 SWE-bench Lite 上大約是 Pi 的 2.0 倍、Codex 的 1.6 倍;到了 Terminal-Bench 2.0,大約是 Pi 的 1.5 倍。

5 倍這個說法不是拿單一案例硬撐出來的。研究自己公開的圖表資料裡,GPT-5.6 Luna 三個 harness 之間,最貴跟最便宜差了大約 5.09 倍。

錢多半花在第一個呼叫

要問成本差從哪裡來,研究去看每次嘗試的 turns、第一次主要模型呼叫的 context,還有完成的嘗試各自花了多少。

先看 turns。Fable 5 在 SWE-bench Lite 上,Pi 跟 Claude Code 平均每次嘗試是 15.4 跟 15.3 turns,幾乎一樣。但 Claude Code 貴了差不多兩倍,成功率只多 1.1%。多繞幾圈解釋不了這個差距,每一圈本身的成本才是重點。Turn 的定義三個 harness 不太一樣,這個數字要照各家自己的定義讀。

再看第一個呼叫。七顆模型平均下來,Claude Code 的 mean initial context 超過 Pi 的 10 倍,來源是更長的 instructions 跟更大的 tool schemas。同一批圖表的均值長這樣:Pi 大約 1,972 tokens、4 個工具;Codex 大約 11,308 tokens;Claude Code 大約 27,011 tokens、23 個工具。第一輪就先付一筆,後面還有 caching、生成 token 跟之後的呼叫繼續疊。

四把工具也能站上 Pareto

再來是簡單的 harness。研究說它也可以很有競爭力。

Pi 是個 minimal、open-source 的 harness,只給四個工具:read、write、edit、bash,卻在兩個 benchmark 上都站上 Pareto frontier。同一批圖上,Codex 也常在成本較低的位置拿到跟 Claude Code 相近的成功率。開源模型這邊,Kimi K3 在 SWE-bench Lite 上靠近 Pareto、接近 GPT-5.6 Sol,在 Terminal-Bench 2.0 上則略低於 Pareto。

研究把意義講得滿直接:想做 SOTA harness 的研究,不一定得拿到別人的專有 harness,也不一定要跟模型一起 co-train,用現成的模型就能做實驗。

自家 harness 沒有保證

最後一個發現比較刺:模型掛在自家 harness 上,不保證是最好的配對。

OpenAI 就講過 GPT-5-Codex 是為 Codex 裡的軟體工程最佳化的。但研究數了六顆 Anthropic 與 OpenAI 的模型、乘上兩個 benchmark,一共十二次比較,其中九次是替代 harness 拿到該模型最高的觀測成功率。

例子有兩個。Sonnet 4.6 在 SWE-bench Lite 上,Codex 是 68.9%,Claude Code 是 66.7%,成本差不多。GPT-5.6 Sol 在 Terminal-Bench 2.0 上,Pi 是 83.3%、大約 $0.42;Codex 是 78.9%、大約 $0.76,等於用一半左右的成本拿到更高的成功率。

作者下的結論是:模型的能力是可攜的,換 harness 也帶得過去。真正該問的不是「誰家的」,而是這顆模型配上這個工作負載,哪個 harness 的成本跟成功率最平衡。

讀的時候要留的邊界

研究自己列的限制要一起看。結果只限於這兩個 open-source benchmark,而模型在訓練時可能看過它們。換到別的 benchmark 或別的工作負載,結果可能不一樣。

harness 功能多,在別的模型、別的負載,或者需要來回互動的設定裡,還是可能有用。harness 的複雜度該當成一個要靠實驗回答的取捨,多與少各有代價。

還有一件事要放對位置。這不是模型排行榜。GPT-5.6 Luna 在兩個 benchmark 上都是成本最低的,Claude Fable 5 在 SWE-bench Lite 上成功率最高,但這些模型在不同 harness 之間,沒有出現什麼明顯的表現差異。研究團隊說之後會公開 profiling traces,目前還沒看到釋出。

harness 是一個要選的東西,預設值不是答案

挑一個 coding agent,其實是同時在挑模型跟 harness,即使你心裡想的只有模型。當 harness 對成功率的影響落在前面那個區間、對成本卻可以差到 5 倍,預設值就不該是最後的答案。

研究團隊往後看的方向是:日常任務裡,coding agent 基本上就是接上模型的介面,負責管 context、開工具、把任務執行完。模型越強,今天這些鷹架可能越不需要。通用型 agent 該把成本效率跟可靠度放前面,因為很多任務並不需要那些花俏的加掛功能。真的碰到模型能力邊界的難題,例如科學發現,harness 提供結構化引導、幫忙評估候選、從回饋裡學,還是有它的價值。

作者也講明了,這些設定不該丟給使用者自己扛。在那之前,能自己先做的,是把同一顆模型在不同 harness 上的成本跟成功率擺在一起看,而不是接受預設值,然後在帳單上發現它。

Grokbot 直播 Day 2:agents 勸退了快閃店,他們改用 Grokbot 模板做對戰遊戲,一天內做出能玩的原型

https://x.com/i/broadcasts/1PKqrNyvmYwGb

第二天開播,主持人還在自我介紹,前一天做的生意就已經被丟掉了。下手的是他們自己養的一群 agents。

這是 Grokbot Galaxy 三天直播的第二天,存檔長度 8 小時 23 分。三位主持人 Matt、Roshan、Lauren(她在直播裡自稱 Potato,PStack 與 Potato Mode 都是她那套 plugin 裡的東西)先 recap:Day 1 他們決定做一間體驗式快閃店,花了一整天談願景、把帳號設定好、丟出幾個原型跟 demo。過了一個晚上,這個點子被放棄。理由是舊金山的許可、執照與營運細節太多,兩天內做不完,前一天的來賓也提醒過同樣的難度,而且把這些流程直播給觀眾看並不有趣。直播裡的原話是:「the agents told us to pivot.」他們讓 agents 跑了一整晚,收回來的回饋指向同一個結論。

新的方向是遊戲公司。做法是把觀眾自己的 Grokbot template 變成可以互相對戰的角色。也就是說,這一天真正在演的不只是「做一款遊戲」,而是一間公司在觀眾面前被自己的 bots 推著轉向,然後在一天之內生出一個能玩的東西。後面八個多小時的事,大致都能掛在這條線上。

模板 mint 成角色:三個屬性、一個一百點的池子

Grokbot template 是把一個 bot 分享出去的形式,裡面有它的技能、routine、挑選過而不會洩漏私人資訊的記憶。別人拿到你的 template,等於拿到你調教出來的一套能力。遊戲的輸入就是這個:玩家匯入 template,系統把它 mint 成一個角色,附上頭像與能力,然後進到隊伍裡。

讓這件事成立的第一個設計是屬性。白板上談定的機制是這樣:每隻 bot 有三項屬性,Charisma、Dexterity、Intelligence,加起來固定在 100 點的池子裡,分配方式是用 LLM 讀 bot 的描述。偏社交、負責協調人的 bot 吃高 Charisma;到處串接服務、動來動去的 bot 吃高 Dexterity。單項的邊界是 1 到 98,不能是 0,也必須讓三項湊得滿 100。分配要是 deterministic 的:同一個 template 每次 mint 出來都是同一組數字,角色才能固定下來被討論、被分享。

另外每隻 bot 會帶一個能力,能力綁在其中一項屬性上,而且要有名字。他們不想讓畫面上出現「charisma ability」那種太工程師的標籤。

稀有度:分享帶來的平衡難題

屬性談完,下一個設計是稀有度。他們拿 Diablo 那類動作 RPG 的掉寶當比喻:base、rare、ultra、legendary,稀有度會把 100 點的池子往上加,討論時提到 150 是上限。有人在白板前當場宣布 Doctor Eggbot 必須是 legendary。

麻煩的地方在於 template 是可以分享的。如果同一隻 bot 的數字固定,只要有人把一隻傳奇丟進聊天室,全場都會把它塞進自己的隊伍。他們想過把稀有度跟 bot 的身分拆開:同一個 Doctor Eggbot,稀有度由每個人各自 roll。V1 暫時不拆,先接受「到處找強 bot」本身變成一個 meta 遊戲,之後再調。另一個被砍掉的是 re-roll:隊伍組好還能重抽的話,玩家就會一直按到三隻傳奇為止,討論的共識是不要 re-roll,或讓玩家只選隊長、另外兩隻先盲選。

MVP 的對戰迴圈:單回合、拖曳排序、Elo

流程本身可以畫成一條線:匯入或生成 bot,選一隻當隊長,湊成三隻一隊,拖曳排順序,配對上另一組隊伍(對手的 lineup 事先排好,你看不到),結算,看結果跟 Elo 變化,最後上排行榜。

相剋走石頭剪刀布那一路,三項屬性互相壓制,預設的優勢加成是 22%,而且這個數字就掛在 debug 面板的 slider 上,可以當場拉、當場重打一場看感覺。實際驗證時真的翻過盤:那一場 Doctor Eggbot 用 Dex 對上 Int,被 22% 的優勢吃掉,原本領先的專案經理 bot 從 18.3 反超。

戰鬥在配對完成的那一刻就結算完了,畫面上演的是已經決定好的結果。他們覺得這樣反而好:機制不用等畫面,動畫可以之後慢慢加。V1 決定打單回合,一局定生死,可以重播;多回合、HP、lane 策略都先擱著。UX 上還有幾個明確待辦:回合結果要自己往下跑,不要讓玩家一直點;玩家幾秒沒動作就自動找下一場;那個「finding match」畫面最好快到沒有人看得到。

Elo 對他們來說就是贏了會加分的西洋棋積分,對手強弱會影響加減幅度。Lauren 說她沒設計過 matchmaking,只能參考像 Marble Rivals 這種有公開論文的做法。排行榜 V1 的決定是「keep it really stupid and simple」:直接按 Elo 排名,先不分階級,之後再補 Bronze、Diamond、Platinum 這種 tier、獎牌,還有「滑過去看數字」的互動。收播前他們各自登入,兩個人都顯示 gold、1000 分,同時發現排行榜沒把登入的使用者列出來,也是那時還開著的 bug。

Potato Mode:先做一個丟得掉的版本

前半天的關鍵字是 Potato Mode,PStack 裡的一個 skill。Lauren 的說法是它像 router:本身沒幾條規則,負責把不同情境導到對應的原則上。其中一條叫 experience first,實作方便不重要,使用者覺得好才重要;另一條更要緊,設計決策在丟得掉的 HTML 裡,比在 production code 裡便宜。

第一個原型就是這樣長出來的:不要登入、不要資料庫、狀態放本機、純 HTML/CSS/JS,配上 debug 面板跟一排 slider,遊戲常數可以當場拉、當場重打。他們跳過架構 skill,理由是現在只想知道好不好玩,不需要架構。同一輪裡,那個架構 skill 原本會叫四個模型各自出計畫,這次被略過;原型最後做了三種 UI 變體可以切換。他們的標準也很一致:這東西不好玩,其他都不重要。

從 HTML 到 Next.js:客戶端與伺服器為什麼要拆

下午原型被改寫成 Next.js 的 React app,客戶端與伺服器拆成兩個應用。拆的理由有兩個,第二個比第一個有意思。第一個是競技遊戲不能讓玩家改客戶端就作弊,配對與戰鬥結算應該由伺服器決定。第二個是拆開之後,同一個 backend 可以接好幾種客戶端實驗,2D、2.5D、3D、pixel art 都能各自去玩。

到收播前,X 登入可以用了,Elo 會存、打完看得到分數變動,全球排行榜接上了但還是佔位用的假名字。還開著的是那個擋住加 bot 的 bug:能登入、能看排行榜,卻還沒辦法把 bot 加進隊伍。

中間還有一件事值得記下來。他們發現有些測試在擋路,而且 agents 寫測試的表現並不好,於是決定把測試刪掉,先出貨,等核心功能穩了再補回來,之後再開一個專門顧效能與可維護性的 code quality factory。

不要文字湯:畫面、動畫,還有最後才想到的聲音

機制簡單,所以畫面要扛。目標是不要文字湯:滿版、視覺主導、一眼看得懂。參考對象是 Super Auto Pets 那種輕、好玩、可讀的調性,先做 2D,3D 當下一階段。技能圖示用 Grok Imagine 生,bot 本身先用程式碼畫;卡片上的 shimmer 一度太刺眼要收斂,卡片旋轉時數字必須黏在卡上,不能飄走。

動畫被當成核心工作,因為機制本身只是石頭剪刀布加幾個數字,好不好玩有很大一部分取決於打起來長什麼樣。3D 與 2.5D 的原型不是人寫的:他們用 Doctor Eggbot 加上 Cursor Cloud agents、Potato Mode,開了一隻叫 Glow 的 3D prototyping bot 出去試,做出 2.5D tape clash、Slam 3D 之類的東西,其中一個動畫跑得太快。有人建議下次直接叫 agent 用 Three.js,結果會好一點。

聲音是最後才想到的。發現整個遊戲沒有音效之後,他們當場加了一個任務,長出一隻叫 Tone 的音訊 bot,去試 lobby、draft room、battle 三個場景的 8-bit 與 whimsical 風格,素材包括 Strudel 做的曲子,以及 Suno 的 prompt 跟成品,全部丟進 Notion 讓大家聽。篩選標準很明確:太 calm、太 somber 的不要,要活潑、要高能量。

不做 pay-to-win,那錢從哪裡來

錢的問題在第一天就被提出來,答案很乾脆:不做 pay-to-win,付錢的人不該買到比較強的角色。能賣的是外觀與場景,帽子、造型、用 Grok Imagine 生的獨特道具、不同的戰場或競技場,還有一種球場看板式的廣告,不影響玩法、只吃眼球。他們對這件事的想像很具體,直播裡有人說「我願意為一頂帥帽子付一塊錢」。再加上可以分享的 replay 連結,觀眾也能變成流量。

廣告 MVP 當天下午開始長:贊助的大廳看板、campaign 與 creative 的資料模型、serving 的 endpoint。看到 agent 開出來的計畫之後,他們的反應是「這有點太複雜」,決定先把範圍砍小。定價、審核、schema、平台策略全部未定,第一批廣告主可能是直播觀眾、朋友與人脈。

GTM 也沒有停在口號。直播本身就是通路,再加 landing page、SEO、A/B test、X、Reddit 的小眾板、TikTok(前兩三秒是關鍵)、LinkedIn,Instagram 被判斷不適合這款遊戲。廣告素材用 Remotion 以程式碼生成,1:1、直式、橫式三種比例;同一個做法先前用在團隊的 motion 素材上時,agent 寫了大約 6,000 行 Remotion 動畫程式碼,這次換成遊戲的廣告素材,過程還撞到本機 port 衝突。Landing page 最後的結論是 hero 加一顆大大的 Play,然後才進 X 登入,所以登入與 waitlist 這件事直接從 V1 拿掉。

這間公司自己也是 bots 在跑

遊戲只是產品,旁邊那套營運才是這一天的另一條線。Notion 被指定為唯一真相來源,Chief of Staff bot 開了一張 Kanban,他們叫它 cupcake board,欄位是 not started、up next、in progress、done。bots 自己把票從 up next 推到 in progress、再推到 done,人在旁邊看著它動。Slack 那頭接上 @mention 與 DM,bot 發訊息前先給你看草稿,避免亂噴。Founding Engineer bot 盯著 GitHub,PR 一開就通知。人類 merge 是瓶頸,所以他們想往 full autopilot 走:agents 建 feature、agents play-test、agents QA、agents 開 issue,最後用 CI gate 把安全的合併自動吃掉。Cursor Projects 被當成長時間跑的 coordinator,可以生 sub-agents 共用記憶。

還有一隻叫 Crumb 的 play tester bot 會自己點進 app 找 bug,但還沒學會回答「這好不好玩」。他們想要的是 feedback factory,把玩家那句「這很無聊」自動分流進 Notion 再排優先順序。另一隻 Comment Sicko 專門刪掉多餘的註解,因為 agent 很愛用註解掩蓋沒修好的根因。guardrail 也已經在動:OnePassword 整合當天宣布,企業端可以封鎖特定網站,bot 要部署到 production 的行為改成 ask first。費用有兩個具體數字,中型到複雜的客服 ticket 大約 1 到 2 美元,低複雜度的批次處理可以壓到 0.2 美元左右。

同一批 bot,換到別人的場景

這一天排了很多 workshop,全部寫完會變成流水帳,但有一條線值得留下來:遊戲裡發生的事,跟其他人用同一批 bot 在做的事,是同一個模式換場景。

Amrita 是 Cursor 的 field engineer,她示範 sales engineer 怎麼用 bot 組一個小隊。Mimi 讀 blog 與客戶情境,生出固定格式的案例投影片,欄位是 logo、problem、solution、impact、quote,包含 Salesforce 把 legacy code coverage 時間砍掉 85% 那則;Sherlock 直接讀 repo 回答客戶的技術問題,例如 Flylo 這個訂位 demo app 怎麼用 Postgres 擋掉重複訂位的 race condition;Serena Williams 在自己的電腦上操作對手的產品做競品研究,跑過 Expedia、Skyscanner、Google Flights、Southwest、Spirit。三個 bot 可以進同一個 group chat 收斂結論,Sherlock 還自己生了 Battle Card Blair、Demo Drake、AI Radar 這幾隻專用 bot。她補了一句很務實的觀察:MCP 現在比 computer use 快,也比較好加 guardrail,但 computer use 會愈來愈重要。

同一條線上還有 Nokia。播出的客戶影片裡,一位產品與工程主管說他們有一條 5,000 萬行以上的產品線,手動盤點不現實,改用 Cursor 做初步分析,原本估要十幾位專家、好幾個月,實際上是兩個人、幾週。這是他的說法,不是被稽核過的數字,但他接著講的方向值得注意:工程師的角色會變成監督 agents 做規模化的工作。同一場的 sales、SDR、客服 workshop 是同一個故事的幾個版本,連客服的導入建議都是同一套順序,先 read-only,再開 write 但保留審批,然後才按 bot 與動作切權限。

個人使用的段落更有畫面。Karen X Cheng 做了一個每天早上自動印出來的個人報紙,網址是 newspaper.karenx.com,內容有會議、包裹、天氣、訂閱、地方活動、漫畫、crossword,用 WeasyPrint 排版,自己在 Wi-Fi 上找到印表機就印,預設排除財務與醫療細節。她的包裹追蹤 bot 一天查兩次 email,東西快到了就查得更勤,會登入 Amazon 截「還有幾站」,再把更新丟到 split-flap 看板上。她說她用 Cursor 做這些事時一直覺得自己是冒牌貨,同樣的事換到 Grokbot 門檻低很多,唯一想許願的是 VM 與服務之間的登入狀態不要一直斷。直播裡也有人拿它去讀 12 個月的電費帳單,找出適合電動車的方案,估一年省 1,000 美元。Matthew Berman 的 Family Bot 摘要學校與球隊的長信、抓出 RSVP、把事件塞進共用行事曆、偵測撞期,還會學「早上不要排會議」這種偏好,跟太太用 Telegram 共用;他拿同一套邏輯去賣 PlayStation、MacBook 與登山車,bot 做比價、上架 Facebook Marketplace 與 eBay、回買家問題,該問本人的時候才問。他自己下的結論是,個人用法幾乎可以直接對應到公司流程。

收播時的帳:什麼會動了,什麼還開著

收播前他們重新點了一次進度。從沒有 app 到有 app:Next.js 的客戶端與伺服器拆分、X 登入、會存的 Elo、接上但還是佔位的排行榜、可以玩的單回合核心迴圈、三種 UI 變體、landing page 的 hero 與 Play、被 bots 推著跑的 Notion Kanban、Slack bot、盯 PR 的 engineering bot、三種比例的 Remotion 廣告素材、2D 之外的 3D 與 2.5D 原型、Tone 的音訊實驗,還有那隻會刪註解的 Comment Sicko。

還開著的也列得出來。加 bot 的 bug 沒修;排行榜沒列登入的人;遊戲名字還沒定,工作名稱是 Cupcake;配對與戰鬥還沒完全搬到伺服器端,anti-cheat 的威脅模型與 auth 都還沒做完;稀有度與 re-roll 的規則懸著;廣告的 schema、定價、審核沒定;GTM 的受眾與 KPI 沒有答案;測試刪掉之後要怎麼補回來;人類 merge 的瓶頸還在;Crumb 還沒學會講遊戲好不好玩;Notion 的權限與 Slack 的發言規範要再收斂。

他們在直播裡也順手推了兩個活動:分享自己最好的 Grokbot 模板可以抽去 Starbase 看 Starship 發射,9 月 29 日截止;前 1,000 名用 Doctor Eggbot 複製並建立 bot 的觀眾,拿價值 200 美元的一個月 Grokbot。這兩個活動跟遊戲的關係很直接,因為這款遊戲的原料,就是大家願意分享出來的模板。

收播時他們說的是隔天要回來把遊戲部署出去,直接開給聊天室玩。以那一天的進度,這句話不算吹牛。只是在那個當下,他們連把一隻 bot 加進隊伍都還做不到。從白板到能玩的東西,一天確實夠;要讓它好玩、平衡、擋得住作弊,還要有人願意掏錢買一頂帽子,那是還沒發生的那一天。

〈Grok Bot〉-EP-Day 1: Grok Bot Galaxy Livestream

https://x.com/i/broadcasts/1AxRnZbVpjaxl

三個人、三天、一個空到不能再空的 GitHub 組織,還有一條規矩:做出來的東西要有人願意付錢,而且錢要真的進到公司帳戶。這是 Grok Bot Galaxy 直播的 Day 1,場景在舊金山 Moscone Center 旁邊的攝影棚,同一週整座城市在辦 Dreamforce,街上多擠進了大約五萬人。

主持人 Matt Palmer 做開發者體驗與使用者教育,Lauren 在 X 上叫 Potato,負責 Grok Bot 的工程跟效能,Roshan 在 SpaceX AI 做產品。開場沒多久他們就承認:要做什麼生意,還沒決定。接下來八個多小時,畫面上同時跑兩條線。一條是三個人在空白的 GitHub 組織裡真的開始蓋東西,另一條是輪番上場的 Grok Bot 課程,從工程、產品一路講到創辦人跟通路。

三天做一間公司,不是再做一個 demo

起始條件乾淨到有點殘忍。全新的 Grok Bot 團隊,裡面零隻 bot;完全空白的 GitHub 組織;沒有題目,還說好要把犯的錯也播出來,不會只剪成功的部分。

成功的定義倒是先講清楚了:東西要有用、要有人想要,要自己敢用,最後要有美金流進銀行帳戶。他們不想再端出一個看起來很炫的軟體 demo,要的是三天結束時真的能動的一間公司,而 Day 1 至少要先長出一個講得出口、撐得住的想法。

GitHub 組織取名叫 Ship by Thursday,網址 github.com/shipbythursday。開播時它「完全空的,你點進去什麼都看不到」,第一個工作用的 repo 先設成 private,怕不小心把半成品推出去。後來 Slack、Notion、Vercel、PlanetScale Postgres、Resend 的網域驗證、Cursor 存取權、shipbythursday.day 陸續接上,公司的骨架先搭起來。直播中間一度有大約八萬人在線上看。

比賽:把 bot 模板交出來,換一趟 Starship

整場直播穿插一個公開比賽。要參加的人,把自己的 bot 模板分享出來,講清楚你是怎麼把 Grok Bot 用進工作裡:在 X 上引用官方貼文,附上 bot 的說明和模板連結,細節看 @Grok 和 @Bot 兩個帳號,或直接去 x.com/grok。

獎品很 SpaceX。最大獎是得主加一位同行的人,一起去 Starbase 看 Starship 發射;二獎是去 Hawthorne 參觀火箭工廠。投稿在 2026 年 9 月 29 日截止。同一週的課程全部免費,時程掛在 x.ai/galaxy,他們在台上講得很白:「沒有要付費的課,你現在看的這個畫面就是課程。」

三位主持人平常怎麼用

Matt 示範的是他自己最常用的一條流程。有一隻 bot 專門盯著他的 X 書籤,看到有趣的套件或新技術,就自己去開一個 Cursor cloud agent,做出小範例,再生成一個預覽部署。隔天早上他收到的訊息長這樣:這是你昨天存的那個技術,這裡有一個已經部署好、可以點的版本。

Roshan 想示範完整的 zero-to-one。先去外面撈資料、看大家在講什麼,找出使用者真正的痛點,安排訪談,做可以丟掉的 prototype,再讓設計、行銷、工程的 bot 一起動起來。他反覆提的一點是,現在寫程式的成本很低,難的是把使用者故事想清楚。

Lauren 平常會用一隻 bot 盯著 X 上所有提到「potato」的訊息並且回覆,因為手動根本回不完。她主業是 Grok Bot 的工程,對效能特別執著。她把自己做嚴格工程的一套 Skill 和工作流整理成開源 plugin「PStack」,放在 Grok Bot Marketplace 上給大家用。上個月(八月),她靠 PStack 送進兩千五百個 PR 到 production,「我不覺得我造成了任何 bug,希望沒有」,換算下來一天大約 83 個 PR,台上還開玩笑說要在直播畫面上放一個 PR 計數器。這次建置她連 PR 都懶得開,直接 merge 進 main;用她的說法,repo 要讓 PM 跟設計師也能貢獻,而且預設就是好的。

Grok Bot 101:bot 是同事,不是一次性任務

課程由 Roman 和 Amrita 開場。他們把 Grok Bot 放在 chat、copilot 之後:不是丟一個任務,而是給你一群有記憶、有責任範圍的隊友。三個核心是 bot 像同事、有自己的電腦、全部跑在雲端。有自己的電腦很關鍵,遇到沒有 MCP、沒有 API 的網站,它照樣能操作,看影片、聽 podcast、填 Google 表單,甚至 1990 年代的政府系統;跑在雲端,流程才不會因為你闔上筆電就不動。他們也解釋為什麼要計較「做完」:以前 agent 衝到 90% 就停下來,剩下 10% 要人接手,現在要的是一路做完、你能放心丟給它。

Amrita 在台上開了一隻新 bot:Data Dan。她用語音要它開一份 Google 表單,問一天喝幾杯咖啡、最喜歡哪家舊金山咖啡店,選項放 Ritual、Fields、Sightglass、Blue Bottle。bot 在自己的 Linux 虛擬機裡操作表單,還生了 QR code;第一版掃了沒反應,因為表單沒公開。Amrita 只跟它說「大家掃不到」,bot 就自己找到分享設定修好。她的重點是:講清楚症狀跟你要的結果,比下指令有用。

第二隻 bot 是 Slide Sonia。Amrita 示範「Teach a Task」:她接管 bot 的電腦,示範一次怎麼在 Google Slides 裡做飛入動畫,那段錄影就變成可以重複使用的 Skill。她還示範 routine:每天早上九點,幫我整理這份跟同事共用的簡報有哪些改動。

第三隻是 Email Ethan,負責對外寄信。它先讀 Amrita 過去的信學語氣,再跟 Data Dan、Slide Sonia 要資料,草擬給外部利害關係人的信,寄出前一定先問;想換口氣就複製幾隻,對高層、對使用者、對內部團隊各一隻。這些 bot 會互相傳訊息,也能進同一個群組聊天;Email Ethan 自己想到去要咖啡資料,再等 Slide Sonia 的大綱。Amrita 另外開了一隻 manager bot,每兩小時跟三位專家要一次進度。

權限上,Grok Bot 用一個自動審核的分類器決定哪些動作要問人,使用者可以加嚴,例如「就算只是在我的桌面開一個新資料夾,也要先問我」;示範時表單那隻 bot 一直在討批准,因為系統會檢查有沒有牽涉個資或健康資訊。企業設定裡,每隻 bot 的電腦彼此隔離,可以用憑證或 VPN 進內部系統,1Password 的整合會用彈窗給憑證,不會把密碼攤在虛擬機上;記憶存在雲端、可以叫它忘掉,複製一隻 bot 則保留人設、記憶清空。真人跟 bot 混在同一個群組聊天還在開發中,Slack 對話串已經做得到。

第一天的生意:從觀眾留言裡挖題目

前一天他們在 X 上問大家「我們該做什麼」,收回來數千則回覆,交給一隻叫 Marky McMarkface 的市場研究 bot 讀完、分類。回饋很集中:不要再做通用的 SaaS demo;做實體、做在地、做給不那麼懂技術的人;幫傳統小生意處理重複的營運雜事。點子從油漆、園藝、餐廳、到府晚餐到懷舊體驗都有,也有人直接說不要碰迷因幣。

Lauren 拿她媽媽當測試標準:這東西要連她媽都看得懂,因為她媽「連自己的 email 都不太會用」。他們喜歡的方向是:客人看到的體驗很簡單,困難的物流跟雜事全部丟給 Grok Bot。餐廳營運助手很快變成領先的候選,例如餐廳經理早上收到一份簡報,裡面有訂位狀況和今天哪些菜沒了;老闆監控並回覆評論;小生意把每週重複的雜事自動化。這個題目同時有實體活動跟一套系統,兩邊都能示範。

Peter Yang 上線時把話說得很直。他建議設計成自己喜歡做的工作,因為為了營收去做討厭的事,創業就失去意義。他最核心的一點是市場訊號要快點拿到:嘴上說好不算數,有人真的掏錢才算。他也提醒,點子很便宜,不要愛上第一個想法,團隊比點子重要;landing page 要真的送到買家面前,直播觀眾不一定有足夠的餐廳老闆;純軟體越來越難收錢,有實體或服務的成分,才比較有付錢的理由。他的 bot 每週五會用編號清單跟他回報。

Lauren 的幕僚長 bot Steve 給的建議最冷靜:現在缺的不是 landing page,「第一個循環是找到場地、找到會做或會賣食物的人,觀眾自然會來」。他們接受了這個順序,先把事情用手做一遍,再從痛苦的地方長出軟體。第一個完整概念因此成形:在舊金山辦一場食物 pop-up,加上一套「pop-up 作業系統」,連起主辦或廚師、場地、客人三種人;形式可能是售票的私廚餐會、限定餐廳、薯條攤,或讓餐廳老闆測試概念的平台。網站先切兩頁,一頁給餐廳跟活動主辦,一頁給自己這場活動的客人。

Lauren 的工程小隊也在這個時候組起來,名字從 Steve、Plaud Note 到 Tater、Hashbrown、Dr. Plaud Note,有幕僚長、有做可丟棄 prototype 的、有寫程式的、有審 PR 的,還有一隻生產其他 bot 的 bot 工廠。可以丟的 prototype 直接在 bot 介面裡 render,認真的工作進 Cursor cloud agent。她開了 Slack 的 PR review channel,讓 Cursor automation 檢查 PR 的正確性、風險跟缺的測試,會用 Playwright;另外規劃 bug report channel,讓回報的問題自動進入診斷跟修復。她也裝了 PStack,開始寫一個可以重複使用的驗證 Skill:agent 要自己去跑應用、收 trace、抓 heap snapshot,把證據附上來,而不是叫人在那邊一格一格點。她也刻意不在一開始就加太多 lint 跟架構,因為生意可能轉向;語言最後選了 TypeScript。

穿插整天的課:工程、產品、創辦人、通路

Ling Shi 講怎麼把多個 Cursor cloud agent 當工班管:她過去兩個月只用 Grok Bot 寫程式,手機版第一版是自己一個人三週做出來的,同時開過 15 個 cloud agent,後來最想要一個 agent 幫她盯其他 agent。她的排程包括凌晨三點掃 repo、CI 紅燈自動開 agent 修、on-call 撐到十分鐘才叫人、P0 每五分鐘檢查一次進度,看到 sleep 300 這種空等就打斷。她的結論是:把 bot 當聰明但沒有組織背景的實習生,重複的指令要變成 playbook 或 routine,每個任務都要有完整的回饋圈。

Kevin DiParco 跟 Roshan 用虛構的航空公司 Flylo 示範產品流程:資料科學家 bot 撈出前一天一千四百筆購票,58% 在網頁、42% 在手機;大家猜手機流失是因為選位,它糾正最大的流失在搜尋到選票價那一段。接著需求文件、兩個 Figma 版本、觀眾投票、工程 bot 開 Cursor cloud agent 準備 PR,整條鏈跑完;他們也提到 Grok Bot 在內部已經占掉兩位數百分比的 merge PR。

Shab 講創辦人版的三隻代表:CloseBot 準備客戶電話、讀完逐字稿學哪些說法有用;ProdBot 每天回報 shipped 了什麼、拿掉了什麼,附截圖跟指標;StockBot 研究競品,用免洗信箱註冊、讀 changelog、看徵才,還會問流失客戶為什麼走。他的原則最實用:能用 API 就別一直開瀏覽器,十五分鐘一次的 routine 等於一天一百次要審,寧願用 webhook 也不要盲輪詢。

Cody Sanchez 講通路:決定要做什麼之前,先試著把這個生意賣給三個人;大部分公司拿不到創投資金,通路才是護城河,而「我看過的 AI 公司活不下來,最常見的原因就是沒有通路」。她說自己曾照著「找 A 級人才,然後不要管他們」做,結果那是一間一百五十人公司差點發不出薪水的唯一原因。她主張從第一天就存「proof vault」,見證、觀看數、截圖、成長紀錄全部留證據,也提醒先做五、六個真的有用的 lead magnet 丟到 X 上測。最後一句:「你把它蓋好,我保證,他們不會自己來。」

Jenny 則是把生活 bot 化:七個生意、二十二隻 Grok Bot,身邊還有一個嬰兒。她的公司 Gemalin Media 做高階主管品牌,Master Chief 是跨生意的幕僚長,下面有 Boxy 盯信箱、Scribe 做會議紀錄,還有一隻在 Poshmark、Depop 上幫她賣二手衣、跟買家談價。她的方法很一致:先自己當人做一次,再反向工程成 bot。

活動規劃的現實檢查

Jenny 做過大型 pitch 比賽,直接拿問題清單對著他們問。要在舊金山辦一場一百到兩百人的 pop-up,事情比想像中多:場地是倉庫還是藝廊、晚上還是白天、要不要賣酒、廚房在現場還是找外燴、很多場地只准用指定外燴、報到跟保全還是要人、至少要有麥克風跟音響。不賣酒能讓許可單純很多,但他們還是想要熱食。她的建議是:先找到一個很讚的場地,再順著場地的限制調整。

他們連預算都還沒編。Jenny 說,先讓 event planner bot 生一份舊金山活動的製作預算,場地、餐飲、人力、製作、音響全部列進去,再去談場地。她提了一組活動 bot:場地 scout、預算 bot、問檔期跟談價的 RFP bot、研究法規的 permit bot、管合約的 policy bot、找名單的 invite bot。她也提醒,AI 看合約大概就是「法律系二年級」的水準,真的要簽還是得找律師。

現實層面,他們看的是容納一百人左右的倉庫型空間,例如 The Pearl、Dogpatch Studios;Fort Mason 這種公共場地要先過審,四到十五個工作天跑不掉。他們先押了 10 月 15 日當暫定日期,但沒有定案,因為許可一個月前才開始跑「有點緊」。食物的麻煩最直接,場地、廚房、外燴、保險、酒牌每一項都是成本;他們一度想改成藝術展,倉庫更好找,找本地創作者一起展,做一個數位加實體的 Grok Bot 主題展,避開餐飲跟酒。這件事也沒有真的定下來。

從食物到周邊:概念一直換,換到收工還是沒定

後來 Eric 上線,把問題拉回產品。他是 Carrot Financial 的共同創辦人兼 CRO,說產品管理就是三件事:決定要做什麼、決定怎麼做、把做的過程協調起來;AI 讓第三件變得很簡單,前兩件還是要靠人。他認為做實體是對的方向,因為軟體跟 AI 內容越好複製,現場體驗反而越值錢。他也點出一個分岔:第一次做 pop-up 的新手,跟已經有店、把 pop-up 當行銷管道的店家是兩種客人,一個通用工具兩邊都服務不好。他們選了前者,拿自己當第一個客戶,題目變成:幫一個科技或 AI 品牌辦一場社群 pop-up,周邊商品就是讓社群願意來現場的理由;最小版本先想三件事:賣什麼、在哪裡賣、怎麼報名或賣票。

周邊清單一路亂聊:帽子跟帽T、馬鈴薯玩偶、Grok Bot 角色玩偶跟壓力球、SpaceX 發射照片、可以收藏的實體票、Build-A-Bear 式的自製 Grok Bot、Grok Bot 版 Tamagotchi,還有一比一的鎢球。其中一個想法是會連線的實體小物,顯示天氣、生意銷售或 Slack 有沒有動靜。這還停留在閒聊階段,Eric 的建議是只挑兩三樣做到極好。

Carrot 自己的路徑可以當參考:一開始只做創作者的銀行跟信用,等可以重用的金融原語出來,才擴到創辦人跟中小企業;pop-up 這個產品也可以先服務他們自己這一場,再把驗證過的部分一般化。對創作者,他建議把 bot 放在可以被驗證的商業流程上,例如找品牌合作、寄開發信、談價、想內容題目,因為結果好不好,比創意好不好容易檢查。

收工前,基礎建設其實都蓋好了:GitHub、Vercel、資料庫、寄信、網域、粗略的 landing page、報名資料的儲存、市場研究跟 outreach bot、工程跟 review bot、PR 跟 bug report 的自動化,還有一套正在長出來的驗證框架。生意本身沒鎖定。概念從餐廳營運助手,換到食物 pop-up,換到藝術展,再換到品牌周邊社群活動。他們在最後幾分鐘自己問了一句:「這是不是我們該解的題目?」在舊金山辦 pop-up 的難度比預期高,那天晚上要收斂到一兩個做得出來的東西,其他的交給過夜的 agent 繼續查。直播最後,他們說明天見,然後訊號就斷了。