他很會寫程式,這件事不用我教。
他不知道的是我這邊的事:分支從哪裡切、commit message 要什麼格式、哪個目錄不要碰、測試用哪一條指令跑。每開一個新對話,這些話就得再講一次。
pi 這邊接這件事的東西叫 context file,啟動的時候自己讀進去。真正要決定的是:放什麼,放哪一層。
動手之前我先去看了 pi 預設的 system prompt。
裡面只有這些:一行身分(你是在 pi 這個 harness 裡工作的 coding assistant)、四個工具各一句話的說明、幾條用法規則、一段「使用者問到 pi 本身才去讀」的文件路徑,最後一行是目前的工作目錄。加起來三百個 token 上下。
那幾條用法規則是工具自己帶進來的。edit 就佔了四條:要換掉的那段文字必須跟原檔完全一致、同一個檔案的多處改動要合成一次呼叫、每一段比對文字要小到剛好唯一、不要重疊或互相包含。read、write、bash 各帶一條。固定的兩條是「回答簡潔」和「檔案路徑要寫清楚」。
我一度想乾脆把整份清掉,看看什麼指示都不給會怎樣。查完之後沒有做。
第一個原因是機制上的:放一個空的 SYSTEM.md 沒有作用。pi 是拿那個檔案的內容當條件判斷,空字串會被當成沒有這個檔案,還是走預設。要真的清空,得放一個只有空白字元的檔案。
第二個原因是清掉會少什麼。工具還是能用,因為工具的定義是 API 那一層送出去的,不在 prompt 裡;少掉的是上面那些用法規則。改檔失敗最常見的原因就是要換掉的那段文字對不上,而 edit 那四條規則正是在防這件事。
而且這三百個 token 不會對 context window 有影響,所以這裡我不動。
整份換掉的 SYSTEM.md 就這樣放著。我用的是接在後面的 APPEND_SYSTEM.md。
十行以內,其他都不放。
這一份我也試過完全不寫。也能跑,代價是語氣和邊界每次都要在對話裡重講一次——這次講得清楚,下次忘了講,他的行為就跟著飄。
留下來的標準只有一條:跨每一個專案都成立的才放這裡。上面那三件跨得過去,其他跨不過去。
分支怎麼切、哪個目錄放什麼、測試和 lint 各跑哪一條——這些跟著 repo 走,寫在那個 repo 的 AGENTS.md。
pi 啟動的時候讀三個地方:
~/.pi/agent/AGENTS.md:全域,每個專案都吃三層會疊起來。所以「全域那份薄、repo 那份厚」這個分法,就是靠這個疊法成立的。反過來也很清楚:repo 專屬的東西寫進全域那份,換到另一個 repo 就變成雜訊,還可能跟那邊的規矩打架。
現成的例子就在 pi 自己身上。pi 的 repo 根目錄有一份 AGENTS.md,169 行:回答要多短、不要在 commit 和 PR 裡用 emoji、什麼時候跑 npm run check、測試該用哪一條指令、commit 只能 stage 自己這一輪改的檔案。連語氣都寫在那一份裡,因為那是那個專案的語氣。
兩個細節值得記。某個目錄裡放了 AGENTS.override.md,pi 就讀它、跳過那一層的 AGENTS.md 和 CLAUDE.md,其他層照樣疊。啟動時加 --no-context-files 就完全不讀。
還有一件對我有實際好處的事:pi 兩個檔名都認,AGENTS.md 和 CLAUDE.md 都收。我在別的 coding agent 上已經寫好的那一份,直接放進去就生效。

這些檔案放在 ~/.pi/agent/ 底下。要改它,得開一個編輯器、找到那個路徑、改完存檔。所以這天在 Desktop App 上加了一個「個人化」的畫面。
畫面很單純:一個多行輸入框,裡面就是那份常駐指示,改完按儲存。存下去直接寫進檔案,Agent 下一次啟動就讀到。這一天我只做指示這一塊,記憶那一區的開關先不做,那是第 11 到 13 天的事。
參考的是 Codex App 的個人化那一頁:上面一個輸入框放指示,下面一排記憶的開關。我要的東西跟它幾乎一樣,所以照著做。
實作交給 coding agent:讀檔、寫檔、輸入框、儲存、存失敗的提示。我驗收的標準只有一條——在畫面上加一行,重開 Agent,那一行有生效。
這幾個檔案不會自己長大。他做錯一件事,不會自己把結論寫回去;下一次還是我自己去加那一行。
我目前接受這樣。全域那一份每個專案都吃,寫錯一句,每個專案都跟著歪,所以每一行經過我一次不是壞事。
至於他能不能自己記住昨天發生過什麼,那是這一章後面幾天的問題。
他很會寫程式,卻不知道我手上這些東西長什麼樣。
解法分兩層:預設那份不要動,我自己那份薄薄十行只放跨專案都成立的三件事,repo 的知識跟著 repo 走。然後給它一個入口,Desktop App 上改完重開就生效。
明天講另外兩種給他能力的方式:教他一件事怎麼做,跟直接給他一個新工具。
參考:Pi 文件
凡人修 Agent 傳|第七回(Day 07)
門板上那個洞還沒補。
天亮,手的主人進來,視線先落在洞上,才落到我身上。手在我背後推了一下。
我走。
第二次出門。第一次是被御物術托著出去的,這一次我自己走。過門檻的時候神識照樣斷了半息,出了門,我只剩眼睛和耳朵。
坊裡的路我認得,圖紙上畫過。手的主人沒有往人偶那一排走,走的是外圈,一家一家門前站著看。
每一家門上都掛著一塊牌。
第一家那塊很小,三行字。第二家那塊有半人高,字密得像一片灰,從最上一行「進門先報上要做的事」一直排到地上;我看見中間有一行寫著「不許在門內引火」,再下面一行寫著「東西放回原處,位置照架上的記號」。第三家門上什麼都沒有,門開著,裡面一具人偶正把一疊卷軸從架上抱下來,抱到一半,卷軸散了滿地。
手的主人在第二家那塊牌前面站了很久。視線從上到下走了三遍,中間停下來,指尖劃過其中兩行。
然後手從儲物袋取出一片空玉板,一縷神識探進去,把那兩行刻了下來。
只刻了兩行。
回洞府的路上手的主人沒有停。
進門,手把那片玉板擱在臺上,接著從儲物袋取出我的圖紙,攤開,抬指一引,一張素紙落下來,蓋住圖上靠右的一角。
那一角寫的是我怎麼動手:薄的東西從邊上拿;卷軸從中間抽會裂;刻字之前先看清楚原本的痕,新的痕不要壓上舊的。這些字我睜眼那一刻就知道,跟「見光即醒」寫在同一張圖上。
蓋住之後,我還是知道我會讀、會寫、會改、會動手。那四樣都在。怎麼拿、怎麼刻,就想不起來了。
一縷神識探進玉片,刻了一道念:取第三卷,改第一頁中間那一句。
我伸手到架上,手指從卷軸中間掐住,往外一抽。
紙裂了。裂口從中間往兩邊走,那一頁掉在地上,斷成兩片。
手的主人沒有出聲,撿起來,換了一卷新的上架。
同樣一道念。我換了一手,從邊上抓,抱著走到臺前攤開,開始刻。刻到第四道的時候,我的痕壓在原本的一道上,兩道疊在一起,變成一個誰都認不出來的形狀。
那一頁也被抽走了。
第三次我做完了。做完之後才看清楚:我把整頁重寫了一遍。念裡要改的只有中間那一句,別的地方原本沒有事。
臺上多出一疊廢紙,最上面那一張還濕著。
手把素紙揭了。
圖上那一角又露出來,那幾行字回到我知道的地方。第四道念跟前三次一樣。我從邊上抽出卷軸,攤在臺上,只改了中間那一句,別的地方沒有碰。
素紙被揉成一團,扔在牆邊。
手的主人拿起那片刻了兩行的玉板,走到門內側貼上去,一道法訣打進去,玉板就嵌在門上了。
那兩行我認得:一行是「說話要短」,一行是「要拆、要毀、要送出門的事,先問我」。
臺邊還有一塊。
那一塊是薄石,比玉板大,刻的是這間屋子的事:架上第幾層放什麼;卷軸的記號畫在背面,取之前先把卷轉過來;牆上那條裂縫引火之前先看靈石袋;還有一格畫了一道橫線,那一格不要動。
刻完,手的主人把薄石靠在臺沿那個缺角旁邊,沒有掛起來。
天黑之前,門上那塊玉板多了一行:動手之前,先把屋裡的東西看過一遍。
三行。手的主人退開一步,視線在牌上停了一會,沒有再刻。
燭熄了。手的主人走了。門響了一下。
門上那塊玉板亮著一點光。最後那一行的刻痕比前兩行淺。
牆邊那團素紙沒有人撿。