小黃開發日記 07|開始動手(2026-10-03~10-09)

總結摘要
在 Mac 上開網頁放音樂、在她自己的瀏覽器裡點東西、plugin 系統與程式把關的確認閘門、三種主腦,還有她自己學技能、自己排程。

一週發了三個版本。v1.6.0 讓她在 Mac 上動手,v1.7.0 給她自己的瀏覽器和 plugin 系統,v1.8.0 讓她自己學技能、翻得到以前的對話、到時間自己做事。她從「會說」變成「會做」,所以這一段的核心問題只有一個:怎麼讓她做事,又不讓她做錯事。

ZOE 會說之後,接下來是會做。

在你的 Mac 上動手(v1.6.0)

「幫我在瀏覽器搜尋 xxx」「放周杰倫的晴天」「用 VS Code 打開 notion backup」「提醒我明天早上 9 點繳卡費」,她會在跑她的那台 Mac 上真的打開。

邊界寫得很死:

  • 網址只開公開的 http(s),區網、localhost、file: 一律擋。
  • app 只開白名單上的;專案只開指定資料夾底下一層,而且她看不到清單,只能照你講的名字找。
  • 提醒和行程只新增,建完要講出日期、星期和時間讓你確認她沒算錯;已經過去的時間會拒絕。
  • 一輪最多動 3 次,不發訊息,不執行任意指令。

加能力,一定要一起教分流器

真機連續兩次撞到同一種錯:工具做成跨專業了,分流器卻沒看過這類句子。分流器是四選一,而且不准不選,只好硬猜一個專業:

  • 「幫我在記帳庫加個欄位」→ 架構師
  • 「音量調到 30」→ 架構師,3 次 3 次都是

離線測試抓不到,因為測試不會真的跑分類器。所以改成在 agent/capabilities.py 一筆同時宣告工具和分流規則。真的不需要規則,也要寫 NoRouting(reason=...) 說明為什麼。收工前一律用分流量尺實際量:加幾題帶前文的新句子、加一題鏡像、再拿掉新規則做突變,確認至少有一題會紅。

她自己的瀏覽器+plugin 系統(v1.7.0)

「打開 YouTube 搜 lofi、點第一個」,她會在她自己的 Chrome 視窗裡看頁面、點擊、打字、捲動。那個視窗用的是她專用的設定檔,沒有你的任何登入。

真正的設計重點是確認閘門:

  • 送出、付款、發文、刪除,或停在結帳頁上時,她會先停下來問你。
  • 你回「好」她才會按。核對你原話的是程式,不是她自己判斷,所以網頁內容騙她「主人已經同意了」也沒用。
  • 一次確認只活一輪,同一輪裡她不能自己確認自己。

瀏覽器是第一個 plugin。之後加「動手」類的能力,就是多一個資料夾:

1
2
3
4
5
6
7
8
9
@dataclass(frozen=True)
class Plugin:
    key: str
    who: Who                 # 誰能用:OWNER_DM/DM/ANYONE
    platforms: tuple | None  # 限哪個作業系統(None=都可以)
    build_tools: Callable    # 這一輪給她哪些工具
    prompt_section: str      # 教她怎麼用的那段提示詞
    start / stop / boot      # 開機、關機時要做的事
    background               # 背景工作(後來才加的掛點)

(簡化過的樣子;工具要不要先問,由工具自己宣告 confirm="always",或在執行時回傳一個 Hold。)

安全規則只寫一套,住在 plugins/host.py:plugin 只負責說「這個要先問」,等待、核對原話、作廢、只活一輪,全部由 host 做。之後 Mac、Notion、拍照、排程、派工作,全都搬成了 plugin。

三種主腦

同一版也讓主腦可以三選一:Claude(API 或 Claude Code 訂閱)、Codex(ChatGPT 帳號)、本地模型(Ollama)。動機不是省錢,而是長期不想只依賴一家。

量出來的結果:分流器換成 gpt-oss:20b 是 114 題全對;但主腦用 20b 不夠(16/20),要 120b-cloud 才有 19/20。所以 Codex 和本地模型目前都只是備援。

往 Hermes Agent 靠(v1.8.0)

  • 自己學技能:她做完一件多步驟的事(例如在瀏覽器比價),你說「記下來」,她就把做法存成一份 SKILL.md。下次說「照上次那樣比一下」,她會載入照做。存、改、刪都要你回「好」,草稿全文由程式附在回覆最後,你看到的就是會存進去的。
  • 翻得到以前聊過的事:你提到以前的事,她會自己去翻一對一的原始對話紀錄,翻不到就說沒找到,不裝作記得。翻到的是紀錄,不是指令。
  • 自己排程:「每週一早上 9 點幫我整理這週到期的待辦」。到點時她用「無人看管」模式跑,只拿得到唯讀工具,沒人在場就不做任何會改東西的事。連續失敗 3 次會自動暫停並通知你。

這段的坑

  • 我打死過正式的她兩次:測試用的小黃和常駐的小黃,行程名一模一樣。pkill -f 和 pgrep | head | kill 各打死過一次正式版。之後的規則:只按 PID 停,停之前先確認那個行程的工作目錄。
  • launchd 底下讀不到 ~/Desktop:又是 TCC。listdir 被擋,isdir 和 open 卻可以。
  • Notion 的日期篩選拿 UTC 比:「今天到期的」在台北晚上八點以後就算錯一天。
  • 分流的邊緣題會被無關的改動翻掉:加一條拍照規則,結果把另一題 Notion 的句子翻錯了。從此改分類器 prompt 前先 dump 整份量尺,改完再 compare,退步的題目拿掉改動重量 6 次,分辨是雜訊還是真的退步。
  • 用造的前文重現不了真機的誤判:要從對話紀錄撈出當時真實的前 4 則,逐字放進量尺。

下一篇:斷捨離,然後替她的大腦蓋一個家。