长期跑 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