天平傾向實心方塊——有客觀 ground truth 複審才壓得下判斷

對抗式複審不是橡皮圖章:兩輪相反結果的對照

這天我在整理自己的 AI agent 記憶系統,順手研究了兩個開源專案(TencentDB-Agent-Memory 和 obra/superpowers),挑出幾個值得學的改動。 其中兩個我沒自己下判斷,而是交給同一套流程:讓一個較快、較便宜的 model 實作,再讓另一個同型 model 去對抗式複審。兩個改動、同一套流程,結果卻相反——一個被否決、一個通過合併。 回頭看,決定結果的不是流程本身,是「複審手上有沒有客觀標準可以打」。 那套流程長什麼樣 拆成兩個角色,刻意用不同的 agent: 實作 agent:在隔離的 git worktree 改 code、自己驗證、commit、回報。 複審 agent:進同一個 worktree,被明確指示「去 refute 第一版的宣稱、找邊界 case」,不是幫忙背書。 關鍵設計只有一條:複審不能是實作者自己。實作者對自己寫的東西有動機說「大致還好」,這個動機本身就是盲點來源。 第一輪:一個排序改動,被 golden bench 打回 背景是記憶搜尋的排序,想從線性加權換成 RRF(reciprocal rank fusion)。 實作 agent 加了新模式、保留舊的當預設、跑了幾個 query 的 A/B 對照,自評「大部分持平,有一個 query 略差」,並宣稱測試通過。 複審 agent 做了實作 agent 沒做的一件事:跑 repo 裡本來就有的 golden benchmark。結果不太好看: MRR 從 0.675 掉到 0.188、Recall@1 從 0.60 掉到 0.07。15 題裡 8 題退步、0 題改善。不是「略差」,是全面退化。 一個真 bug:RRF 讀到的是四捨五入到小數點三位的顯示值。在低區分度的 query 上,幾百個候選塌成十來個相異值、出現 35-way 平手,排序退化成按掃檔順序抽籤。 一個空測試:複審做了突變測試——把舊路徑的一個關鍵係數整段拿掉,測試竟然全綠。所謂「測試通過」根本沒在保護舊行為。 判決:否決,branch 直接刪掉。舊的本來就是預設,零損失。 ...

July 9, 2026 · 1 分鐘 · Mark Lee
水面下的分層冰山——遷移當下看不見的四層盲區

換機八連發:Mac cutover 的四層盲區,與「驗設定存在」的錯覺

六月底主力 Mac 送修,我把整套環境切到備用機:dotfiles 有 curated allowlist、install.sh 是八步 orchestrator、記憶系統用 rsync 同步、31 個 launchd job 一鍵掛上。自檢通過,cron 交棒乾淨,當天我以為遷移完成了。 接下來五天,八個依賴陸續炸開。每一個都是「遷移當下不報錯,排程跑到那條路徑才死,而且死得很安靜」。這篇整理完整時間線、四層盲區分類,以及最後真正有用的驗收方法。 八連發時間線 # 發現日 缺的東西 症狀 潛伏 1 Day 1 自建 CLI binary + GNU timeout 交易 bot cron exit 127 數小時 2 Day 1 交易用 pip 套件 + ~/.config/ 錢包設定檔 餘額查到 $0,bot 靜默跳過進場 14.6h 半天 3 Day 4 anthropic pip 套件 新聞掃描每輪回報「0 signals」,被當正常噪音 4 天 4 Day 5 jieba + rank_bm25 記憶混合搜尋靜默降級成 legacy 關鍵字模式 5 天 5 Day 5 備份加密 passphrase 檔 異地 secrets 備份每晚 exit 1,無告警 4 天 6 Day 5 bun Telegram bridge 的 poller 每天重啟失敗,收訊聾了五天 5 天 7 Day 5 messaging plugin 的 pairing 狀態檔 bot 把主人當陌生人,要求重新配對 5 天 8 Day 5 codex CLI + auth 寫這篇文章要產封面圖時當場發現 5 天 第 8 發是在整理這篇文章的過程中發現的。這說明一件事:你永遠列不完,只能改變驗收方法。 ...

July 7, 2026 · 2 分鐘 · Mark Lee
Ponytail:逼 AI agent 少寫 code 的 YAGNI 規則集

Ponytail:逼 AI agent 少寫 code 的 YAGNI 規則集

讓 AI agent 寫 code 久了,會發現一個固定毛病:你只要一個能跑的小東西,它給你一個帶設定檔、抽象層、還預留三個未來擴充點的「框架」。它當然會寫,毛病出在它的預設值——多寫一點比較安全。 最近讀了一個叫 Ponytail 的開源專案,專門治這個。它的招牌語是一句很有態度的話: The best code is the code never written. 我把它的原始碼 clone 下來實際跑過一遍 hook,這篇是拆解之後的筆記——它哪裡有意思、哪裡要保留懷疑。 它不是工具,是一份「規則」 第一個容易誤會的點在它的形態。Ponytail 把一份規則集注入成 agent 自己的 system context,agent 讀進去之後直接「就是」懶模式。它不是一個你去呼叫的 library,也沒有一個「外部第二意見」在旁邊讓 agent 查詢引用——規則直接長在 agent 身上。 所以你不會看到 agent 回你「根據 Ponytail……」。它只是行為變了:動手前先停下來想一輪「這真的需要寫嗎」。 核心:一道 YAGNI 階梯 整套東西的心臟是一道階梯。動任何 code 前,從上往下走,停在第一個成立的那一階: 1. 這東西需要存在嗎? speculative = 跳過,一行說明 (YAGNI) 2. 標準庫能做嗎? 用它 3. 平台原生功能涵蓋嗎? <input type="date"> 勝過 picker library 4. 已裝的依賴能解嗎? 用它,不為幾行能解的事新增依賴 5. 一行能解嗎? 那就一行 6. 真的都不行才: 寫能動的最小實作 兩階都成立就取較高的那階。第一個能動的懶解,就是對的解。 ...

June 17, 2026 · 2 分鐘 · Mark Lee
Telegram 訊息驅動本機 always-on agent 的橋接架構

把 Claude Code agent 接回 Telegram:always-on bridge 與四個坑

我在 Mac 上跑一個叫 cc-memory-project 的個人 agent 環境(從 OpenClaw workspace 演化來的),有自製的 hybrid memory search、knowledge graph、cron → flag → SessionStart hook pipeline。一直缺一塊:人不在電腦前的時候,沒辦法用手機驅動它。 這篇記錄怎麼用 Claude Code 原生的 channels 功能把 Telegram 接回來、做成開機常駐,計價路徑怎麼選,以及部署過程踩到的四個坑。順帶講同一段時間長出來的兩個搭配能力:記憶的混合搜尋,跟抓 X/Twitter 走遠端瀏覽器。 為什麼是現在接回來 之前想過用 tmux 加一層腳本去駭出一個遠端輸入管道,一直沒做。結果 Claude Code 自己補上了 --channels:原生支援把外部聊天介面(Telegram、Discord 等)接成 agent 的輸入輸出端。官方做掉了我本來要自己駭的東西,那就不用駭了。 另一個推力是計價。Anthropic 五月公告,六月中之後 claude -p、Agent SDK、GitHub Actions、以及經 ACP 認證的第三方 app,會從訂閱池移出去、改吃獨立的月度 credit。但互動式 TUI(terminal 或 IDE)明確不受影響、繼續吃訂閱。所以如果我能讓 Telegram bridge 走的是「互動 TUI」這條路,就不會被新政策抽走額度。 計價路徑:先確認走的是哪條 動手之前先做了一個關鍵驗證:claude --channels(互動模式,不加 -p)開出來的 session,它的 entrypoint 是什麼。 # 開一個 channels session(用一個假的 echo plugin 測) claude --channels plugin:fakechat@claude-plugins-official # 然後去翻這個 session 的 jsonl,抓 entrypoint ls -t ~/.claude/projects/<project>/*.jsonl | head -1 \ | xargs grep -o '"entrypoint":"[^"]*"' | head -1 結果是 entrypoint=cli,不是 sdk-cli。這就確認了:claude --channels 是互動 TUI 那條路,吃訂閱、不碰新的 credit pool。boot log 也看得到完整互動 TUI 起來、SessionStart hook 把記憶底圖載進去、訊息進來 agent 回應。 ...

June 11, 2026 · 3 分鐘 · Mark Lee
Memory archive 與 tombstone — 影片借鑑落地視覺

從 Anthropic 三人對談到我的 8 行 patch

最近 Anthropic 官方放了一支 Building the future of agents with Claude 的對談,由 Alex Albert(Claude Relations)、Brad Abrams(Claude Developer Platform PM)、Katelyn Lesse(Engineering Lead)三人主持。12 分鐘左右,涵蓋 Claude Developer Platform 改名、agent 的定義、unhobble the model、Claude Code SDK 作為 general-purpose agentic harness、context pruning、agentic memory primitive、observability。 我在 Mac 上跑一個叫 cc-memory-project 的個人 agent 環境(從 OpenClaw workspace 演化),有自製的 hybrid memory search、knowledge graph、cron → flag → SessionStart hook pipeline。看完對談做了一些對映,挑兩個有具體 patch 落地的記錄一下。 五點對映 對談重點 我的個人 agent 現況 落地動作 Unhobble the model — scaffolding 在新模型上會變成 liability spec/ 三檔 + AGENTS.md / CLAUDE.md 約 800 行 砍 6 段過時 scaffolding(Group Chats / Heartbeats / 返工循環段移走 / MM 從主力改 fallback / 工具決策改 reference / OpenClaw sync 段濃縮)約 -1050 tokens SDK 是 general-purpose agentic harness 用 Claude Code 本身 + cron/hook/skill 自製 harness 不需動 Context pruning + tombstone memory-archive.py 把舊月份 section 直接刪掉 加 tombstone 留痕跡(第一個 patch) Agentic memory primitive hybrid search + graphify + hall taxonomy + always-on recall 不需動,方向對 Observability for long-running tasks SessionStart hook prompt-budget-telemetry 已寫 JSONL 升級為結構化 event(第二個 patch) Patch 1:Tombstone for archive_timeline scripts/memory-archive.py 的 archive_timeline 會把 MEMORY.md 裡 ### 2026-XX 這種舊月份 section 搬到 memory/timeline-archive.md。原本邏輯是直接刪除: ...

May 9, 2026 · 3 分鐘 · Mark Lee
一個下午補完 17 張 blog 封面:Codex gpt-image-2 + 一個 sandbox 陷阱的救援

一個下午補完 17 張 blog 封面:Codex gpt-image-2 + 一個 sandbox 陷阱的救援

這個部落格有個存在很久的小債:17 篇文章裡,一張封面都沒有。每次打開文章列表都是一排光禿禿的灰底 placeholder,社群媒體分享預覽也只有標題文字。 一直沒處理是因為:要嘛手動一張張找圖很煩,要嘛丟給外部服務(Midjourney / DALL-E)要自己掏錢 + 管 API key + 存圖檔對應 slug,光想這個 pipeline 就懶。 直到昨天刷到一則推文:Codex CLI 0.122 把 gpt-image-2 預設打開了,不需要 API key,走你現有的 ChatGPT 帳號計費。配套還有一個叫 baoyu-skills 的 Claude Code skill 集合,專門餵 Codex 生各種規格的圖。 也就是說:整條 pipeline 已經在我手邊,只是我不知道。那今天就來補債。 最後結果 17 張全生出來了,過程中踩到一個 --sandbox workspace-write 的誤會,有 14 張看起來全失敗,後來發現圖其實都生成了,只是被困在 Codex 的快取目錄裡。這篇記錄流程 + 踩坑 + 救援。 驗證:Codex 真的能畫圖 先 live test。我的 Codex 版本剛好是 0.122.0。 codex exec --skip-git-repo-check --sandbox workspace-write \ --output-last-message "$OUT" -m gpt-5.4 \ '$imagegen Create a simple 256x256 PNG of a red circle on white background. Save as /tmp/test.png. Final message: only the file path.' \ < /dev/null 跑完 ls /tmp/test.png 就有了。32 KB PNG、256×256 8-bit RGB、花了 ~30k tokens。 ...

April 22, 2026 · 4 分鐘 · Mark Lee
從 OpenAI Agents SDK 偷了三個概念,用在我們的 Claude Code 工作區 template

從 OpenAI Agents SDK 偷了三個概念,用在我們的 Claude Code 工作區 template

OpenAI 在 4 月 15 日更新了 Agents SDK,加入了 sandbox 隔離、Harness/compute 分離、Manifest 工作區描述、Capabilities 分層。看完技術文件後我的第一反應是「這跟我們在做的事情不一樣」,第二反應是「但裡面有幾個結構性概念可以偷」。 這篇記錄我們從中借了什麼、怎麼落地到 openclaw-workspace-template v3.0.0,以及為什麼大部分東西我們選擇不抄。 兩個系統的定位差異 先把前提講清楚:OpenAI Agents SDK 跟我們的 workspace template 解決的是完全不同的問題。 OpenAI Agents SDK 我們的 workspace template 目標使用者 企業,多租戶 SaaS 個人,單使用者 執行環境 雲端 sandbox(Modal / E2B / Cloudflare / Vercel) 本機 Mac / Linux,直接 filesystem access 權限模型 Tool calls 在 unprivileged container 裡跑,隔離網路和 secret 跟使用者同權限,能碰 git / cron / Telegram / Obsidian State serialize_session_state() / resume(),snapshot 整個 workspace 檔案系統就是 state,git 就是 snapshot Memory 內建 Memory() capability,session close 自動 summarize → consolidate 自建 MemPalace:hall-tagged journal + 主題筆記 + weekly reflection + knowledge graph OpenAI 在解的是「怎麼讓 agent 安全可靠地跑在生產環境」。我們在解的是「怎麼讓一個人的知識和自動化系統持續累積和整合」。拿來直接比就像比 AWS Lambda 跟家裡的 crontab。 ...

April 16, 2026 · 4 分鐘 · Mark Lee