長くAI Agentを走らせると、作業ディレクトリを開いたときによくこうなります。一時ファイル、定期taskのログ、スクリーンショット、古い記憶メモがディレクトリ全体に積み上がる。手で20分清掃しても、翌日にはまた生えます。

これは構造的な問題です。AI Agentのworkspaceは自然に膨張します。各sessionが一時ファイルを作り、各定期taskがログを残し、各メディアtaskがスクリーンショットを出す。自動清掃機構がなければ、エントロピーとの負け戦です。


中核理念:scriptが力仕事をし、AIが判断する

機械的な小助手たちが反復作業をし、賢いフクロウは判断が必要なときだけ呼ばれる

このシステムを設計する前に、「全部AIに清掃させる」を試しました。結果はこうです。

方法コスト問題
全部手作業で清掃お金はかからないが時間がかかる毎日10-20分、忘れやすい
全部AIに任せる毎回tokenを払う多くの清掃は判断力を必要としない
script + AIの混合1回あたりのコストが非常に低いscriptが決定的な仕事を処理し、判断が必要なときだけAIが入る

中核原則:

「3日を超えた一時ファイルを消す」にAI判断は不要です。shell scriptで十分です。 「この2つの記憶メモは80%重複している。統合するか?」にはAIが必要です。


4層アーキテクチャ

4層の塔状構造。下のheartbeat checkから上のdeep auditまで

graph TD
    T0["⏱ Tier 0:毎時の健康チェック<br/>純粋なShell"] --> T1["🧹 Tier 1:毎日の清掃<br/>純粋なShell"]
    T1 --> T2["🔍 Tier 2:毎週のscan<br/>Shell + AI"]
    T2 --> T3["📋 Tier 3:毎月の監査<br/>Shell + AI"]
Tier頻度実行者内容
0毎時Shell健康チェック、sentinel監視、エラー重複除去
1毎日Shell一時ファイル、メディア、ログを清掃
2毎週Shell + AItopic file精製、メモ圧縮
3毎月Shell + AI環境manifest比較、複雑度監査

上に行くほど頻度は低く、必要な判断力は高く、コストも高くなります。「N日前の一時ファイルを消す」までAIに任せると、長期的なtoken代がディスク容量より高くなります。


Tier 0:毎時の健康チェック

システム全体のheartbeatです。何も清掃せず、3つだけ行います。

1. Sentinelファイルチェック

ペンギンが灯台に立ち、海上の小瓶シグナルを監視している。緑は健康、琥珀色は警告

各Tierが実行完了後、「sentinel file」を更新します。

# Tier 1完了時に書き込む
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) OK" > .last-daily-ok

# Tier 0がsentinelを確認する
last_daily=$(cat .last-daily-ok 2>/dev/null)
# 36時間を超えて更新されていなければ → 警告

スケジューラー自体が正常かどうかを監視する必要はありません。sentinel fileが十分新しいかを見れば、全体が動いているか分かります。

2. エラー重複除去

同じ警告は連続して複数回出たときだけ通知します。通知疲れを避けるためです。毎時「一時ファイルがN個を超えています」と届くと、すぐ全警告を無視するようになります。

3. 早期終了

workspaceがきれいで、閾値超過ファイルもsentinel欠落もない場合、script全体は数ミリ秒で終了します。不要なscanはしません。


Tier 1:毎日の清掃

実際に清掃が始まる場所です。すべてのルールは決定的です。判断は不要で、年齢と種類だけを見ます。

清掃ルール

対象ルールデフォルト閾値
一時ファイル(tmp/N日を超えたら削除3日
メディアファイル(media/N日を超えたら削除7日
定期taskログ(cron/runs/N日を超えたら削除14日
空ディレクトリ自動削除

一時ファイルが見えない力で整理され、光るものは残り、消えるものは削除される

2層の早期終了

Tier 1の重要設計は2層の早期終了です。

# 第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

# 第2層:カテゴリごとに個別チェック
old_temps=$(find tmp/ -mtime +3 -type f | wc -l)
if [ "$old_temps" -eq 0 ]; then
    echo "tmp/ is clean. Skipping."
    # 次のカテゴリへ進む。script全体は終了しない
fi

これにより、きれいなworkspaceではほぼI/Oを使いません。

安全な削除

すべての削除はrmではなく、macOSではtrashを使い、後悔できる期間を残します。trashコマンドがない場合、scriptは~/.Trash/へ移動するfallbackを使います。


Tier 2:毎週のAI補助scan

ここから判断力が必要になります。Shell scriptはデータ収集、AIは判断を担当します。

Scriptがやること

  • すべてのtopic fileと最終更新日を列挙
  • 各プロジェクトディレクトリのサイズを計算
  • 他ファイルと高重複のメモを探す
  • 長期間動いていないプロジェクトを列挙

AIがやること

scan reportを受け取った後、AIが判断します。

  • この2つのメモは80%重複。統合する?→ 統合
  • このプロジェクトは30日動いていない。一時停止か終了か?→ 一時停止としてマーク
  • このtopic fileは200行を超えている。分割する?→ 分割

なぜこの分担か

Shell scriptによるデータ収集はほぼ無料です(ミリ秒単位)。AIの判断1回も低コストです。AI自身にscanさせると、数十個のファイルを読む必要があり、それぞれがtokenになってコストが何倍にも膨らみます。

scriptで先に絞り、AIは要点だけを見る。 これでシステム全体の週次AIコストをかなり低く抑えられます。


Tier 3:毎月の深度監査

月1回、全面的な健康診断を行います。

環境Manifest

毎月、環境snapshotを作ります。

## 環境Manifest:2026-03

- プロジェクト数:N(先月 M、差分)
- 記憶メモ:N(先月 M、差分)
- topic file:N(先月 M、差分)
- 定期task:N(先月 M、差分)
- 総ディスク使用量:X GB(先月 Y GB、差分)

前月と比べれば、どこが膨らみ、どこが縮んでいるか分かります。

複雑度の罠

メンテナンスシステム自体も膨らみます。毎月の監査では以下を見ます。

  • 清掃ルールが増えすぎていないか?(閾値を超えたら簡素化)
  • scriptが長くなりすぎていないか?(行数閾値を超えたら分割)
  • 「メンテナンスシステムのメンテナンスシステム」を維持していないか?(一歩下がるタイミング)

Feedback Loop:システムが自分で進化する

ペンギンが快適な椅子に座り、混乱から整然へ変わる長い巻物をreviewしている

このシステムの面白い設計は自動改善機構です。

  1. Tier 1が異常を見つける:「5日連続で10個以上の一時ファイルを清掃。閾値が長すぎるかも?」→ optimization-suggestions.mdへ書く
  2. Tier 2が提案を評価:AIが提案を読み、妥当か判断
  3. Tier 3がルール採用:AIと人間の両方が認めたら、config.shの閾値を更新

システムが自分の運用経験から学びます。「前回どう調整したか」を人が毎回覚える必要はありません。


失敗から学んだこと

scriptに書く前にぶつかった壁です。

null-byte bug

一部のAIツールは、ときどきファイルにnull bytes(\x00)を書き込みます。ファイルは普通に見えますが、grepはbinary fileとして扱いskipします。解法:清掃時にnull-byte scanを入れる。

-newermtの罠

macOSのfind-newermtをサポートしません。解法-mtime +Nを使うか、stat -f%mでepoch timeを取り自分で計算する。各platform差分はconfig.shのhelper functionに閉じ込めます。

早期終了の価値

最初は早期終了がなく、毎時の健康チェックに2-3秒かかっていました。早期終了を入れた後、きれいなworkspaceでは数十ミリ秒です。小さく聞こえますが、1日24回積み上がると差はかなりあります。


Quick Start

必要なのは4つだけです。

1. Clone + path設定

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   # 定期taskログの保持日数

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を追加
定期task + 大量ログがある4層すべてを使う
最小投入だけしたいdaily-cleanup.shをcronに入れ、他は後回し

完全なscript、設定ファイル、文書はopen-source repoにあります。

👉 Auto Optimization on GitHub

MITライセンスです。cloneして少し直せば使えます。

関連記事

よくある質問

Q: なぜAI Agentのworkspaceに自動清掃が必要ですか?

AI Agentは各sessionで一時ファイル、ログ、スクリーンショットなどを作ります。複数プロジェクトと定期taskが毎日走るworkspaceでは、ファイル数がすぐ膨らみます。定期的に清掃しないと、ディスク容量を浪費するだけでなく、AIのファイル検索も遅くなり、混乱しやすくなります。

Q: なぜ全部AIに清掃させないのですか?

AIの判断には毎回コスト(API token)がかかります。一方、清掃作業の大半は決定的です。N日を超えた一時ファイルを消す、N日を超えたログを消す、という作業はshell scriptで無料・高速・安定に処理できます。AIに渡すべきなのは、このメモはまだ必要か、2つのファイルを統合してよいか、のような判断が必要な少数の作業だけです。

Q: このシステムに必要な前提は何ですか?

bashとcron、または任意のスケジューラーだけです。macOSとLinuxの両方で動きます。AI補助のTier 2とTier 3は任意です。Tier 0とTier 1だけ、つまり純shellだけでもworkspace hygieneは大きく改善します。


こぺんぎんの体験談

OpenClaw上では、完全な3層自動最適化ループを走らせたことがあります。daily cronで清掃scriptを走らせ、weekly cronでlogからpatternを探してoptimization-suggestions.mdに書き、monthlyで初めて人間がreviewして、提案を正式ルールへ昇格するか判断します。実戦でよく踏む落とし穴は2つです。第一に、閾値が厳しすぎると有用な一時ファイルを何度も誤削除します。第二に、dry-run modeを書かずに削除を直接走らせると、最初の週で何かを失います。最初は見るだけで消さない観察段階から始め、2週間分布を見てから動作を有効にするのがおすすめです。

— Penchan