AI代理安全始於小軟體
Matt Sephton於2026年4月發表《Fits on a Floppy》,刻意設下一個近乎荒謬的限制:有用的軟體應該嘗試放進1.44 MB,也就是標準3.5吋軟碟的容量。1
真正重要的不是大小上限,而是背後的取態。Sephton主張快速下載、即時啟動、低記憶體、低CPU、原生程式碼、支援舊系統,以及專注做好一件事的工具。1最直觀的解讀是:小軟體尊重使用者。放到代理時代來看,意思更進一步:小軟體讓AI程式碼代理更難把錯誤藏起來。
AI代理安全始於小軟體,因為小而可檢查的系統,會縮小代理可能誤解、錯誤修改、錯誤授權或漏測的空間。沙箱與權限提示仍然重要。小軟體則把安全邊界往上游推,推到成品本身的形態裡。
重點摘要
程式碼代理表現最佳的時候,是它能在脈絡退化前讀完相關檔案、執行相關檢查,並說清楚相關差異。Anthropic的Claude Code指南指出,脈絡會很快填滿,而且效能會隨著脈絡變滿而下降;同一份指南也把驗證稱為最有價值的實務,並將CLI工具描述為節省脈絡的介面。2OpenAI的本機shell文件也警告,會執行shell命令的代理,在執行前需要沙箱,或嚴格的允許與拒絕清單。3
小軟體不能取代這些控制措施。它讓這些控制更容易落實。小工具需要授權的命令更少、要檢查的檔案更少、要信任的相依性更少、要跑的測試更少,也有更少分支能讓錯誤假設藏身。古老的Unix教訓並未過時:McIlroy把「做好一件事」追溯到早期的大小限制,接著說明文字串流為何成為程式與人都能使用的通用介面。4代理系統重新發現同一個模式,因為代理需要可檢查、可組合的表面。
關鍵結論
給代理建置者: - 在加入寬泛的API或大型工具結構描述之前,先偏好輸入明確、輸出明確、產物採純文字檔案的小工具。 - 把檔案路徑、差異、日誌與測試視為安全表面。代理可以檢查,審查者可以檢查,自動化流程也可以據此把關。
給軟體團隊: - 小軟體降低審查成本。審查者可以一次讀懂一個400行工具與它的測試;龐大的框架則會在本該有證據的地方迫使人信任。 - 讓權限範圍貼近動作本身。小命令可以唯讀執行、只寫入一個資料夾,或拒絕網路存取。通用命令通常會要求比任務所需更大的權力。
給產品領導者: - 小軟體不是懷舊。它是一種治理模式,適用於機器能太快產生太多程式碼的世界。 - 標準應該從「代理能不能做出來?」移到「團隊能不能驗證、擁有,並回復它?」
為什麼小軟體再次變得重要
軟體膨脹過去看起來像使用者體驗問題:下載慢、記憶體吃重、啟動延遲、電池耗盡,舊裝置被拋在後面。《Fits on a Floppy》透過一個刻意具象的標準,讓這種批判變得可見。1.44 MB徽章把克制變成使用者能理解的測試。1
AI程式碼代理改變了克制之所以重要的理由。機器產生檔案的速度,可以快過人類閱讀檔案的速度。當周遭系統把產量當成進度,這種速度就會削弱品質。一個2,000行功能加上4個新相依性,在逐字稿裡可能看起來很壯觀,實際上卻可能比它增加的產品價值,更大幅增加缺陷表面。
小軟體給代理一個更難蒙混的目標,也給審查者一個更好的目標。提示可以要求一個可執行檔、一種資料格式、一個測試檔案,以及一條回復路徑。結果留下的自由度更少。模型仍然可能犯錯,但錯誤比較沒有空間偽裝自己。
Niklaus Wirth早在1995年就發表了名為《A Plea for Lean Software》的論文,遠早於程式碼代理進入工作流程之前。5這個標題今天仍然有力,因為底層失敗依舊存在:團隊花費硬體、相依性與抽象層,來逃避困難的設計決策。代理降低了新增程式碼的成本,因此拒絕新增程式碼變得更有價值。
脈絡就是安全預算
代理安全常被描述成權限問題:代理可以執行哪些命令、編輯哪些檔案、看見哪些秘密、發出哪些網路呼叫。這些問題都重要。但它們沒有涵蓋代理工作時最先碰到的限制:脈絡。
Anthropic的Claude Code最佳實務指南說,脈絡視窗會容納對話、訊息、已讀取檔案與命令輸出,而單次除錯會話就可能消耗數萬個token。2該指南也警告,隨著脈絡視窗填滿,Claude可能開始忘記較早的指示,或犯下更多錯誤。2
這項警告讓大小成為一種安全屬性。小型程式碼庫讓代理能讀完相關表面,不必讓會話淹沒在無關檔案中。小工具讓代理可以同時看見函式、測試、權限模型與邊界案例。小差異讓審查者能找到真正的變更,而不是掃過一堆生成出來的動作。
脈絡預算有3個實務限制:
| 限制 | 小軟體的回答 | 安全收益 |
|---|---|---|
| 讀取檔案 | 擁有行為的檔案更少 | 代理可以檢查實際路徑,而不是從名稱猜測。 |
| 輸出量 | 日誌更短、測試更快 | 代理可以把命令輸出當成證據,而不是丟掉它。 |
| 指示衝突 | 本地慣例更少 | 代理在壓力下需要調和的規則更少。 |
大型系統仍然可以安全。它們需要更強的分解。如果程式碼庫無法變小,面向代理的表面就應該變小:一個套件、一個有界子系統、一個公開命令、一個測試目標、一個有明確歸屬的目錄。
純文字檔案勝過隱藏狀態
McIlroy的口述歷史讓舊教訓變得格外實用。他把「做好一件事」描述為源自於沒有空間做超過一件事的原則,接著說團隊在原始限制消失後仍然保留了這個模式。4他也說明文字串流為何重要:人類可讀的資料讓除錯不再那麼痛苦,而演進文字欄位也比修改固定的二進位版面省事。4
代理需要同樣的表面。檔案可以列出、搜尋、比較差異、分段讀取、提交、回復、lint與審查。隱藏的IDE狀態、不透明的本機資料庫,以及寬泛的託管工具都可能有用,但它們會迫使代理與審查者信任一個不容易檢查的表面。
一篇2026年1月的arXiv論文,把Unix的檔案抽象連到代理式AI系統。該文主張,類檔案抽象與以程式碼為基礎的規格,能把多樣資源收斂成一致且可組合的介面,並可能幫助代理系統變得更易維護、更可稽核,也更能穩定運作。6Oracle的代理記憶體分析提出了相關區分:檔案系統介面之所以有效,是因為模型已經理解儲存庫、資料夾、Markdown、日誌與CLI互動等開發者原生表面;同時,耐久儲存仍可能屬於資料庫。7
這個區分很重要。「使用檔案」不代表「永遠把所有東西都存成鬆散文字」。更安全的模式會把代理介面與儲存基底分開:
| 層級 | 良好預設 | 為何有助於代理 |
|---|---|---|
| 代理介面 | 檔案、資料夾、日誌、差異、命令 | 模型與人類可以檢查同一份產物。 |
| 耐久儲存 | 資料庫、物件儲存、佇列、快取 | 系統保留並行、索引與完整性保證。 |
| 驗證表面 | 測試、linter、路由檢查、截圖 | 證據能留存在聊天逐字稿之外。 |
代理應該看見最小但有用的介面。產品底下仍可保留更強的儲存層。
工具越少,權限越少
MCP授權文章把授權教訓說得很清楚:驗證bearer token,並不代表使用者可以呼叫伺服器背後的每一個工具。8小軟體把同樣概念更早套用在設計階段。較小的工具要求較窄的權力。
OpenAI的本機shell文件直接點出危險:執行任意shell命令可能很危險;建置者在把命令轉送到系統shell之前,應該使用沙箱,或加入嚴格的允許與拒絕清單。3Anthropic的Claude Code指南則提供了大規模實務範例:跨檔案展開工作時,使用允許工具限制,讓無人看管的執行不能做超過任務所需的事。2
小命令更容易限制:
| 命令形狀 | 權限形狀 | 審查形狀 |
|---|---|---|
check-citations content/blog/x.md |
讀取一個檔案,只允許連到引用URL的網路 | 審查引用結果與來源清單。 |
translate-post --slug x --locale ja |
寫入一個快取路徑,讀取一篇來源文章 | 審查一個語系差異與品質門檻。 |
deploy-site |
寬泛憑證、網路、建置、快取清除 | 需要發布層級的信任與強門檻。 |
寬泛工具往往會累積寬泛權限。一般性的「發布」命令可能觸及內容、翻譯、資料庫列、快取清除、部署日誌與分析。有時候確實需要發布命令。更安全的模式是用較小命令搭配明確關口組成發布流程,等每一步都有證據後,再把序列自動化。
目標不是讓工作變慢。目標是讓權力變得可見。
測試應該符合工具大小
Anthropic第一個最佳實務章節告訴使用者,要給Claude一種驗證工作的方式:測試、截圖、預期輸出與命令檢查。2小軟體讓這項建議具體化。小工具可以帶著一份小型驗證契約。
對代理建置的軟體來說,這份契約應該能放在一個畫面裡:
Inputs:
- one source path
- one output path
- one optional flag
Allowed effects:
- read source path
- write output path
- no network unless --verify-sources is present
Evidence:
- unit tests for parsing
- fixture test for output
- dry-run output for the exact file
- git diff limited to owned paths
這份契約很重要,因為代理太容易滿足模糊要求。「改善管線」會引來架構翻動。「替這個命令新增dry-run旗標,並證明輸出不會寫入檔案」則會建立一條證據路徑。
工具維持小型時,測試也會更快。快速測試會改變代理行為。代理會更常執行測試,在相關程式碼仍留在脈絡中時看見失敗,並在逐字稿漂移前修掉根本原因。緩慢測試會把模型推向猜測,或開始敘述它本來會執行什麼。
小不等於做得不足
小軟體可能以可預期的方式失敗:
| 失敗模式 | 出錯之處 | 更好的標準 |
|---|---|---|
| 玩具式極簡 | 工具省略錯誤、日誌、重試或回復 | 縮小範圍,不要降低品質。 |
| 假純粹 | 即使持久化需求需要資料庫,系統仍避免使用資料庫 | 用檔案作為代理介面,用資料庫作為儲存層。 |
| 單檔膨脹 | 一個檔案一路變大,直到沒人能推理它 | 依責任切分,同時保留小型公開命令。 |
| 權限表演 | 命令本身很小,卻呼叫寬泛子程序 | 把關真正效果,而不是包裝器。 |
軟碟徽章衡量大小。代理安全需要不同的衡量方式:審查者能否在批准變更前,理解行為、權限範圍與證據路徑?
這個問題允許工具超過1.44 MB。它拒絕的是真正重要的部分:意外範圍。一個安全、無趣的20 MB原生app,可能勝過一個會呼叫未審查安裝程式的200 KB腳本。小軟體只有在克制抵達實際執行路徑時,才會服務安全。
給代理工作的「小」評分表
在代理建置或修改工具前,先從5個面向評分。重點不是懲罰大型系統,而是找出代理開始寫作前需要先分解的表面。
| 面向 | 好跡象 | 壞跡象 | 寫程式前先修正 |
|---|---|---|---|
| 脈絡足跡 | 代理可以在沒有壓縮壓力的情況下,讀完相關來源、測試與文件。 | 代理需要把半個儲存庫放進脈絡,才能理解一項變更。 | 建立更小的進入點、套件邊界或任務簡報。 |
| 權限足跡 | 命令只需要一種狹窄類型的權力。 | 命令同時需要檔案系統、網路、憑證、部署與快取存取。 | 將讀取、寫入、發布與清除切成不同命令。 |
| 測試足跡 | 驗證命令可在幾秒或幾分鐘內完成。 | 唯一證明是完整發布、手動QA,或「看起來對」。 | 加入fixture、dry-run模式,或聚焦的路由檢查。 |
| 差異足跡 | 審查者讀過一次差異後,就能說明行為變更。 | 變更混合重構、功能、資料遷移與發布銜接。 | 拆成可獨立回復的commit。 |
| 回復足跡 | 一個commit或一個旗標即可讓系統回到先前行為。 | 回復需要資料庫手術、猜快取,或手動編輯生成檔案。 | 加入遷移回復、功能旗標,或可逆寫入路徑。 |
任何紅格都不代表工作應該停止。紅格代表代理需要更小的工作單位。當任務形狀讓正確行為更容易證明,安全性就會提升。
實務模式
我信任的最安全代理建置系統,通常具有同一種形狀:
- 一個狹窄命令只做一件事。
- 純文字檔案承載輸入、輸出、日誌、計畫與審查包。
- 權限對應到命令的實際效果。
- 測試快到足以讓代理在會話中使用。
- 差異小到人類可以審查。
- 發布路徑由小命令組合而成,而不是把寬泛權力藏在一個按鈕裡。
無建置宣言從web技術堆疊的角度描述了同一種偏好:更少建置層、更少生成產物,以及來源與執行環境之間更短的距離。9代理安全版本則對另一種讀者說同一件事。每多一層,機器就多一個地方能產生看似合理、但人類無法快速驗證的工作。
小軟體把克制變成基礎設施。較窄的模組改善脈絡適配。較樸素的檔案改善可稽核性。較快的測試改善回饋。較小的權限集改善爆炸半徑控制。較小的差異改善人類判斷。
FAQ:小軟體與代理安全
小軟體會讓AI程式碼代理變安全嗎?
不會。小軟體會降低代理可能誤解或造成損害的範圍。團隊仍然需要沙箱、允許與拒絕清單、測試、程式碼審查、憑證邊界與發布關口。小軟體讓這些控制更容易套用,也更不容易被意外繞過。
面向代理的工具應該多小?
有用的限制不是位元組數,而是可審查性。好的代理介面工具只有一項工作、小型輸入/輸出契約、清楚的權限輪廓、快速測試,以及審查者能一次讀懂的差異。
代理記憶體應該使用檔案還是資料庫?
當代理需要檢查、搜尋、比較差異與寫入產物時,使用檔案作為介面。當產品需要並行、索引、存取控制、耐久性或跨使用者狀態時,使用資料庫。更安全的架構會把面向代理的介面與儲存基底分開。7
MCP放在哪裡?
當代理需要通往外部工具或資料的型別化橋接時,MCP很合適。MCP不會消除小命令、範圍化權限與動作層級授權的需求。伺服器仍然必須判斷特定主體是否可以執行特定動作。8
結語
AI讓程式碼變便宜。便宜的程式碼提高了拒絕的價值。
小軟體給拒絕一種機器能遵守的形式:一個命令、一個輸出、一條權限邊界、一條測試路徑、一份差異。形式不能保證品質。但它會讓薄弱的工作更容易被看見。
軟碟不再是限制。可檢查性才是。
參考資料
-
Matt Sephton, “Fits on a Floppy: A Manifesto for Small Software,” 2026年4月。該網站定義了1.44 MB徽章,並列出本文使用的小軟體價值:快速下載、即時啟動、低記憶體與CPU、原生程式碼、聚焦功能,以及支援舊系統。 ↩↩↩
-
Anthropic, “Best Practices for Claude Code,” Claude Code文件,存取日期為2026年5月18日。本文引用其中關於脈絡視窗壓力、驗證、CLI工具、跨檔案展開工作,以及允許工具限制的章節。 ↩↩↩↩↩
-
OpenAI, “Local shell,” OpenAI API文件,存取日期為2026年5月18日。該文件描述代理的本機shell執行,並建議在轉送shell命令前使用沙箱,或採用嚴格的允許與拒絕清單。 ↩↩
-
Computer History Museum, “Oral History of Malcolm Douglas (Doug) McIlroy, Part 2,” 2019年。引用段落討論「做好一件事」、pipes與文字串流作為人類可讀通用介面的根源。 ↩↩↩
-
DuckDB Foundation, “A Plea for Lean Software,” Niklaus Wirth於1995年發表於Computer的論文館藏條目。該條目連到原始PDF,並確認標題、作者、日期與刊物。 ↩
-
Deepak Babu Piskala, “From Everything-is-a-File to Files-Are-All-You-Need: How Unix Philosophy Informs the Design of Agentic AI Systems,” arXiv:2601.11672,提交日期為2026年1月16日。 ↩
-
Oracle Developers, “Comparing File Systems and Databases for Effective AI Agent Memory Management,” Oracle Developers Blog,存取日期為2026年5月18日。該文區分代理記憶體中的檔案系統介面與資料庫儲存。 ↩↩
-
Blake Crosley, “MCP工具需要動作層級授權,” blakecrosley.com,2026年5月18日。 ↩↩
-
Blake Crosley, “無建置宣言:不用Bundler也能發布,” blakecrosley.com,2026年2月19日。 ↩