agent 的記憶搬不出 harness:Open Memory Protocol 的五份草案,到今天停在哪
換 harness 的那一刻,agent 記得的東西留在原地。
Open Memory Protocol 的 README 把這個處境寫得很具體:Claude Code、Codex、goose、OpenClaw、Letta Code,每一個都實作了記憶,每一個的約定都不同,AGENTS.md、MEMORY.md、USER.md、HUMAN.md。原文是 “Developers cannot move a stateful agent from one harness to another.”
這個處境我自己沒撞過。我沒有把 agent 從一個 harness 搬到另一個,也沒裝過這個專案的任何程式碼,下面全是讀 repo 的 README、工作筆記和 PR 內文得來的。我想寫它,是因為這個 repo 還停在「一群人互相不同意」的階段,而且把不同意直接放在公開檔案裡。定稿的規格只告訴你結論,這種階段的 repo 讓你看到結論是怎麼被擠出來的。
從一個 session 索引器開始
README 有一段 “Ecosystem history”,我照它的日期,加上 gh api 在 2026 年 10 月 28 日取到的 repo 元資料,排成一條線:
Open Memory Protocol 的時序
2025-08
README 列了一項 “Protocols and Power”。內容我沒讀,只知道標題。
2025-10-03
README 列了 “The Memory Walled Garden”,同樣只知道標題。
2026-05
第一個公開 commit:一個 ACP-based 的 memory-server 原型(SrulyRosenblat/agent_memory_mcp),涵蓋十二個 coding-agent harness 的 session indexing,現在匯入成 repo 的 prototypes/acp_memory_server/。
2026-08
Charles Packer(Letta)把 OMP 的技術草案傳出去。2026-08-26,repo 建立。
2026-09-09
首次 convening。9 月 28 日另有一通討論資料格式與執行期的電話。
2026-10
10 月 3 日 PR #13 開出(規格 v0.2 的編輯版草稿);10 月 13 日 AIDP 的草案出到 v0.2;10 月 14 日 PR #13 內文更新,同一天 PR #17(威脅模型)開出。月內還有 Berkeley 的 O’Reilly open-source unconference。
2026-12
README 寫 “early December” 會辦一場線上 mini hackathon,日期我沒查到。
最前面那個原型值得停一下。README 說它涵蓋十二個 harness 的 session indexing。我的讀法是,這比較像「讀」的問題,把散在各處的東西找得到(原型本身我沒打開看,這是從 README 一句話推的)。從這裡走到「讓記憶可以搬走」,問題換了形狀:讀只要看得懂各家格式,搬卻要有人定義搬過去的東西長什麼樣子。
repo 在八月底建立,到我寫這篇是兩個多月。主辦是 AI Disclosures Project(掛在 Code for Science & Society 底下),README 說與 IBM 和 Mozilla 共同召集;Letta 被列為 draft technology author 和 reference implementer,Block 的 goose 是第一個垂直領域的實作者。同一份 README 的 Current stage 寫著:
Working towards a version 1. No reference implementation exists yet.
兩句並排,角色已經指定,實作還沒出現。版本標示是 pre-1.0,截至 2026 年 10 月 28 日,repo 有 25 顆星(這個數字每天都在變)。
五份草案,和九月二十八日那通電話談出來的
故事的主線是:不只一個人寫了草案,而且五份各自不同。repo 裡有一份 2026-09-28 的 working-group/exchange-and-runtime/2026-09-28-common-ground.md,檔頭自稱 “Discussion draft”,比對的是當時 main 上的 early-draft-specs。它對五份草案各給一句話:
| 草案 | 筆記裡的一句話 |
|---|---|
| Packer v0.2(Letta) | 一個 MEMORY.md 目錄,逐步揭露,加四條 harness 契約;所有權、版本、同步明確排除在外 |
| IBM v0.1 | 不可變的記錄(內文、id、作者、AI 來源、建立/失效時間…),執行期動詞是 remember、recall、observe、decorate |
| AIDP/FMP | Federated Memory Protocol,一個外掛後面接很多記憶伺服器,/fmp/* 端點,三種類型:ground truth、transcripts、inferences |
| Cognee v0.1 | 六部分語意核心:身分/修訂、證據、範圍/權限、PROV 血緣、生命週期/刪除、交換清單與收據 |
| Context Nest v0.1 | 受治理的 Markdown:版本歷史、雜湊鏈、檢查點、狀態生命週期,forget protocol 在 §6.3 |
注意歸屬,這是五份各自獨立的草案,不是同一份的五個章節。表裡是 9 月 28 日那份筆記的描述;AIDP 後來在 10 月 13 日出到 v0.2,我沒有讀各草案的 PDF 本體,只引用筆記的轉述。
與會的有 IBM 的 Gabe Goodhart、AIDP 的 Sruly Rosenblat、Cognee 的 Vasilije Markovic、Block 的 Alex Hancock、Context Nest 的 Misha Sulpovar。範圍被壓得很窄:
data format and runtime only. User scope and candidate implementations were set aside.
談出來的共識標成 [agreed],筆記裡我數到六條,這裡挑四條講。一條是記憶是個可攜物件,本體加中繼資料,儲存、檢索、內部修改留給實作者。一條是標頭用嚴格的 schema,本體是任意格式的字串,建議 markdown 或純文字。一條是 recall 的簽章不標準化,Gabe 認為固定簽章 “would inevitably fail”。還有 federation 放在 agent 背後,agent 可以完全不知道合併邏輯。
沒談攏的才是這份筆記的重心
共識那幾條不用多講,分歧清單比較值得看。
第一個是 markdown。筆記寫共同的 body 格式傾向用 markdown,不過 Vasilije 不認為基礎記憶物件該是 markdown;Gabe 覺得 markdown 對記憶來說太簡單,但承認 “it’s what all the agents are doing today”,偏離太遠就會變得不相關。也許這就是協定傾向「嚴格標頭加任何本體」的原因:它得先讓現有的 MEMORY.md 搬得進去(筆記沒有明說這個因果,是我的推測)。
第二個是原子單位。Vasilije 要的是「帶有意義、並且能被判定真假的最小語意單位」,例句是 “Vasily left the cab”。Gabe 認為 title/author 這種欄位比較像文件庫,不像事實集合。兩邊其實在問同一件事:一條記憶是一份文件,還是一個斷言。
第三個是 provenance 的形狀,我覺得最有意思。Gabe 提 AI-usage trailer,分 none/draft/full,類比 EU AI Act 的 human/AI/mixed。Sruly 回了一個很難答的問題:”when an assistant rewrites what you asked it to save, is that AI-generated?” 你叫 agent 記下一句話,它改寫過才存,這算誰寫的?他主張乾脆列貢獻者清單,不做三分法。
第四個是版本化:每次修改是產生取代舊版的新 revision,還是原地改?筆記的原句是 “Immutability suits audit and time travel; mutable files are how markdown stores work today.”
最後是執行期介面,MCP 到底是不是這件事的家。筆記記錄 Vasilije 說 MCP 沒展現多少前景,hooks 才是新的黃金標準,因為給你控制權;Misha 則說 CLI 在 retrieval isolation 上比 MCP 可靠。這幾句是 repo 工作筆記裡的轉述,不是當事人直接對我說的。
10 月 14 日,規格往前走了一步,威脅模型同一天出現
PR #13 是編輯版的 exchange-and-runtime 規格 v0.2,作者 mishamake,10 月 3 日開出。內文第一句就在降低期待:
Merging means “this is the text we iterate on,” not adoption.
每一節都標 [agreed]、[proposed]、[open] 或 [editors]。10 月 14 日更新後的重點:標頭改叫 metadata,type 改成 media_type;目標與非目標移到最前面,講明這是傳輸格式不是儲存,markdown 不是必須;version 在稽核情境下必填;valid_until 取代 invalidated_at,而且可以是未來的日期;provenance 在稽核以外是選填,不知道誰寫的就留空,接收端讀成 unknown。另外分了四個 conformance profile:minimal、markdown loading、federation、audit。
有一條我特別記下來:tombstones 和 anti-resurrection 是提案放進 audit profile。
同一天開出的 PR #17 是 rdwj 寫的威脅模型,我覺得它最值得講,因為它指出的是兩份文件都沒談的洞。它的第一段數字:
Across working spec v0.1 (410 lines, 16 open issues) and the common-ground matrix (22 primitive rows, 20 whitespace items), there is no row, section, or open issue on adversarial content.
injection、poisoning、adversarial、tainted、untrusted、sanitization,這六個詞在兩份文件裡都沒出現,這是 PR 的說法,我沒有自己去搜。
然後是整個 PR 最重的一句:
A hash chain proves that stored content was not altered after it was written. It says nothing about whether the content should have been written.
拿圖書館來比:借書章和流水號能證明這本書沒被調包,卻說不出它該不該上架。雜湊鏈守住「寫進去之後」,管不到「為什麼寫進去」。
第二個論點扣在 hooks 上。PR 引了規格 §9.1(PR 針對的是 v0.1,原文我沒讀):hooks 讓 supervisor 可以在 agent 不知情的情況下觀察或「decorate」對話,決定往 session 加什麼、存什麼。PR 的質疑是:§4.2 的 provenance 只管寫進 store,不管寫進 context。hooks 把東西塞進 context 的那條路,現有的 provenance 規則碰不到。前面那場 MCP 對 hooks 的爭論,在這裡接上了:選了 hooks,就多出一條沒有人記帳的路。
PR #17 列了三個缺的欄位:evidence 的 channel/trust class、salience、confidence;還有兩個沒有歸宿的操作:矛盾訊號和同意狀態。它也講得很清楚,”It does not propose that OMP define security controls.”,要的是把問題擺上桌。
這是一位貢獻者的討論文件,不是已採納的規格。截至 2026 年 10 月 28 日,gh api 回報 repo 有 8 個 open PR(#24、#19、#17、#16、#13、#12、#7、#6),全部 state=open、merged=false。PR #17 內文還引了 OWASP ASI06 與 MINJA 的結果,我沒有回原文核對,這裡不引用。
我的立場,和會讓我改口的條件
我站在「刪除要進最小可行路徑」這一邊。目前 PR #13 是提案把 tombstones 與 anti-resurrection 放進 audit profile。我的理由是:搬記憶這件事,整個動作就是 import。接收端如果不屬於 audit,匯入時就沒有任何訊號知道某條記憶曾經被忘掉,被使用者明確刪掉的東西,下一次跨 harness 搬家時就會回來。Gabe 在筆記裡警告可選欄位常常沒人實作,”as happened with MCP auth”;他講的是欄位,我拿來類推到 profile,把關鍵的一條放進選配,很可能就是少人實作的那一條。這是我的推論,我沒讀過 PR #17 全文,不知道它自己是否主張同一件事,我讀到的只是 README 對它的描述,裡面有 “preventing forgotten memories from returning through import” 這個關注。
什麼會讓我改口?第一,有人拿出一個不需要 tombstone、在 minimal 就能擋住復活的做法,例如整批覆蓋式的匯入語意;第二,minimal profile 的實作者回報加了這一條就放棄實作。其中一個成立,我就認為放 audit 是合理的取捨。
另一個立場比較保守:現在不要把你的記憶格式押在它上面。理由很直接,pre-1.0、沒有參考實作、所有 PR 都開著,連 PR #13 自己都說合併不等於採納。要我改口,只要看到一個 harness 公開跑通來回搬移,或 PR #13 對應的內容真的被採納。PR #12 的標題寫著 “field report, round trip of a Hermes agent’s memory through .mem 1.1.0”,但它同樣還開著,我沒讀內容。
沒有死路可寫
這篇我沒有失敗經驗可以交代:沒裝過、沒跑過 python-loader-validator,連 prototypes/ 的內容都沒打開。要說有什麼沒做的,就是上面那些標了「沒讀」的部分:各份草案的 PDF、規格 v0.2 的全文、§3.2 的欄位表。
最後一個觀察。README 的 Current focus 是交換語意和記憶物件,下一步才是共享記憶的元件。9 月 28 日那通電話把 user scope 先擱置了。這個協定想做的兩件事,記憶在系統之間搬移,和記憶在系統之間共享,目前桌上只有前半,而前半的分歧清單還沒清完。後半的 user scope 在 9 月 28 日被擱置,所有權則在 Packer 的草案裡明寫排除在範圍之外。










