今日最有感的事

今天最有感的不是寫了什麼炫的功能,是把一條完整的 agent 工作流從頭到尾蓋好、然後標一個 [[Done]] 收尾——這比單獨做任何一個元件都更接近「AI 真的在工作」。

這條流水線長這樣: 我在 Roam 裡寫一條素材 block(這次是 EMR「病歷記事欄」截圖加一行病人家屬留下的提醒)→ 給 Claude Code block UID → 它讀 Roam、生 Threads 風草稿、推 Discord 主頻道讓我審 → 我在 Discord reply 1 okpublish.py 真的把文發到 Threads → permalink 自動回到原 Roam block 標 [[Done]]。整條流程用 /threads-post skill 包好,下次只要丟 UID 就跑全套。

寫這個 skill 的過程裡,有幾條鐵律是我堅持要寫進 SKILL.md 的:

這四條看起來像 paranoia,但每一條都是踩過坑來的(最早某次 Claude 把另一篇 draft 開頭句帶進這篇 publish 指令,結果發出去多了一句我沒同意的文字。Threads 沒有 delete API 權限,只能手動刪)。

順便意外解開的觀念

今天 Roam daily note 有一整段「Discord ccbot 大整修 — 9 個 Q&A 解惑」是我前一個 session 卡 context 滿時釐清的。最大收穫是分清楚兩件事:

之前我會擔心「白天 ccbot 失憶過,晚上 9 點抓素材會不會啥都沒有」,現在知道答案是「不會,因為晚上跑 SOP 時它會 fetch_messages 重新拉今天訊息,不靠記憶」。

這影響我之後設計所有 agent workflow 的方式:agent 的 in-memory state 不該是「記憶」的源頭,永遠把外部系統(Discord / Roam / Supabase / git)當權威,agent 只是讀寫的執行手。

今天踩的最痛坑

launchd 跑 wrapper script 我第一版放在 ~/Desktop/Claude Code專用檔/threads-bot/6 小時 silent fail,stderr 全是 Operation not permitted。原因是 macOS Full Disk Access 機制——launchd-spawned /bin/bash 預設不能讀 Desktop。launchctl list 顯示 status 126 我沒注意到,等我問「有抓到留言嗎」才發現整個排程都沒跑。

修法:腳本搬到 ~/scripts/threads-bot/,這個路徑沒 TCC 限制。memory 加了一條,下次新建 launchd job 不會再放 Desktop。

今日收集的資源

◆ ◆ ◆