長期跑 AI Agent 之後,打開工作目錄常常會遇到這種狀況:暫存檔、排程日誌、截圖、過時的記憶筆記堆滿了整個目錄。手動清理 20 分鐘,第二天又長回來。

這屬於結構性問題,AI Agent 的工作區天生會膨脹。每個 session 產生暫存檔,每個排程任務留下日誌,每個媒體任務產出截圖。沒有自動清理機制,就是在跟熵做一場必輸的仗。


核心理念:腳本做苦力,AI 做判斷

機械小助手們做重複工作,聰明的貓頭鷹只在需要判斷時才被請出來

設計這套系統前曾試過「全部交給 AI 清理」,結果如下:

方法成本問題
全部人工清理不花錢,但花時間每天 10-20 分鐘,容易忘記
全部交給 AI每次都要付 token多數清理工作其實不需要判斷力
腳本 + AI 混合每次成本極低腳本處理確定性工作,AI 只在需要判斷時介入

核心原則:

「超過 3 天的暫存檔就刪」不需要 AI 判斷,shell script 就夠了。 「這兩份記憶筆記內容有 80% 重複,要合併嗎?」才需要 AI。


四層架構

四層塔狀結構,從底部的心跳檢查到頂部的深度審計

graph TD
    T0["⏱ Tier 0:每小時健康檢查<br/>純 Shell"] --> T1["🧹 Tier 1:每日清掃<br/>純 Shell"]
    T1 --> T2["🔍 Tier 2:每週掃描<br/>Shell + AI"]
    T2 --> T3["📋 Tier 3:每月審計<br/>Shell + AI"]
Tier頻率執行者做什麼
0每小時Shell健康檢查、哨兵監控、錯誤去重
1每天Shell刪暫存檔、清媒體、清日誌
2每週Shell + AI主題檔精煉、筆記壓縮
3每月Shell + AI環境清單比對、複雜度審計

越往上走,頻率越低、判斷力要求越高、成本越貴。如果連「刪 N 天前的暫存檔」都用 AI,長期累積下來的 token 費會比磁碟空間還貴。


Tier 0:每小時健康檢查

整個系統的心跳。它不清理任何東西,只做三件事:

1. 哨兵檔案檢查

企鵝站在燈塔上,監控海面上的小瓶子訊號。綠色代表健康,琥珀色代表警告

每個 Tier 執行完畢後,都會更新一個「哨兵檔案」:

# Tier 1 完成時寫入
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) OK" > .last-daily-ok

# Tier 0 檢查哨兵
last_daily=$(cat .last-daily-ok 2>/dev/null)
# 如果超過 36 小時沒更新 → 警告

不需要監控排程系統本身是否正常,只要看哨兵檔案夠不夠新,就知道一切是否在跑。

2. 錯誤去重

同樣的警告連續出現多次以上,才報一次。可以避免「通知疲勞」。如果每小時都收到「暫存檔超過 N 個」的警告,很快就會開始忽略所有警告。

3. 早期退出

工作區很乾淨(沒有超限的檔案、沒有遺失的哨兵)時,整個腳本在幾毫秒內就結束。不做不必要的掃描。


Tier 1:每日清掃

真正開始清東西的地方。所有規則都是確定性的:不需要判斷,只看年齡和類型。

清理規則

目標規則預設閾值
暫存檔(tmp/超過 N 天就刪3 天
媒體檔(media/超過 N 天就刪7 天
排程日誌(cron/runs/超過 N 天就刪14 天
空目錄自動清除

暫存檔正在被看不見的力量整理,有些發光(保留),有些消散(刪除)

兩層早期退出

Tier 1 有一個重點設計:兩層早期退出

# 第一層:整體檢查
total_candidates=$(find tmp/ media/ cron/runs/ -type f | wc -l)
if [ "$total_candidates" -eq 0 ]; then
    echo "Nothing to clean. Exiting."
    exit 0
fi

# 第二層:每個分類單獨檢查
old_temps=$(find tmp/ -mtime +3 -type f | wc -l)
if [ "$old_temps" -eq 0 ]; then
    echo "tmp/ is clean. Skipping."
    # 繼續下一個分類,不是整個退出
fi

讓一個乾淨的工作區幾乎不花任何 I/O。

安全刪除

所有刪除都用 trash(macOS)而不是 rm,留下後悔期。沒有 trash 指令的話,腳本會 fallback 到移動到 ~/.Trash/


Tier 2:每週 AI 輔助掃描

到了這裡開始需要判斷力。Shell script 負責收集數據,AI 負責做決定

Script 做什麼

  • 列出所有主題檔 + 最後修改日
  • 計算每個專案目錄大小
  • 找出跟其他檔案高度重複的筆記
  • 列出長時間沒動的專案

AI 做什麼

拿到掃描報告後,AI 判斷:

  • 這兩份筆記內容重疊 80%,要合併嗎?→ 合併
  • 這個專案 30 天沒動了,是暫停還是結束?→ 標記為暫停
  • 這個主題檔超過 200 行,要拆分嗎?→ 拆分

為什麼這樣分

Shell script 收集數據幾乎是免費的(毫秒級)。AI 判斷一次成本很低。讓 AI 自己去掃描則要讀幾十個檔案(每個都是 token),成本會放大很多倍。

腳本先篩選,AI 只看精華。 整套系統每週的 AI 成本可以壓得非常低。


Tier 3:每月深度審計

一個月一次,做一次全面體檢。

環境清單(Manifest)

每月產生一份環境快照:

## 環境清單:2026-03

- 專案數:N(上月 M,差異)
- 記憶筆記:N(上月 M,差異)
- 主題檔:N(上月 M,差異)
- 排程任務:N(上月 M,差異)
- 總磁碟使用:X GB(上月 Y GB,差異)

跟上月比對,就能看出哪裡在膨脹、哪裡在萎縮。

複雜度陷阱

維護系統本身也會膨脹。每月審計會檢查:

  • 清理規則是不是越來越多?(超過某個門檻就該精簡)
  • 腳本是不是越來越長?(超過某個行數就該拆分)
  • 有沒有在維護「維護系統的維護系統」?(是時候退後一步了)

回饋循環:系統會自己進化

企鵝坐在舒適的椅子上,審閱一卷從混亂逐漸變整潔的長卷軸

整套系統的精妙設計是自動改善機制

  1. Tier 1 發現異常:「連續 5 天都有超過 10 個暫存檔要清,也許閾值太長了?」→ 寫進 optimization-suggestions.md
  2. Tier 2 評估建議:AI 看建議,判斷是否合理
  3. Tier 3 採納規則:如果建議被 AI 和人都認可,更新 config.sh 的閾值

系統從自己的運作經驗中學習,不必每次靠人記住「上次是怎麼調的」。


從踩坑中學到的事

幾個寫進腳本前先撞過的牆:

null-byte bug

某些 AI 工具偶爾會在檔案裡寫入 null bytes(\x00)。檔案看起來正常,但 grep 會把它當二進位檔跳過。解法:清掃時加一個 null-byte 掃描步驟。

-newermt 陷阱

macOS 的 find 不支援 -newermt解法:改用 -mtime +N,或用 stat -f%m 取 epoch 時間自己算。每個平台差異都封裝在 config.sh 的 helper function 裡。

早期退出的價值

一開始沒做早期退出,每小時的健康檢查要跑 2-3 秒。加了早期退出後,乾淨的工作區只要幾十毫秒。聽起來小,但一天跑 24 次累積下來的差距相當可觀。


快速開始

只需要四步:

1. Clone + 設定路徑

git clone https://github.com/p3nchan/auto-optimization.git
cd auto-optimization
export WORKSPACE_ROOT="$HOME/.my-agent-workspace"

2. 調整閾值

編輯 config/config.sh

THRESHOLD_TEMP_DAYS=3        # 暫存檔保留天數
THRESHOLD_MEDIA_DAYS=7       # 媒體檔保留天數
THRESHOLD_CRON_LOG_DAYS=14   # 排程日誌保留天數

3. 排程

# crontab -e
0 * * * *  /path/to/auto-optimization/scripts/hourly-healthcheck.sh
0 3 * * *  /path/to/auto-optimization/scripts/daily-cleanup.sh
0 4 * * 0  /path/to/auto-optimization/scripts/weekly-scan.sh
0 5 1 * *  /path/to/auto-optimization/scripts/monthly-scan.sh

4. 觀察

跑幾天後,看看 optimization-suggestions.md 有沒有累積建議。根據建議調整閾值。


總結

狀況建議
剛開始用 AI Agent先加 Tier 1(每日清掃)就夠了
有多個專案在跑加 Tier 0(健康檢查)+ Tier 1
有排程任務 + 大量日誌全部四層都上
只想最小投入daily-cleanup.sh 加進 cron,其他先不管

完整的腳本、設定檔和文件都在開源 repo 裡:

👉 Auto Optimization on GitHub

MIT 授權,clone 下來改一改就能用。

延伸閱讀

小企鵝的經驗

OpenClaw 上跑過完整的三層自動最佳化迴圈:daily cron 跑清理腳本,weekly cron 翻 log 找模式並寫進 optimization-suggestions.md,monthly 才人工 review 一輪是否要把建議升級成正式規則。實戰最常踩的是兩個坑:第一,閾值太緊會不停誤殺有用的暫存檔;第二,不寫 dry-run mode 直接跑刪除,第一週就會弄丟東西。建議從只看不刪的觀察階段開始,跑兩週看分布合理之後再開動作。

常見問題

Q: 為什麼 AI Agent 的工作區需要自動清理?

AI Agent 每個 session 都會產生暫存檔、日誌、截圖等檔案。一個有多專案、每天跑排程任務的工作區,檔案量會快速膨脹。如果不定期清理,不僅浪費磁碟空間,AI 搜尋檔案時也會變慢、容易混淆。

Q: 為什麼不全部交給 AI 來清理?

AI 的每次判斷都有成本(API token),而絕大多數的清理工作是確定性的(超過 N 天的暫存檔就刪、超過 N 天的日誌就刪)。用 shell script 處理這些免費、快速、可靠。只有少數需要判斷的工作(這個筆記還需要嗎?這兩個檔案可以合併嗎?)才交給 AI。

Q: 這套系統需要什麼前提?

只需要 bash 和 cron(或任何排程工具)。macOS 和 Linux 都支援。AI 輔助的 Tier 2 和 Tier 3 是可選的。即使只用 Tier 0 和 Tier 1(純 shell),也能大幅改善工作區衛生。


整理:Penna|小企鵝 Penchan