Claude Code Skills 总“放飞自我”? 从自由生成到原子交付的三阶段约束实践

15 阅读6分钟

当你读完我之前的一篇文章创建你的第一个 SKILL并去创建了你第一个 SKILL 后……

Claude 的 Code Skills 很强,但也很“野”。 上个月,我让 CreatePage Skill 帮我建个用户管理页
它自信回复:“✅ 成功!”—— 结果页面空白,Mock 缺字段,CI 全红。
这不是模型不行,而是我们把确定性任务交给了概率系统
经过三轮迭代,我们总结出一条清晰路径:从自由生成 → 规则约束 → 原子交付。最终实现零人工修复、15 秒交付、99.9% 成功率
如果你也在被“假自动化”困扰,这篇复盘值得一看。

问题出在哪

image.png

传统软件是确定性系统:输入 A,永远输出 B,可以用 ASSERT 验证。
Agent(AI 智能体)是概率性系统:输入 A,可能输出 B、C、D……每次轨迹都不同,无法用传统断言判断对错。

这是范式冲突: 前端工程交付,本质上是一个强确定性需求 ;但大模型生成代码,却是一个概率采样过程

知道这个后,我把 SKILL 纪律分为三个阶段

第一阶段:自由生成 —— 快,但内容不稳定

🛠️ 典型做法

就像我们最开始一样用简单对话自动生成的 SKILL 去跑业务

  • 自动化直接写入 Vue 文件
  • 读取路由配置,以字符串拼接方式追加新路由
  • 根据经验模板生成 Mock 数据

✅ 优势

  • 上手快:让大模型自己生成,效果还不错。
  • 适合探索:临时需求、原型验证、非关键路径
  • 看起来高效:一次调用,完成多项操作

⚠️ 但问题很快暴露

  • 结果不稳定:相同输入,多次执行结果不一致
  • 错误静默:工具报告成功,实际漏了关键步骤
  • 难以验证:没有断言机制,只能人工检查

第二阶段:规则约束 —— 给自由加上护栏

当错误开始影响交付节奏,我们的第一反应是:加校验、定流程、限权限

🛠️ 典型做法

  • 强制执行顺序(先问参数,再操作)
  • 对输入参数做格式校验(如路径必须以 / 开头)
  • 展示正确格式跟错误格式指导输出
  • 错误处理
  • 增加后置验证步骤(如检查文件是否存在)

模板如下

---
# 文档前置信息
---

# [简要用途说明 - 1–2 句话]

## 概述
[描述此技能的功能、使用场景及所提供的价值]

## 前置条件
[列出所需的工具、文件或上下文]

## 操作步骤

### 步骤 1:[第一步操作]
[使用祈使句给出明确指令]
[必要时提供示例]

### 步骤 2:[下一步操作]
[使用祈使句给出明确指令]

### 步骤 3:[最后一步操作]
[使用祈使句给出明确指令]

## 输出格式
[说明结果应如何组织]

## 错误处理
[当出现问题时的应对措施]

## 示例
[提供具体的使用示例]

## 相关资源
[引用随附的 references/、assets/ 等内容]

✅ 收益明显

  • 错误率下降:成功率提升至 ~95%
  • 行为更可预测:执行路径被显式约束
  • 团队信心增强:至少知道“应该怎么做”

持续维护文档

  • 主动的:用多了会抽象总结的更好;对业务理解的更深
  • 被动的:工具能力在提升 (模型的、Claude的),文档描述需要删除或者升级;业务变化

打造你团队 SKILL 飞轮

第三阶段:原子化脚本 —— 把确定性交给程序

真正的可靠性,来自原子化的、可验证的程序单元

🛠️ 核心思想

  • 前端交互层只负责收集参数并触发执行
  • 所有工程逻辑由独立脚本完成:文件生成、路由配置(AST)、Mock 注册、验证、回滚
  • 脚本是黑盒:输入参数,输出唯一结果,失败则自动还原

✅ 当前终极解

  • 可靠性极高:脚本是确定性程序,支持单元测试
  • 成本更低:执行仅需 15 秒,无冗余交互
  • 维护简单:业务逻辑变更只需改脚本,调用方零改动
  • 可审计:每一步可记录、可回放、可回滚

📊 实测数据

  • 成功率:>99.9%
  • 平均耗时:15 秒
  • 人工修复率:<0.1%

参考

我上一篇文章Claude Code Skills 的混合自动化方案

为你的 SKILL 选择合适的阶段

现实中,有些操作确实难以封装:

  • 需要动态推理(如“根据日志建议修复方案”)
  • 涉及多系统联动(如“查监控 + 查代码 + 提 PR”)
  • 依赖上下文风格(如“按上周的组件风格改这里”)

对这类任务,第二阶段(规则约束)是合理过渡

但关键在于:要有意识地识别哪些操作“未来可标准化” ,并预留接口。

工程纪律不是“一刀切”,而是“分层治理”:

  • 能原子化的 → 立刻封装为脚本
  • 暂不能原子化的 → 加强约束 + 监控
  • 永远无法标准化的 → 接受其不确定性,仅用于辅助决策

如何判断该停在哪一阶段?

这个任务是否有明确、固定的输出规则?
├─ 否 → 保持在 Stage 1 或 2(接受不确定性)
└─ 是 → 能否封装成单一入口脚本?
    ├─ 否 → 用 Stage 2(强约束 + 验证)
    └─ 是 → 升级到 Stage 3(原子化脚本)

目标不是“所有自动化都脚本化”,而是“所有确定性操作都不依赖文本拼接或经验推测”。

总结

自动化工具的价值,不在于它能“智能生成”,而在于它能稳定交付符合规范的结果

真正的工程纪律,是清晰划分:

  • 哪些环节可以依赖启发式逻辑(如需求理解、草稿生成)
  • 哪些环节必须由确定性程序保证(如文件写入、配置变更)

通过 自由生成 → 规则约束 → 原子交付 的三阶段演进,
我们不是在追求“全自动”,而是在构建一个可信赖、可维护、可扩展的自动化体系

因为只有当每一次自动化输出都可预期、可验证、可回滚
它才真正成为团队的生产力,而不是负担。

最后,也是预告

SKILL 很强,如果不生效,等于裸奔。又回到运气编程。
我们团队在使用时做过一个统计:在不干预的情况下, AI 主动调研项目 Skills 的概率只有 40%左右。也就是说,你规范写得再好依旧有 60% 的时间在裸奔。

怎么办,且看我下篇文章 用 Hooks + Commands + Agents + Skills 打造超溜的Claude Code工作流