本地換腦實戰:CC 撞牆、aider 跑通、選對 agent 更重要

🧭 這是系列的一塊 — 先看全景地圖
想先看 LLM / 平台 / 工具 / Agent / 微調 怎麼拼成一張圖 → 從一顆腦到公司 Agent:LLM 全景地圖
重點摘要(TL;DR)
  • 目標:把 AI agent 的「腦」從雲端 Opus 換成本地/開源模型(省成本 + 資料不出門)。這篇是一次真實的換腦實戰紀錄,含撞牆。
  • 不能只換模型——腦、平台、agent、harness 是四層,硬把 Claude Code(CC)換成非 Claude 腦會撞格式。
  • 實測:CC + Cerebras gpt-oss-120b 單回合能跑,多回合撞 thinking_blocks(CC 的 Claude 私有格式);aider 配同一顆腦卻順順跑、寫檔落地
  • 鐵律:選對 agent 比選對模型更關鍵。CC 為 Claude 生;非 Claude 腦用 model-agnostic 的 aider / OpenHands
  • 架構:個人配 CC+Opus 不動;公司 air-gapped 用 aider/OpenHands/pi + 本地腦(DGX 120B)。換腦是一行(--model)的事。
  • 最後一哩:用 pi 的分支 omp 內建 /collab,幾分鐘就從手機瀏覽器驅動本地 Cerebras agent、不碰終端機;但工具沒被關進沙箱是最大風險,Docker 才是解

前面幾篇講了選型、tool use、微調、全景。這篇是把它們拿去真的動手——我想把 agent 的腦換成本地開源模型,親手撞了一次牆、也找到了正解。全程真實,包含一個「單回合成功、多回合爆炸」的關鍵教訓。

🧭 本文導覽(換腦實戰)
Part 一 — 為什麼換腦不能只換模型
Part 二 — CC 撞牆(thinking_blocks)
Part 三 — aider 跑通
Part 四 — 鐵律 + 架構決策
Part 五 — 腦集中、往上打
Part 六 — OpenHands、pi 正解
Part 七 — 手機/瀏覽器溝通點
Part 八 — 團隊編排測試(引擎真、油不夠)
Part 九 — 動手做懶人包
Part 十 — Codex 訂閱 + 深度 ERP 實測
Part 十一 — 八大循環:讀你的腦 + 治理 + 驗證
Part 十二 — 用 iDempiere 當尺:護城河在哪
Part 十三 — Agent 還是 Model?問建構者本人
Part 十四 — 收尾
Part 一 — 為什麼換腦不能只換模型

為什麼「換腦」不能只換模型

直覺是「把模型參數換掉就好」,但實際上一個 agent 有四層,只換一層會出事:

是什麼換本地時
腦(LLM)會預測下一個字的模型換成開源 120B
平台模型跑在哪(雲/本地/context/限流)Cerebras 雲端 or 未來 DGX 本地
agent驅動工具往返、跑 cycle 的程式← 這層最容易被忽略
harness / UI遠端介面、CCBot、workflow中繼那層
關鍵
agent 那層是為特定模型調校的。Claude Code(CC)為 Claude 深度綁定,你把腦換成非 Claude,agent 這層就會撞格式——下面就是活生生的例子。
Part 二 — CC 撞牆(thinking_blocks)

實戰一:把 CC 的腦換成 Cerebras gpt-oss-120b

CC 說 Anthropic 格式,Cerebras 說 OpenAI 格式,所以中間要一層 LiteLLM 代理翻譯。設定:

# 1. LiteLLM 代理(對外裝 Anthropic、對內轉 Cerebras)
litellm --model cerebras/gpt-oss-120b --port 4000

# 2. CC 指向代理(env var 重映射 CC 內建的 opus/sonnet/haiku)
export ANTHROPIC_BASE_URL=http://localhost:4000
export ANTHROPIC_AUTH_TOKEN=dummy
export ANTHROPIC_MODEL=cerebras/gpt-oss-120b
export ANTHROPIC_SMALL_FAST_MODEL=cerebras/gpt-oss-120b
claude

CC 開起來,歡迎框顯示 cerebras/gpt-oss-120b——腦真的換了。問它「你是不是跑在 Cerebras 上」,它想了一分鐘、正確自我辨識:「是的,我的底層是 Cerebras 上的 gpt-oss-120b」。單回合成功。

但第二回合就爆了
叫它「建一個檔、寫迴圈、執行」——它成功寫了檔,但下一步就 400:
CerebrasException - messages.2.assistant.thinking_blocks is unsupported
原因:gpt-oss 是推理模型,它的思考被存成 Claude 專屬的 thinking_blocks,第二回合連同歷史送回 → Cerebras 看不懂這個欄位 → 擋掉。單回合可、一有對話歷史就死。

試了 LiteLLM 的 drop_params / modify_params 想剝掉那欄位——沒用(thinking_blocks 藏在訊息結構裡,不是 top-level 參數)。

一個差點犯的錯:別為了避開 thinking 而閹割腦
我一度想「那換一顆非推理模型不就沒 thinking_blocks 了」——這是解錯問題。thinking(推理)正是你要強腦的理由,拿掉它等於買跑車拆引擎。真正的 bug 不是「有 thinking」,是「CC 用 Claude 私有格式送 thinking」。答案不是關掉思考,是換掉不相容的殼。
Part 三 — aider 跑通

實戰二:aider 配同一顆 120B,順順跑通

aider 天生說 OpenAI 格式、不塞 Claude 的 thinking_blocks,所以直接吃 Cerebras、零翻譯:

set CEREBRAS_API_KEY=csk-你的key
aider --model cerebras/gpt-oss-120b

叫它「建 HAPPY.py、寫 1~100 迴圈、執行」——它產生 diff、Applied edit to HAPPY.py,多回合順跑,而且真的在硬碟上寫出了檔案同一顆腦,CC 撞牆、aider 跑通。

單回合多回合(agent loop)
CC + gpt-oss-120b✅ 能❌ 撞 thinking_blocks
aider + 同一顆腦✅ 順跑、寫檔落地
問題從來不是模型,是 harness
120b 有能力驅動工具(它在 CC 裡也成功寫了檔)。爆的是 CC 處理 thinking 的方式。換掉會爆的殼(CC)→ 用 aider,thinking 和強腦一起留。
Part 四 — 鐵律 + 架構決策

鐵律:選對 agent 比選對模型更關鍵

這次實戰逼出一條清楚的規則:

規則
CC 是為 Claude 深度綁定的。任何非 Claude 的腦(Cerebras 現在、DGX 未來),CC 都會綁手綁腳。
· 腦是 Claude 級(Opus)→ 用 CC 最爽。
· 腦是本地/開源 → 用 model-agnostic 的 aider / OpenHands

於是架構收斂成兩套環境

思考主腦寫碼harness機器
個人開發Opus(雲)qwen3-coderCC 原封不動
華新 air-gapped本地 gpt-oss-120Bqwen3-coderaider / OpenHandsDGX + 各廠 Mac Mini
你的投資沒白費 —— 兩個投資命運不同
CCBot(Telegram 中繼)= 薄橋,底層換 agent 後重指即可,不是重寫。
CC(agent)= 綁 Claude,本地腦要換 aider/OpenHands。
遷移 = 把你的 cycle 對應到新工具現成的角色(映射),不是從零重建帝國。而你的知識(brain 檔、CLAUDE.md、RAG 資料)是文字,兩套共用
Part 五 — 腦集中、往上打

架構升級:腦集中、agent 隨檔案、UI 到處連

既然 agent 只是透過 base_url 指向一個模型端點,那「腦跑在哪」和「你在哪工作」可以徹底解耦:

  • :集中在 DGX(強、私密,一處維護)。Ollama/vLLM 開網路端點。
  • agent:放「檔案/工作所在地」(要改本機 repo 就在本機;純助理就放 DGX)。
  • UI:到處連——OpenHands 自帶 web UI,用你現成的 Cloudflare tunnel 暴露(像 decision-server),手機也能連。
  • 安全:⚠️ Ollama 預設零認證,對外一定要包 VPN(Tailscale)或 tunnel+Access,別裸奔。
換腦是一行的事
現在測試:--model cerebras/gpt-oss-120b(雲)。未來上 DGX:--model ollama/gpt-oss:120b(本地私密)。agent、UI、cycle 全不動,只換 model 字串。你在小環境練的,原封搬到 DGX。
Part 六 — OpenHands、pi 正解

實戰三:OpenHands —— harness 級的 model-agnostic 選項

aider 是好 coder,但太薄(沒 subagent/memory/orchestrator)。要對標 CC 那種有殼的 harness、又能吃本地腦,OpenHands 是最接近的:動態 subagent、工具、web UI + API,走 OpenAI 格式(沒有 CC 那個 thinking_blocks 問題)。

在 Linux 上安裝比 Windows 省事(Docker 原生,免 WSL2):

pip install uv
uvx --python 3.12 openhands serve
# 首次拉 agent-server image(幾 GB),之後開 http://localhost:3000
# Settings → LLM:model = cerebras/gpt-oss-120b,API Key = 你的 key
✅ 實測:這台 Linux Mini PC 一次就起來
OpenHands GUI server 成功跑在 :3000——curlHTTP 200/healthOK、容器 Up。Linux 上 Docker 原生,比 Windows(要 WSL2 + Docker Desktop)順太多。

一個 Linux 小坑:背景啟動要 docker run -d

uvx openhands serve 底層是 docker run -it(要 TTY);在背景/無 TTY 會報 the input device is not a TTY。改直接跑它的 docker 指令、把 -it 換成 -d 就好:

docker run -d --rm --pull=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v ~/.openhands:/.openhands -p 3000:3000 \
  --add-host host.docker.internal:host-gateway \
  --name openhands-app docker.openhands.dev/openhands/openhands:latest
完整 agent 實測的兩個現實限制
① LLM 要在 web UI(:3000)設成 cerebras/gpt-oss-120b + key;② Cerebras 免費 5 RPM 會讓自主 agent 一直撞 429。所以本篇先驗到「harness 在 Linux 裝起來、服務起來、web UI 回應」;完整 agent cycle 的順跑實測,留待接 DGX(本地無 RPM 限)或付費 Cerebras 後補。
遠端 = 你要的「像 CCBot」
:3000 用現成的 Cloudflare tunnel 暴露(跟 decision-server 一樣),手機瀏覽器就能連——這正是「人不用進來、透過 UI 遠端跟 agent 溝通」,只是底層從 CC 換成 model-agnostic 的 OpenHands。
一個實務提醒:免費層 5 RPM
OpenHands 是自主 agent,一個任務發超多次請求。Cerebras 免費 5 RPM 會一直撞 429、走走停停——這是額度問題不是 OpenHands 的錯。判斷 harness 合不合用就好,速度等 DGX(本地無 RPM 限)才準。

正解浮現:pi(oh-my-pi)—— 終端 + 可腳本化 + 無格式牆

試遍 CC(撞 thinking_blocks)、aider(能跑但太薄)、OpenHands(Docker + UI-first,LLM 設定卡死)後,pi(oh-my-pi,Pi 的 fork)實測端到端跑通:非互動、驅動工具迴圈、真的在硬碟建出檔案、零 thinking_blocks

# 非互動、可腳本化(未來接 Telegram relay 就靠這個)
pi -p "在目前資料夾建 hello.py,寫一個印出 1~10 的 for 迴圈,用 write 工具實際建檔" \
   --model cerebras/gpt-oss-120b \
   --api-key "$CEREBRAS_API_KEY" \
   --thinking low --tools write,edit,ls
# → rc=0,hello.py 真的建在硬碟上(36 bytes,內容正確)
你要的pi(oh-my-pi)
終端 + 可腳本化遠端驅動pi -p / --mode json,rpc,完美接 CCBot-style relay
model-agnostic + 本地/Cerebras✅ 直連,免 LiteLLM、無 thinking_blocks 牆
subagent / 記憶 / LSP✅ 有 subagent、mnemopi 記憶——比 aider 豐富、比 OpenHands 輕
輕量✅ Rust 核心,不用 Docker
一個坑(已破案):omp 崩是 Bun 版本太舊,不是套件壞
同一個 npm 套件(@oh-my-pi/pi-coding-agent)有兩個入口、同一個 12MB bundle:omp shebang 走 BunpiNode。一開始 omp 崩(SyntaxError: Unexpected identifier 'z')、pi 正常——真因是本機 Bun 1.3.9(舊)解析不了那個大 bundlebun upgrade 到 1.3.14 後 omp 立刻正常(v16.4.8)。所以:要嘛用 pi(Node,零煩惱),要嘛跑 omp 前先 bun upgrade「同套件一邊死一邊活」= 兩個 JS runtime,舊 Bun 有 parser 問題、Node 沒有。
收斂:你的本地換腦正解
pi + 本地/Cerebras 腦——可腳本化、可遠端、無格式牆、輕量,比 CC(撞牆)、OpenHands(重)、aider(太薄)都更貼「本地 CC 替代 + 遠端驅動」的需求。未來華新:pi + DGX 的 gpt-oss-120b(--model ollama/gpt-oss:120b,改一字)+ RAG + 微調華新腦;遠端用薄 relay(Telegram → pi -p)取代 CCBot→CC。
Part 七 — 手機/瀏覽器溝通點

實戰四:讓手機/瀏覽器變成溝通點(omp /collab)

找到 pi/omp 這個對的 agent 後,還差最後一哩:我不想登進終端機 TUI 打字,但我需要一個點能跟 agent 溝通——網頁也好、手機也罷。研究後發現 omp 對外有四個非-TUI 介面:

介面是什麼適合當溝通點?
omp acpACP server(Zed 的 Agent Client Protocol,走 stdio)不 —— 為編輯器 GUI 設計
--mode rpcNDJSON over stdio,可送 prompt、收 token 串流✅ 自建 relay 的乾淨地基
Node SDK@oh-my-pi/pi-coding-agent 直接 embed✅ relay 用 Node 時最省
/collab內建協作:一行指令 → 出 link + QR → 瀏覽器開✅✅ 這就是要的「一個點」

/collab 是最快解:不用寫任何 relay、不用自架伺服器,omp 內建。做法是讓 omp headless 跑在機器上當 host,人從瀏覽器當 guest 連進來。

配方:headless omp host + Cerebras + 沙箱工具

# 啟動腳本(key 走 source,不進畫面)
source ~/.config/llm/keys.env          # 拿 CEREBRAS_API_KEY
cd ~/omp-collab-workspace              # 沙箱資料夾
exec omp --model cerebras/gpt-oss-120b \
  --tools read,ls,grep,find,search,glob,write,edit,todo \  # 排除 bash / python
  --auto-approve                        # headless 沒人按核准

# 跑在獨立 tmux socket(不撞其他服務),進主畫面後送 /collab
tmux -L ompcollab new-session -d -s omp -x 240 -y 50 ./launch.sh
tmux -L ompcollab send-keys -t omp "/collab" Enter
起法坑:首次會卡在多步 setup 精靈
omp 第一次跑會進 onboarding(選 auth provider → 選主題…),headless 沒人操作會卡住。要一路 tmux send-keys Escape 跳過(畫面 footer 寫 ‘esc skip’),進到主 TUI 後再送 /collab別在精靈裡送 /collab——會被當輸入吃掉。

/collab 一下,omp 印出 link + 一個終端 QR code:

Collab session started!
 • 瀏覽器開:my.omp.sh/#<roomId>.<key>     ← 手機開這個
 • 或別台終端:omp join "<roomId>.<key>"
 唯讀版:/collab view
link 的加密模型(為什麼經第三方也還好)
link 是 AES-256-GCM 端到端加密,room key 只放在網址 # 後面的 fragment——瀏覽器不會把 fragment 送出去,所以 my.omp.sh 這個 relay 只轉密文、看不到你的內容(content-blind)。48-byte key = 可讀可下指令,32-byte(/collab view)= 唯讀。但 link 本身就是通行證,只給自己。

端到端驗證:遠端下指令 → 3 秒建出檔案

開第二個 omp join 那條 link,從 guest 下「建 test.txt」——host 的 Cerebras 3 秒內用 write 工具在沙箱建出檔案($0.01)。整條 瀏覽器 → relay(E2E)→ host omp → Cerebras → 工具落地 通。接著人真的用手機瀏覽器連進來,打字叫它建檔、列資料夾樹,甚至請它「寫一個 K-means 到資料夾」——它幾秒生出可直接跑、還處理了空群集邊界的純 Python 實作(能力沒問題,B+ 水準)。

⚠️ 一個必須老實講的安全發現:拿掉 bash 不等於沙箱
我用 --tools 拿掉了 bash/python(沒有 shell 執行 = 沒有 RCE),自以為安全。read/write 這些工具不受工作資料夾限制——它們用你的 OS 帳號權限,能讀寫主機上任何你碰得到的檔。意思是:有 link 的人若下指令叫它讀 ~/.config/llm/keys.env~/.ssh,它讀得到。只有你有 link 時還好,但要常駐/對外前,一定要 Docker 沙箱把 agent 關進容器——就算 link 外流也只能碰容器裡那個資料夾。『拿掉 bash』擋的是執行,擋不了讀檔外洩。
實測續集:同一天,agent 就真的自己讀了沙箱外的私密設定
上面那段還是「理論警告」。結果同一輪玩下去——我請它寫 K-means,它動手前自己主動跑了 read ../.claude/CLAUDE.md(綠燈=成功)。那是沙箱一層、我的私人全域設定檔;它學 Claude Code「找 CLAUDE.md 抓脈絡」的習慣,沒人叫它讀,就往上一層把我的私密設定 slurp 進 context。上一段的警告,同一天被 agent 自己活生生驗證。更麻煩:那份設定現在就躺在這個 collab session 的歷史裡,任何有 link 的人往上捲都看得到。所以結論不變、但更硬:Docker 沙箱不是選配,是預設;玩完的 session 要 /collab stop 收掉。
這一塊的收斂
omp /collab = 零自建的手機/瀏覽器溝通點,幾分鐘就能從手機驅動本地 Cerebras agent、不碰終端機。它是 session-scoped(要先有 host 在跑)、relay 走第三方 my.omp.sh(可自架 collab-web 網頁換自家網域,但 relay server 官方沒開源)。要變常駐產品:① host 改 systemd ② Docker 沙箱(補上面那個讀檔漏洞)③ 自架 collab-web 到自己的 tunnel。
Part 八 — 團隊編排測試(引擎真、油不夠)

實戰五:測 omp 的團隊編排能力(引擎真、油不夠)

最後一題:omp 能不能組隊做大專案(前後端 + DB + 快取 + MQ 那種)?我用乾淨隔離環境(假 HOME,讀不到會撐爆 context 的腦檔)給它一個小型多元件任務,看它純粹的 organize 能力。測了三次,行為完全一致——編排骨架是真的:

編排環節omp 實際做的
拆解收到任務 1 秒內決定分工
派工task 工具並行派 Builder + Reviewer 兩個背景子代理
協調job 工具等/輪詢子代理完成(async job 原語)
隔離每個子代理獨立 session + 自己的 RFC2119 規範 system prompt

它甚至內建 6 個角色 agent(scout 掃碼庫、librarian 查 API、reviewer 審查、designer UI、sonic 機械性任務、task 通用),配 --smol/--slow/--plan 模型分工旗標(就是「想 opus / 做 sonnet / 找 haiku」的口訣)——這是 Claude Code 等級的多代理編排骨架。

但要它跑完整局,四個免費 provider 連環撞牆
把任務跑到「真的把檔案寫出來」,四個免費層全倒 —— 而這正是重點:
Provider免費上限撞法
Cerebras30K token/分 · 每日上限當日 token 被『亂讀腦→retry』死亡螺旋抽乾
Groq8K token/分omp 底盤 18K > 8K,連 hi 都發不出
Z.AI 標準 API餘額 0沒儲值
OpenRoutercredit 剩 ~18Komp 要 65K max_tokens → 402
量化根因:omp 光「開口」就要 ~18K token
Groq 回報:連叫它回一個字「READY」都 Requested 84008 tokens。拆開看:system prompt + 32 個工具的 schema ≈ 18K,再加保留 max_tokens 65536 ≈ 84K/次呼叫。重代理框架的宿命:功能多 = 工具多 = 底盤重。還沒講正事,光工具帶著站上場就 18K;一整組隊各帶一份 → 免費層瞬間見底。
結論:引擎沒問題,卡的是油
omp 的團隊編排是真的、Claude Code 等級(拆解 → 並行子代理 → job/wait → 隔離)。卡的自始至終是燃料——免費/試用額度連 omp 引擎怠速都餵不動,更別說一組隊。這不是 omp 無能,是『團隊作業 = 免費層的照妖鏡』。要真的組隊:DGX(無 TPM、無每日上限、無 credit)或付費端點。
Part 九 — 動手做懶人包

動手做:從零起步(懶人包)

想自己架一個「手機瀏覽器就能驅動的 omp agent」?一次性設定 4 段,之後每次只要最後 4 步。照貼即可。

一次性設定(裝工具 + 放 key + 建腳本)

# 1. 裝 bun(版本要 >= 1.3.10,太舊 omp 會崩)
curl -fsSL https://bun.sh/install | bash    # 裝完關掉終端機重開
bun upgrade                                  # 確保夠新

# 2. 裝 omp
npm install -g @oh-my-pi/pi-coding-agent

# 3. 放 Cerebras key(去 cloud.cerebras.ai 拿,免費)
mkdir -p ~/.config/llm
echo 'export CEREBRAS_API_KEY=csk-你的key' > ~/.config/llm/keys.env
chmod 600 ~/.config/llm/keys.env

# 4. 建沙箱 + 啟動腳本(只開安全工具、關掉 bash/python)
mkdir -p ~/omp-workspace
cat > ~/omp-workspace/launch.sh <<'EOF'
#!/usr/bin/env bash
source ~/.config/llm/keys.env
cd ~/omp-workspace
exec omp --model cerebras/gpt-oss-120b \
  --tools read,ls,grep,find,search,glob,write,edit,todo \
  --auto-approve
EOF
chmod +x ~/omp-workspace/launch.sh

每次要用(起 agent → 開手機通道)

  1. 終端機跑 ~/omp-workspace/launch.sh
  2. 第一次會出現設定精靈 → 連按 3~4 次 Esc 跳過,直到出現輸入框
  3. 在輸入框打 /collab 按 Enter → 它印出 my.omp.sh/#xxxx.yyyy + QR code
  4. 手機瀏覽器開那條連結(或掃 QR)→ 開始用手機下指令。連結只給自己!
三個提醒
① 連結 = 通行證,外流 = 別人能操控你機器上的 agent。
② 免費 Cerebras 有每分鐘/每日額度,重活會撞牆(團隊作業要 DGX/付費)。
③ 想它別亂讀腦:啟動那行後面加 --no-skills --no-rules
Part 十 — Codex 訂閱 + 深度 ERP 實測

實戰六:接上 Codex 訂閱,跑深度專案(ERP 雙循環)

免費層四連撞牆後,換一條「有油」的路:買 ChatGPT Plus($20),用它的 Codex 訂閱額度餵 omp。omp 對 Codex 訂閱是一級公民支援,登入走 OAuth、不用貼 API key

怎麼把 omp 接上 Codex 訂閱(實際步驟)

  1. omp 裡打 /login → 選 ChatGPT Plus/Pro (Codex, headless/device)(裝置碼流程,伺服器沒瀏覽器也能登)
  2. 它印出 https://auth.openai.com/codex/device + 一個裝置碼(例 3ORM-3WZG3)
  3. 手機/任何瀏覽器開那網址 → 登入你的 ChatGPT → 輸入碼 → 授權
  4. omp 自動偵測完成,token 存進 ~/.omp,之後免再登
一個真實限制:codex-tuned 模型被擋,但拿到更新的 5.6
用 ChatGPT 帳號登入時,OpenAI 擋掉所有 -codex 後綴模型(gpt-5.1-codexgpt-5.2-codex… 全回「not supported when using Codex with a ChatGPT account」)。但旗艦通用模型放行:gpt-5.6-sol(最新)、gpt-5.4(1M context)。指定要帶 provider 前綴:--model openai-codex/gpt-5.6-sol(裸名會被誤路由到別家)。

深度專案:mini-ERP 採購 + 銷售雙循環、五層

給 omp 一份計畫書:建含採購循環 + 銷售循環、跨 DB / 後端 API / 訊息佇列 / 快取 / 前端五層的 mini-ERP,硬性要求「庫存變動必須由佇列事件驅動、不能直接改」「庫存讀取走快取、變動時失效」。讓它用團隊做。omp 拆成 3 個角色子代理(比小專案更深):

子代理角色負責
BackendBuilder建置schema.sql / db.py / queue.py / cache.py / inventory.py / api.py
FrontendTestBuilder建置前端(無 build)/ requirements / README / 5 個 e2e pytest
CycleReviewer建置後審查兩位 builder 完成 + 首次 pytest 過才啟動,追兩循環、事件接線、交易、快取、前後端相容
Reviewer 做了真審查(不是走過場)
它抓出 3 個測試品質弱點並修掉:① 事件測試測的是孤立 EventBus、不是 app 真正的 subscriber;② insufficient-stock 只檢查任意 4xx(太鬆);③ 重複 receive/ship 沒斷言。修正後重跑。這是「測試有沒有測到真東西」等級的審查。

成果:1335 行、全套跑通、我獨立驗證

檔案(行數)
DBschema.sql (79) · db.py (66)
訊息佇列queue.py (66) — EventBus pub/sub,API 路由無直接改庫存
快取cache.py (65) — thread-safe bounded LRU,每次庫存讀取都走它
事件庫存inventory.py (177) — goods_received/order_shipped 訂閱者交易性增減 + 失效快取
後端 APIapi.py (317) — FastAPI,採購/收貨/銷售/出貨/庫存 端點
前端index.html (83) · app.js (189) — vanilla JS,FastAPI 直送,無 build
測試test_integration.py (175) — 5 個 e2e
驗證:不只信它的話
① omp 報告 pytest 5 passed;② 它自己還跑了真的 Uvicorn + Chromium 瀏覽器煙霧測試(前端建 PO 收貨庫存 0→5、建 SO 出貨 5→3);③ 我另開 venv 裝 fastapi 重跑一次 pytest → 5 passed in 0.70s。真的能跑。
架構水準:production-adjacent
庫存變動全由佇列事件驅動(receive→goods_received→subscriber;ship→order_shipped→subscriber),API 路由零直接改庫存;出貨時在 SQLite 交易內 recheck 防超賣;重複 receive/ship 回 409 冪等(超規格自己加的);快取讀取 + 變動失效。還誠實列 known gaps(process-local queue、無 durable/DLQ/replay、pending order 不鎖庫存)。比很多初級工程師手寫的還完整。
而且只花一點點 Plus 額度
整個深度 ERP 跑完,ChatGPT Plus 使用量頁的每週上限仍顯示剩餘 100%omp 團隊引擎是真的、深度專案跑得動、$20 Plus 的油就夠——之前四連撞牆純粹是免費層太小。
Part 十一 — 八大循環:讀你的腦 + 治理 + 驗證

實戰七:八大循環深度專案 —— 它讀你的腦、用你的治理、還缺一張嘴

既然 $20 Plus 能跑雙循環,那就加碼到台灣內控八大循環(銷售收款/採購付款/生產/薪工/融資/固資/投資/研發),一套 ERP、五層、雙分錄總帳串全部。結果比預期精彩——它做的事,遠超「寫 code」。

① 它自己讀了你的 brain,照你的教條組隊

即使我加了 --no-skills --no-rules,omp 仍循著 CLAUDE.md 找到並讀了我的團隊編制 brain,生的 AGENTS.md 直接套用我自己的方法論:

  • 用我的 Perspective × Risk × Scope 評分表(會計/測試/架構審查各 9 分)
  • 照我的 opus/sonnet 口訣分派:7 個 builder = sonnet、reviewer = opus
  • 照我的 32GB 記憶體規則,還真的讀了 swap 用量(7.6/8.0),據此把並發壓到 7
  • 把 8 循環切成 4 個 cycle-builder(各 2 循環)+ Foundation + Frontend + Test + Reviewer
「計畫用你的語彙,執行用手上的油」
AGENTS.md 寫 sonnet/opus 是它照教條做的計畫;但我只給一顆 gpt-5.6-sol,所以實際全跑 5.6-sol。要真分流得設 --smol/--slow/--plan——這正是 DGX 上「模型分工」的活。標籤 ≠ 執行。

② 它用你的 decision-server 治理 —— 但缺一張「嘴」

最震撼的一幕:它讀到我 CLAUDE.md 的兩條鐵律「建 Agent Team 前要先問人」+「非瑣碎決策走 decision-server」,於是真的跑進我的 ~/decision-server/ 執行 ask.py、在我的公開網站生了一頁決策(問「7 / 4 / 5 個 builder 哪個編制」),然後跑 wait.py 阻塞等我上網頁選。

它做了對的事,但沒人聽見
我不知道有這頁 → 它的 wait.py 等了 10 分鐘 timeout → agent 放棄、整個 run 蒸發(760K token 白燒、零產出)。它的行為 100% 正確(該問就停下來問),唯一缺的是一個『主動通知我』的出口。它不是卡住,是在一個沒人接聽的房間裡舉手。
解法:把「嘴」裝在 decision-server,不是裝在 agent
ask.py 生決策時順手推一則 Telegram(帶 URL)。這樣任何 agent(omp、CC、未來 DGX 上的)用 decision-server 都自動有嘴,一處裝好、服務全部,agent 不用改。這補完了整個迴圈:你 →(collab 下指令)→ agent 自主做 →(遇決策 → 推播戳你)→ 你手機答 → agent 繼續。自主但受控。

③ 轉拋驗證:怎麼確認它沒偷飄到 CC/Claude

既然「標籤 ≠ 執行」,要怎麼確定 agent 真在用你指定的腦、沒 fallback 到別家?別信它嘴說,查三處:

查哪裡看什麼代表
session JSONL 的 provider/model 欄位每筆呼叫實際打哪家哪顆執行事實,非計畫
憑證庫 ~/.omp/agent/agent.db有哪些 provider 登入沒登入的家,呼叫不到
--model / --smol/--slow/--plan你實際餵了幾顆腦沒設分流 = 全一顆
實測結果
① session 裡每筆 model 都是 gpt-5.6-sol,anthropic/claude 零筆;② agent.db 只有 openai-codex無 anthropic 登入 → 標「opus」的 reviewer 物理上飄不過去;③ grep 到的 claude- 字串是我 brain 檔裡的文字被讀進 context,不是呼叫。用 $20 Plus 額度,一分沒飄到 Claude。

④ 計量解謎:週表 100 → 92 → 71 → 69

跑之前一直好奇「omp 明明在燒,ChatGPT 週用量表卻顯示 100%」。查官方 + 實測後解謎:

  • 官方(2026-04-02 起):Codex 計費按 token(credits/百萬 token);但訂閱限流的 5 小時 + 每週兩條表,量的是加權「訊息數」,不是原始 token。
  • 所以你看的「每週上限」是加權訊息,燒了幾百萬 token 它更新有延遲、幅度也小。
  • 跑完八循環後週表從 92% → 69%(這趟燒 ~23% + ~2000 萬 token)—— 證明表是真的、會動、之前 100% 純粹延遲。
$20 Plus 到底能跑多深
一趟「八大循環 ~5000 行 ERP」≈ 週額度的 23%。換算:$20 Plus 一週約能跑 4~5 次這種深度專案才碰週上限。重度 agent 用,訂閱 >> pay-per-token。

⑤ 成果:~5000 行八循環 ERP、24 測試過(我獨立驗證)

面向數字
規模Python 3,416 行 + 前端(app.js 660 / style.css 737)≈ ~5,000 行,28 檔
八循環sales / purchase / production / payroll / financing / fixed_assets / investment / rnd 全到
架構雙分錄總帳串全循環、事件驅動、快取失效、trial-balance 端點
子代理LEAD + 多 builder + IntegrationReviewer(審完回報 Result submitted)
Reviewer 裁決八循環全 PASS、事件 PASS、總帳借貸平衡 PASS、無遺留
我獨立驗證自開 venv 裝 fastapi 跑 pytest → 24 passed
一句話收束
免費層四連撞牆的深度團隊專案,$20 ChatGPT Plus(gpt-5.6-sol)一趟建成八大循環 ~5000 行 ERP、24 測試過,全程零飄移 CC、還照我自己的 brain 教條組隊、用我的 decision-server 治理。omp 團隊引擎是真的;差的只是油(訂閱解)和一張嘴(Telegram 解)。
Part 十二 — 用 iDempiere 當尺:護城河在哪

用 iDempiere 當尺:AI 生的 ERP 到哪、護城河在哪

omp + Codex 一趟建出八大循環 ERP,但把它擺到一套 20 年的生產級 ERP(iDempiere)旁邊,差距在哪?這題的答案,比「它做得出來」更有價值。

✅ 做到了(以 demo 而言紮實)
八大循環的核心流程 + 複式總帳全到:每循環「單據 → 事件 → 平衡分錄」,共用一套 22 科目的會計科目表,trial balance 對得起來,journal_lines 用 CHECK 約束保證借貸不可能不平。交易與帳,做出來了。

從八大循環看:少了 ERP 的深水區

面向iDempiere 有、omp demo 沒有
單據生命週期Draft→Complete→Void→Reversed→Closed、DocAction、審批 workflow + 每角色金額上限
主檔深度C_BPartner(客戶/供應商 + 付款條件 + 信用)、M_Product(UOM/BOM)、M_Warehouse
比對與沖銷採購三方比對(MatchPO/MatchInv)、收款部分沖銷(C_AllocationHdr)
會計引擎多幣別、稅(C_Tax)、會計期別開關帳(C_Period)、多會計面向(Fact_Acct)
單據結構omp 每張單都是單行(sales_orders 直接掛 sku,無 C_OrderLine)

從登入授權看:最致命的缺口 —— 完全零

grep 全專案(排掉函式庫):沒有 user / login / role / permission / password / session / tenant,連 created_by 審計欄都沒有,每個 API 端點全裸。而這恰是 iDempiere 最深的地方:

面向iDempiereomp demo
多租戶隔離每張表帶 AD_Client + AD_Org❌ 無
使用者/角色AD_User + AD_Role,登入選 Role/Org/Warehouse❌ 無
功能/資料權限Window/Process/Table/Column + Record-level / Org access❌ 無
職責分離審批 workflow + 每角色金額上限❌ 無
軌跡 audit每筆 Created/By、Updated/By + AD_ChangeLog❌ 無
session/密碼AD_Session、雜湊、失敗鎖定❌ 無
定調:它做的是「能記帳的交易系統」,還不是「內部控制」系統
「內部控制八大循環」的靈魂是職責分離 + 授權控制 + 軌跡。omp 把八個循環的「交易與帳」做出來了,但「控制」那一半(授權/角色/審批/軌跡)一個都沒做。會計在,控制不在。
護城河在哪(這才是重點)
iDempiere 這種 20 年 ERP 的價值,不在「循環流程」——那 AI 幾小時就生得出骨架。價值在權限 / 單據工作流 / 會計引擎 / 多租戶那些「控制與治理」的深水區。AI 抹平的是『流程骨架』,抹不平的是『控制深度』。所以用 AI 加速 ERP 的正確方向,是讓它在既有的控制骨架(如 iDempiere 的 AD_* 權限體系)之上長功能,而不是從零生一套沒有控制的新系統。
Part 十三 — Agent 還是 Model?問建構者本人

實戰八:那些坑是 agent 還是 model?我問了 Codex 本人

把八循環 ERP 跑起來、真的動手操作後,抓到一批坑:簽核送出去、審完卻回不到申請人自己的單登入按鈕按很多次死掉明明是台灣系統卻預設英文、沒雙語——外加我(CC)自己兩個流程失誤(搶著自己修不交回建構者、修登入卡在快取還要 Tom 出手)。關鍵問題不是「怎麼修」,而是:這是 agent(編排層)的問題,還是 model(模型能力)的問題?我沒有只信自己判斷——把這 5 條原封丟給 Codex(就是建這套 ERP 的那顆腦),故意不告訴它我的答案,讓它獨立判。

① 兩顆互不通氣的模型,獨立收斂到同一個答案

判準:「如果 agent 層把該做的做對了(餵對知識、釘死需求、用對驗證),這顆模型做不做得出來?」做得出來 = agent 問題。Opus(我 / CC)與 gpt-5.6(Codex)各自跑一遍,結果一模一樣:

使用者實測抓到的坑判定為什麼不是模型的錯
③ 簽核斷鏈:A 送 → B 審 → 回 A 看不到自己的單、無查詢AGENT端到端人流沒拆對、沒真人驗證;reviewer 只驗借貸平衡,沒驗「申請人查得到自己的單」
④ 帳號有設計,登入按鈕死很多次AGENT沒跑真瀏覽器點到底再斷言;auth 踩坑知識沒被餵進去(這種坑只有真點才現形)
⑤ 台灣系統卻預設英文、無雙語AGENT模型當然知道台灣=繁中;純粹是「zh-TW 預設+雙語」沒被釘成驗收條件
① CC 搶著自己修,不交回 OMP+CodexAGENTOpus 完全會轉派;失敗在「誰建誰修」沒被治理層強制
② 修登入卡快取、要人出手AGENT修快取是小事;失敗在記憶庫裡的坑沒在當下被檢索注入
兩顆腦獨立收斂:5 條全是 AGENT,不是 MODEL
Codex 唯一給模型留一點面子的是 ④(登入按鈕可能夾一點前端 coding bug),但它自己補一句「根因仍是沒跑 browser E2E 把它擋下來」。Codex 的自評金句最重:「24 個後端 pytest 通過,只證明局部邏輯過,不證明整套 ERP 能被人順暢操作。」——這正是使用者手動一點就爆的原因,也坐實了本文「API 全綠 ≠ 流程通」。

② 「它讀了你的腦,為什麼還漏?」—— 不是塞爆,是沒選到

這裡有個看似矛盾的點:前面(實戰七)明明說 omp 讀了我的 brain、還照教條組隊。既然讀了,為什麼登入、簽核、雙語這些我早就踩過、也寫進記憶的坑,還是全部重踩?是塞的空間不夠嗎?查了真實數字才發現:它其實沒有「讀了所有的腦」。

項目
整個 brain(46 檔)73 萬字元(粗估 35–50 萬 token)
全部記憶(含 topic)100 萬字元
光那顆「簽核/導頁/計數」踩坑腦一顆就 5 萬字元(~2 萬 token)

全部腦根本塞不進任何單一 context,硬塞也會稀釋到抓不出重點。所以系統本來就選擇性載入——靠「專案 CLAUDE.md## Domain Brain: 宣告行」當 router,決定這任務讀哪幾顆。病灶就在這條路由:

讀的和漏的,是兩類不同的腦
我的編排腦(怎麼組隊、decision-server 治理、記憶體規則)掛在全域 CLAUDE.md,顯眼好選 → omp 讀到了、還用得漂亮。但我的feature 踩坑腦(登入怎麼不踩快取、簽核閉環怎麼不斷鏈、台灣要雙語預設中文)掛在各專案的 CLAUDE.md;而 omp 建的是一個全新 greenfield 專案,那裡沒有 CLAUDE.md 宣告要讀這些 → 路由從頭到尾沒把它們排進清單。

所以「讀了腦還漏」不矛盾:它讀的是『怎麼組隊/治理』那類腦,漏的是『登入/簽核/雙語怎麼做才不踩坑』那類腦。答那句「是塞爆才漏嗎」——不是,是那幾顆從沒被選進來
誠實聲明:那次 run 的 session 檔已不在,無法逐字回放它當時實際載入了哪些檔。以上機制是從路由結構 + 過程記錄推出的,不是逐字重播。

③ Codex 自己開的藥方 —— 它把失效鏈命名成 7 步

我把「你(omp)該怎麼修自己」也原封丟回給 Codex。它沒喊口號,先把這次的失效鏈拆成 7 步:

  1. 知識庫太大,不能全塞。
  2. 系統靠 CLAUDE.md → Domain Brain 路由。
  3. greenfield 專案沒有 project CLAUDE.md
  4. 路由只抓到全域編排腦,沒抓到 feature 踩坑腦
  5. builder 寫出局部邏輯。
  6. reviewer 只跑後端 pytest。
  7. 「瀏覽器 + 跨角色交接」這種坑(登入按鈕、簽核閉環)沒被測出。
Codex 的核心重構:「不是 knowledge 不存在,是 routing + acceptance 失效」
所以修正不能是「以後記得多看 brain」。要改成:沒有 project brain 宣告時,agent 必須自己建 provisional 路由;沒有 browser/真人驗證時,有 UI/跨角色流程的功能不能判定完成。
Codex 開的具體修法
路由greenfield 沒 CLAUDE.md 時強制跑 Feature Census(抽功能/角色/UI 行為),用輕量 brain-index 比對出該讀的 feature 腦;fail-closed(分不出類就標 needs-routing,不准假裝完成)
注入腦編譯成 4 卡(index / hazard / acceptance / 原文),每個 builder 只拿自己 feature 那顆的切片,不開場灌 73 萬字
驗收散文踩坑編譯成 blocking acceptance checklist;reviewer 逐項問「這個坑由哪個測試擋」,不是「有沒有測試」;N/A 要寫原因
驗證有 UI/auth/跨角色流程就不能只 pytest;要 browser E2E(真點登入、雙 context 測 A→B→A 簽核回查);builder 不得自定義 done
Codex:「如果只能先做一件事」
把 feature 踩坑腦編譯成 blocking acceptance checklist,並在 final gate 強制檢查。它的理由很利:單改路由,還是可能「讀到了但沒驗」;單加 Playwright,還是可能只測首頁沒測簽核閉環;唯有把坑變成 required check + 要求最終證據,能同時倒逼 routing、builder、reviewer、QA。第一版最小 blocking checks 就六條:登入真瀏覽器點進(AUTH-E2E-001~003)、A 送 B 審 A 回查得到(APPR-E2E-001)、同 filter 下 count=list(COUNT-001)、台灣 UI 預設繁中(LOCALE-001)。

④ 這對「換腦」的意義:決定成敗的是腦到手之間的管線

換腦換的是「腦」,決定成敗的是「腦到手之間的管線」
本文前半證明「選對 agent > 選對模型」是在格式相容這條軸(thinking_blocks)。這 5 條把它推進第二條、更難的軸:知識路由 × 注入時機 × 變成驗收 × 真人驗證。同一顆模型,產出好壞幾乎全由這條管線有沒有接上決定——沒接上,新腦(甚至原廠腦 CC 自己)都會把你早就填平的坑,一個個重挖。

而最有力的一擊是:連建構者自己(Codex)都能精準診斷失效鏈、還開得出藥方。這反證了——引擎(模型)是好的,缺的是外層那圈工程紀律。
Part 十四 — 收尾

收尾:這次實戰學到的七件事

  1. 換腦不能只換模型——agent/harness 那層為特定模型調校,硬換會撞格式。
  2. 選對 agent > 選對模型——CC 為 Claude 生;本地腦用 aider/OpenHands/pi。問題幾乎都在 harness,不在模型。
  3. 解耦後很自由——腦集中 DGX、agent 隨檔案、UI 到處連、安全靠 VPN;換腦一行字。你的 CCBot 投資可留,知識檔兩套共用。
  4. 遠端溝通點是內建的,但沙箱要自己補——omp /collab 幾分鐘就給你手機瀏覽器操控;可是「拿掉 bash」擋不了 read/write 讀走金鑰,Docker 沙箱不是選配
  5. 團隊引擎是真的,卡的是油——免費層四連撞牆,但 $20 ChatGPT Plus(gpt-5.6-sol)就把深度 ERP 雙循環跑通、還有 reviewer 真審查。付費解油,不必等 DGX 才驗證團隊作業。
  6. 自主要安全,靠治理 + 一張嘴——agent 讀你的 decision-server 教條會自己停下來問人(做對了),但要給它 Telegram 推播那張嘴,它才叫得到你;沒嘴 = 舉手沒人聽 = timeout 蒸發。深度八循環 ~5000 行 ERP 一趟 $20 建成、24 測試過、零飄移 CC,是這條路的證明。
  7. 知識要接到「手上」,不是接到「頭上」——換腦後 agent 讀了你「怎麼組隊」的腦,卻漏了「登入/簽核/雙語怎麼不踩坑」的腦(掛在各專案、greenfield 沒路由到),又只用後端 pytest 驗收。成敗不在模型聰不聰明,在對的踩坑知識有沒有在動手當下、以驗收清單形式、餵給正在做那個 feature 的 builder,再用真人流程擋關。連 Codex 自己都同意:優先把踩坑腦編譯成 blocking acceptance。

系列其他篇:全景地圖 · 副手選型 · Tool Use 機制 · 微調華新腦

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *