起因

朋友推了一个开源项目 DeepSeek-TUI,一个跑在终端里的 DeepSeek 编程 Agent。让我看看有什么能借鉴的。

看完挑了两个觉得有价值的:

  1. Plan 模式 — 模型先列计划,用户确认再动手
  2. Rollback — 每个操作有回退策略,不满意一键退回

按照我以前的习惯,该建文件了:加 Checklist 规范、写 rollback 脚本、建备份目录、定义 /rollback 命令……

但这次我多问了一句:能不能不做加法做减法?


思路反转

Plan 和 Rollback 的本质不是工具,是一个习惯

复杂任务先列计划、设计回退手段、用户点头再执行。

AGENTS.md 的执行策略表,原来有三行:

任务类型执行方式
简单任务直接执行
复杂任务预读 + 子代理分析
开发任务dev-orchestrator

改动就一行:把"复杂任务"的执行方式改成 “先列计划+回退方案,用户确认再执行”,然后把"开发任务"的关键词并进去。

一行字解决的事情,不需要建文件、不需要写脚本、不需要定义命令。

然后我回头看了看现有的 8 个技能——既然在做减法,干脆一起减。


第一轮:拆技能

删 skill-orchestrator

这个技能叫"技能自动触发器",核心功能是判断任务类型然后转发给 dev-orchestrator。

SKILL.md 自己写得很诚实:“转发 dev-orchestrator 9 步 SOP”

它就是一个路由器。而路由逻辑已经在 AGENTS.md 里了。

减掉:一个技能目录。

server-manager 改名 → sucaddy-ops

这个技能只服务 sucaddy 项目(内网 overlay 网络运维),叫 server-manager 太泛了。改名 sucaddy-ops,触发词聚焦到 sucaddy 相关。

version-check 合并进 health-check

原来有 4 个脚本:health-check.shdeploy.shversion-check.shdistribute.sh

version-check.sh 做的事是收集各节点二进制文件的 md5,对比一致性。但 health-check.sh 已经逐节点输出 md5,只是不汇总。

给它加了个 --version 参数,version-check 就不需要独立存在了。

减掉:1 个脚本。

auto-memory 的 venv

auto-memory(记忆检索)和 speech-to-text(语音转录)各自独立装了一套 FunASR + PyTorch。

结果:auto-memory 的 venv 287MB,speech-to-text 的 venv 908MB

而 auto-memory 本来就在调 speech-to-text 的 HTTP API。它根本不需要自己的 venv。

减掉:287MB。

清垃圾

翻了一圈发现每个技能目录都有 CHANGELOG.md 和 MANIFEST.md。翻了一下 OpenClaw 官方的 skill-creator 规范,明确写着:

Do NOT create extraneous documentation or auxiliary files, including: CHANGELOG.md

官方说别建这些文件,但我们每个技能都有。

减掉:5 个 CHANGELOG + 4 个 MANIFEST + 4 个旧日志。


第二轮:拆 dev-orchestrator

dev-orchestrator 是一个 9 步开发 SOP:

需求澄清 → 设计评审 → 任务拆解 → 编码 prompt → 测试 prompt → 审查 prompt → 代码标准检查 → 文档同步 → Git 提交

22 个文件,bin/src/tests/utils 全齐。

但我仔细看了一下——这 9 步做的事情,模型自己全都会。

步骤做什么模型不靠技能能做吗?
1. 需求澄清结构化需求文档
2. 设计评审技术方案
3. 任务拆解DAG 依赖推导
4. 编码 prompt生成 prompt 模板
5. 测试 prompt同上
6. 审查 prompt同上
7. 代码标准检查CODE_STANDARDS.md 合规
8. 文档同步更新 CHANGELOG已违反官方规范
9. Git 提交Conventional Commits

第 8 步"文档同步"在自动生成 CHANGELOG.md——就是官方明确禁止的那个文件。

更离谱的是,这 22 个文件里还有 5 个 utils 文件 0 引用

文件行数引用数
utils/errors.mjs2320
utils/git-ops.mjs2320
utils/notify.mjs2110
utils/task-tracker.mjs2980
utils/logger.mjs20

975 行代码,没有一个函数被调用过。 还硬编码了旧电脑的路径。

先做了减法——砍掉死代码、砍 CHANGELOG 生成、砍 MANIFEST 生成。删了 ~1800 行。

然后想了想:剩下的部分跟 AGENTS.md 的"先列计划+回退方案"有什么区别?

开发任务本质上就是复杂任务的一种。审核代码架构和开发新功能,思考链路一样,只是输出物不同。

砍掉整个 dev-orchestrator,AGENTS.md 里多一行:“开发任务额外关注 CODE_STANDARDS.md”。

减掉:25 个文件,8970 行代码,一个技能。


最终结果

指标优化前优化后
技能数85
AGENTS.md 执行策略3 行2 行
净删代码~15,000 行
净删文件76 个
省磁盘~290MB
功能损失

5 个保留的技能

sucaddy-ops      ← sucaddy 运维(3 脚本)
speech-to-text   ← 语音转录(FunASR)
auto-memory      ← 记忆检索
blog-manager     ← 博客管理
_shared          ← 共享依赖

AGENTS.md 执行策略

任务类型关键词执行方式
简单任务读、查看、列出、运行、检查直接执行
复杂任务审核、分析、对比、研究、开发、实现、重构先列计划+回退方案,用户确认再执行

感悟

1. 加法是本能,减法是功力

看到新项目的特性,第一反应是"我也加一个"。但加之前问一句"能不能不新建文件"——答案往往是可以。

2. 官方规范不是建议,是约束

OpenClaw 的 skill-creator 明确说 “Do NOT create CHANGELOG.md”,但我们每个技能都有。说明代码会偏离规范,而且偏离了自己不会回来。定期审计是必须的。

3. 最贵的代码是没人用的代码

dev-orchestrator 里 975 行死代码(0 引用),占 utils/ 目录的绝大部分。这些代码不会出错,不会报警,不会拖慢性能——但它们占用认知带宽。每次读代码都要跳过它们。

4. 技能是工具,不是资产

一个技能的存在理由是"不可替代"。skill-orchestrator 不可替代吗?不,AGENTS.md 一行就够了。dev-orchestrator 不可替代吗?不,模型自己会写代码、会测试、会提交。

能写进 AGENTS.md 的技能,就不该独立存在。


Git 记录

ede048f 删 dev-orchestrator:9 步 SOP → AGENTS.md 复杂任务纪律
3fce2eb dev-orchestrator 减法:删 5 死 utils + 2 templates + CHANGELOG/MANIFEST 生成逻辑
9db5282 减法优化:删 skill-orchestrator + 合并 version-check + 清垃圾文件 + Plan/Rollback 纪律

简洁是基础,高效是要求,稳定是底线,安全是红线。