# 換 AI 又要重講網站需求？ai-memory 的筆記與交班實測

- 網址：https://blog.valenvan.uk/posts/akitaonrails-ai-memory.html
- 發布日期：2026-10-31
- 測試設備：Mac mini M4 Pro（12 核、64GB）
- 專案：akitaonrails/ai-memory（https://github.com/akitaonrails/ai-memory），MIT 授權
- 測試版本：3.3.0
- 實測影片：https://www.youtube.com/watch?v=0eqKnJHQD7s

## 重點摘要

- ai-memory 3.3.0 實測可從另一支程式完整讀回一份自製蛋糕網站需求筆記。
- 搜尋「取貨」在本次單份筆記資料中命中1筆。
- 同一張交班單依序認領兩次，首次claimed，第二次none_pending且handoff為null。
- 筆記全文、命中數、首次認領、下一步、未決問題與第二次空值共6項斷言通過。
- **結論：** 筆記與交班API可重現保存、讀回、搜尋及依序認領；未實測AI自動接手專案。
- **適合：** 經常切換AI程式工具、希望留下專案決定與下一步的人
- **不適合：** 期待安裝後AI就會自動完成專案的人

| 實測項目 | 結果 |
|---|---|
| 示範筆記 | 1份 |
| 取貨搜尋 | 1筆命中 |
| 首次認領 | claimed |
| 第二次認領 | none_pending / null |
| 資料核對 | 6項通過 |

幫店裡改預訂網站，昨天才談好「取貨前三天預訂、只到店付款」。今天換另一個 AI 工具，卻得重新找聊天、重講規則，還要提醒它下一步做到哪裡。ai-memory 想解決的，就是讓這些決定留在工具之外，換工作階段時仍有筆記與交班資料可查。

這次用自己寫的蛋糕網站需求，實跑固定版本 3.3.0 的筆記寫入、另一支程式讀取、關鍵字搜尋與交班認領。需求是示範資料，沒有真實店家或顧客資訊。測試設備為 Mac mini M4 Pro（12 核、64GB），受測執行檔是 Linux ARM64 版。沒有把私人對話送進去，也沒有呼叫付費模型。

## 先準備工具，不急著接全部 AI

官方 README 的一般入口是安裝後執行 setup，讓它協助設定服務與代理工具。不過那會涉及原有工作環境；這篇先重現最小測試，手動啟動一個只聽本機的 HTTP 服務，再用 Python 標準函式庫呼叫它。你需要 Python 3、Git，以及能跑 ARM64 Linux 執行檔的環境。其他系統必須改選同版本對應的官方檔案，不能直接執行這份 ARM64 版。

以下是本次真的跑過的下載與驗證指令。固定版本能避免未來最新版改了參數卻無法對照；SHA-256 與同份官方發布的校驗檔一致，代表取得的檔案與校驗檔相符，並不是額外的安全保證。

```bash
python - <<'INNER'
import urllib.request,json,hashlib,tarfile,os
base='https://api.github.com/repos/akitaonrails/ai-memory/releases/tags/v3.3.0'
d=json.load(urllib.request.urlopen(base));n='ai-memory-linux-aarch64.tar.gz'
for name in [n,n+'.sha256']:
 a=next(a for a in d['assets'] if a['name']==name);urllib.request.urlretrieve(a['browser_download_url'],'/tmp/'+name)
h=hashlib.sha256(open('/tmp/'+n,'rb').read()).hexdigest();expected=open('/tmp/'+n+'.sha256').read().split()[0];assert h==expected;print('RELEASE',d['tag_name'],'SHA256_OK',h);os.makedirs('/tmp/aimbin',exist_ok=True);tarfile.open('/tmp/'+n).extractall('/tmp/aimbin',filter='data')
INNER
/tmp/aimbin/ai-memory --version
```

另開一個終端機，讓服務保持執行。這次直接啟動服務，不執行 setup，也不接入既有 AI 設定：

```bash
/tmp/aimbin/ai-memory --data-dir /tmp/aimdemo serve --transport http --bind 127.0.0.1:49374
```

## 從寫下一份需求開始

下面這段會建立示範筆記、讀回完整內容、搜尋「取貨」，最後建立交班單並連續領取兩次。請在另一個終端機執行；建議使用新的示範資料目錄，否則舊筆記與尚未認領的工作可能影響筆數。這裡的 MCP 是工具呼叫介面，並沒有額外啟動 AI 模型。

```bash
cat > ./test_memory.py <<'INNER'
import urllib.request,json
URL='http://127.0.0.1:49374/mcp'
def rpc(name,args):
 data=json.dumps({'jsonrpc':'2.0','id':1,'method':'tools/call','params':{'name':name,'arguments':{'workspace':'demo','project':'cake',**args}}}).encode()
 d=json.load(urllib.request.urlopen(urllib.request.Request(URL,data=data,headers={'Content-Type':'application/json','Accept':'application/json, text/event-stream'})))
 assert 'error' not in d,d
 assert not d.get('result',{}).get('isError'),d
 texts=d['result'].get('content',[])
 return json.loads(next(t['text'] for t in texts if t['type']=='text'))
body='# 蛋糕預訂網站\n已決定：取貨前三天預訂；只到店付款，不做線上刷卡。\n目前進度：首頁介紹已寫好。\n下一步：加上取貨日期欄位。'
w=rpc('memory_write_page',{'path':'notes/cake.md','body':body});print('WRITE',json.dumps(w,ensure_ascii=False))
r=rpc('memory_read_page',{'path':'notes/cake.md'});print('READ',json.dumps(r,ensure_ascii=False))
q=rpc('memory_query',{'query':'取貨','limit':5});print('QUERY',json.dumps(q,ensure_ascii=False))
h=rpc('memory_handoff_begin',{'summary':'首頁介紹已寫好；取貨前三天預訂，只到店付款。','next_steps':['加上取貨日期欄位'],'open_questions':['店休那天可不可以取貨？']});print('BEGIN',json.dumps(h,ensure_ascii=False))
a=rpc('memory_handoff_accept',{});print('ACCEPT1',json.dumps(a,ensure_ascii=False))
b=rpc('memory_handoff_accept',{});print('ACCEPT2',json.dumps(b,ensure_ascii=False))
open('/tmp/actual.json','w').write(json.dumps(dict(write=w,read=r,query=q,handoff=h,first=a,second=b),ensure_ascii=False,indent=2))

INNER
python ./test_memory.py```

## 實際找回什麼？

| 核對項目 | 本次結果 |
| --- | --- |
| 筆記內容 | 與寫入文字逐字一致 |
| 搜尋「取貨」 | 1 筆命中 |
| 第一次領交班單 | claimed，附下一步與未決問題 |
| 第二次領同一張 | none_pending，handoff 為 null |
| 資料斷言 | 6 項通過 |

![從實際錄影抽格：需求與搜尋結果](https://blog.valenvan.uk/img/akitaonrails-ai-memory-article_1.png)

讀回的不是一句模糊摘要：三天前預訂、到店付款、首頁已完成，以及下一步要補取貨日期，全都還在。搜尋則幫忙從筆記找到相關內容；這次資料只有一份，所以「命中一筆」不代表它在大型資料庫也一定找得準。

交班單另外保留「店休那天可不可以取貨？」這個未決問題。第一次認領得到下一步，第二次回覆沒有待領項目。注意，這證明的是本次依序領取不重複；沒有測多人同時搶領，也沒有測 AI 是否會照交班內容完成網站。

![從實際錄影抽格：第一次與第二次認領結果](https://blog.valenvan.uk/img/akitaonrails-ai-memory-article_2.png)

影片中的網頁是我們自製的即時 API 檢視器，方便放大這些結果，並非 ai-memory 的原生操作介面。完整原始回傳另外留下收據，畫面不是手填成功文字。

## 我會怎麼用

如果常在不同 AI 程式工具間接續同一個專案，我會先用它保存重要決定、完成位置與下一步，再逐步接入實際工作。只用一個工具、很少中斷專案的人，未必需要立刻多維護一層服務。

本次沒有驗證自動擷取聊天、真實 Claude 與 Codex 接力、跨電腦同步、大型資料庫或長期記憶整理。最重要的收穫是需求和交班資料確實可查，並不是安裝後 AI 就自動記得一切。遇到連線失敗先確認服務仍在執行、位址和埠號一致；看到 none_pending 只代表沒有待領項目，不代表工作已完成。

專案與授權：[ai-memory](https://github.com/akitaonrails/ai-memory)、[3.3.0 發布頁](https://github.com/akitaonrails/ai-memory/releases/tag/v3.3.0)、[MIT 授權](https://github.com/akitaonrails/ai-memory/blob/v3.3.0/LICENSE)。測試日期：2026 年 10 月 31 日。
