AI Agent Skill 工程化 09:让 Skill 自己变好——走向自进化流水线

不是「装一个叫 Darwin 的工具,Skill 就会自己变好」。 而是:真实问题 → 写成可测的东西 → 一次只改一处 → 考不过就回滚。

前言

一句话:让 Skill 走向自动化,需要有要求和约束。

开场:改完 Skill,你怎么知道没改坏?

2026 年 6 月 22 日,我用 frontend-dev-prompt-craft 跑了一轮真实任务:订单继承与合并功能,任务本身做完了。

复盘时却发现一堆刺:PRD 里的接口 path 是 /api/resition/...,项目里真正请求的是 leave/...。Skill 生成的提示词经常只写一边,下游 Loop 一接就漂飞走了。

这类问题以前怎么处理?记在脑子里,改天改两句 SKILL.md,凭感觉说「应该好了」。

但是现在,我把问题写进 skill-issues.jsonl,排了优先级,锁了一个假设,改了校验脚本,再跑 fixture 回归------eval-007 PASS,旧用例没挂,才 KEEP

这篇文章讲的就是这条线。

不是「装一个叫 Darwin 的工具,Skill 就会自己变好」。 而是:真实问题 → 写成可测的东西 → 一次只改一处 → 考不过就回滚。

配套仓库:

•脚手架:plugins/frontend-team-toolkit/skill-engineering

•案例 Skill:skills/frontend-dev-prompt-craft

08 讲原则,09 讲怎么跑

08篇把道理说清楚了:单一修改面、固定验证标准、人类设边界、KEEP/REVERT。

09 只做一件事------把这些原则落到你们仓库里已经有的脚本上:

复制代码
真实使用
  → skill-issues.jsonl
  → triage_issues.py
  → convert_issue_to_eval.py(或手工补 eval)
  → grade_evals.py(改前基线)
  → 写 evolution-hypothesis.json,只改一个维度
  → grade_evals.py + check_regression.py
  → KEEP 就发版;挂了就回滚

口诀还是那句:问题可观测、Eval 可锚定、变异可单假设、回归可棘轮。

先用人话讲一遍

把 Skill 当成一段会跑偏的程序,就好懂了:

|------------|---------------------------------------|
| 你熟悉的 | 自进化里对应什么 |
| Bug 单 | skill-issues.jsonl 里的一行 |
| 排期 / 优先级 | triage_issues.py |
| 单元测试 | evals/evals.json + fixture |
| 改代码前先跑测试 | grade_evals.py 打基线 |
| 一次只修一个 bug | evolution-hypothesis.json 锁一个维度 |
| CI 红了不许合 | check_regression.py ,high 挂就 REVERT |

「自进化」听起来很玄。落地后,它就是:别凭感觉改 Skill,改完要考试。

前置条件:没有这些,别谈自动变好

跑通这条线,Skill 目录至少要有:

SKILL.md

evals/evals.json(建议 ≥ 3 条)

skill-issues.jsonl

results.tsv

.skill-meta.json

用脚手架自检:

复制代码
python3 plugins/frontend-team-toolkit/skill-engineering/bin/validate-skill.py \
  plugins/frontend-team-toolkit/skills/frontend-dev-prompt-craft

还有一条硬条件:想做确定性回归,就要有 fixture。

没有 fixture 时,你只能靠 run_evals.py 调 Agent 实测------慢、贵、不稳定。frontend-dev-prompt-craft 后来把 eval-001~007 全补上 fixture,才做到 grade_evals.py7/7 PASS。这不是锦上添花,是门禁能自动化的前提。

七步流水线(对照真实试跑)

下面每一步,都对应 2026-06-22 那次 frontend-dev-prompt-craft 试跑。完整记录在 Skill 目录的 evolution-practice-log.md

1)任务结束,先记一行问题

不要等「攒够十个再写」。下一单结束就追加:

复制代码
{"date":"2026-06-22","skill":"frontend-dev-prompt-craft","task_type":"API","symptom":"PRD 接口 path 与项目 request path 不一致,提示词易只写其一","expected":"output-contract 要求 PRD path 与项目 path 双轨记录","severity":"high","source":"session_retro","converted_to_eval":false,"eval_id":null,"status":"open"}

那次特殊单任务,session_retro 一口气记了 8 条。其中 path 双轨、枚举映射是 high。

2)Triage:先打哪只蚊子

复制代码
./plugins/frontend-team-toolkit/skill-engineering/bin/run-evolution-cycle.sh \
  --skill frontend-dev-prompt-craft \
  --phase triage

或直接:

复制代码
python3 plugins/frontend-team-toolkit/skill-engineering/scripts/triage_issues.py \
  --skills-base plugins/frontend-team-toolkit/skills \
  --status open

试跑结果:15 条 open;L10/L11(path 双轨、术语→枚举)优先级最高。每周只啃 top 1 的 high,比一次改五处靠谱。

3)把问题变成 Eval

有两种做法:

•半自动:convert_issue_to_eval.py --dry-run 预览,确认后 --apply

•手工:像我们当时那样,eval-007(craft+loop 串联)已经在 v0.1.1 建好,本轮直接拿来当锚点

关键不是「谁写的 eval」,而是:改 Skill 之前,先有一条能复现失败的测试。

4)改之前先打基线

有 fixture 时,本地零 Token:

复制代码
python3 plugins/frontend-team-toolkit/skill-engineering/scripts/grade_evals.py \
  --skill frontend-dev-prompt-craft \
  --skills-base plugins/frontend-team-toolkit/skills \
  --mode all \
  --append-results

没有 fixture、必须看真实 Agent 行为时,再用 run_evals.py。日常迭代优先 fixture。

5)写假设,一次只改一个维度

先写 evolution-hypothesis.json,再动手。我们那轮是这样的:

复制代码
{
"skill":"frontend-dev-prompt-craft",
"target_eval":"frontend-dev-prompt-craft-007",
"problem":"PRD 接口 path 与项目 request path 未双轨记录",
"proposed_change":"validate-output.sh --chain 增加 PRD path / 项目 path / userType 检查",
"dimension":"output-contract",
"rollback_condition":"eval-001~006 regression fail",
"status":"verified"
}

脚手架约定的可改维度(每次只选一个):

|-------------------|----------------------------------|
| 维度 | 改什么 |
| trigger | description / When to Activate |
| workflow | Workflow 步骤 |
| output-contract | references/output-contract.md |
| template | references/prompt-templates.md |
| anti-pattern | Anti-patterns 表 |

那一轮实际改的是 validate-output.sh --chain,让 eval-007 能卡住「双 path + userType」。 假设写清楚,回滚才有依据------不是「感觉不对再 git 找」,而是「旧 regression 挂了就 REVERT」。

6)考试:过了才 KEEP

复制代码
python3 plugins/frontend-team-toolkit/skill-engineering/scripts/grade_evals.py \
  --skill frontend-dev-prompt-craft \
  --skills-base plugins/frontend-team-toolkit/skills \
  --eval-id frontend-dev-prompt-craft-007 \
  --append-results --version 0.1.2

随后用棘轮门禁看 high risk:

复制代码
python3 plugins/frontend-team-toolkit/skill-engineering/scripts/check_regression.py \
  --results plugins/frontend-team-toolkit/skills/frontend-dev-prompt-craft/results.tsv \
  --risk high --block true

试跑裁决:

|--------|--------------------------|-------------------------------|
| 轮次 | 做了什么 | 结果 |
| v0.1.2 | 补 --chain 校验,修 path 双轨 | eval-007 PASS → KEEP |
| v0.1.3 | 给 001~006 全补 fixture | 7/7 PASS ,maturity → beta |

挂了怎么办?回滚本轮改动,把失败原因写回 hypothesis / practice log,下一轮换假设。棘轮的意义不是让你永远成功,而是让失败变得便宜、可复盘。

7)发版,并把 issue 关掉

KEEP 之后才做这些:

1.更新 CHANGELOG.md.skill-meta.json

2.相关 issue 标 fixed(可用 mark_issue_resolved.py

3.需要的话写两句 LEARNINGS.md

4.看趋势:

复制代码
python3 plugins/frontend-team-toolkit/skill-engineering/scripts/evolution_report.py \
  --results plugins/frontend-team-toolkit/skills/frontend-dev-prompt-craft/results.tsv

哪些能自动试,哪些必须人点头

这条流水线再熟,也有边界。

适合小步试的:

•触发词措辞

•Workflow 步骤顺序 / 检查点表述

•output-contract 里可被脚本校验的字段

•模板补充、反面例子

不要交给「自动改完就合」的:

•Safety / 权限边界

•对外承诺、合规条款

evals/evals.json 本身(测试基线被人偷偷改,棘轮就废了)

•大范围重构(一次改五十行以上,先拆轮次)

一句话:流水线负责提方案和考试;人负责划红线。

Darwin 是什么?要不要装?

读到这里,你可能才想起来标题里曾经出现过的 Darwin。

Darwin(darwin-skill)是可选外挂,不是本篇主角。

用人话讲:

Darwin 像一个会改 SKILL.md 的实习生:它按评分标准提修改、跑几轮试、分数涨了就留、跌了就回滚。 你们仓库里的 grade_evals.py / check_regression.py,才是带教老师和期末考试。

脚手架 README 也把它放在「与外部工具配合(可选)」里,和 skill-creator、skill-audit 并列。核心观点:L5 = 外挂 darwin-skill,仍须过 L4 棘轮。实践复盘里,Darwin 封装还标在 P2------意思是:

七步流水线已经能跑;Darwin 是加速「提假设」的插件,不是地基。

什么时候值得接 Darwin?

•你已经有完整 fixture + 回归门禁

•你厌倦了自己想「下一句 description 怎么改」

•你接受:Darwin 的产出,照样要过 check_regression.py

什么时候先别装?

•还没有 eval / fixture

•连 skill-issues.jsonl 都懒得写

•指望「装上就全自动变好」

没有 Darwin,按本文七步手改,一样是正经的自进化。有 Darwin,也只是多了一个提案来源------考试规则不变。

我们试跑时踩过的坑(诚实版)

这些不是教学故事,是脚手架 evolution-practice-retro.md 里记过的:

|------------------------------------------|----------------------------------|
| 坑 | 后来怎么处理 |
| 无 fixture 的 eval 没法进确定性 CI | 补齐 001~007 fixture,再谈全量回归 |
| grade_evals.py 子进程路径不对 | cwd 指到 Skill 目录 |
| convert_issue_to_eval.py 的 dry-run 逻辑绕 | 改成只有 --apply 才写入 |
| 想一次修很多 issue | 强制单假设;其余进 evolution-backlog.md |

所以如果你照着本文做,卡在「命令跑不通」------优先查脚手架脚本和 Skill 目录结构,而不是怀疑方法论本身。

方法论已经在一个真实 Skill 上跑通过;脚本细节会继续迭代。

读完你可以立刻做的三件事

1.给正在用的那个 Skill,建或打开 skill-issues.jsonl,把最近一次翻车写成一行

2.跑一次 triage_issues.py,只选 top 1 high

3.写一份 evolution-hypothesis.json,改一个维度,跑 grade_evals.py------过了再谈发版

不要一上来研究 Darwin。先让「改完能考试」变成肌肉记忆。

总结

本篇只记住三件事:

1.自进化的主角是脚手架流水线,不是 Darwin 这个skill。

是一套自动流水线:issue → triage → eval → 单假设 → grade_evals → KEEP/REVERT,这条链在 frontend-dev-prompt-craft 上已经跑通过。

2.没有 fixture,就没有便宜的确定性回归;没有回归,就谈不上放心自动改。

3.Darwin 是可选外挂:它帮你提改法,考试规则仍是你们自己的棘轮。

相关推荐
workflower2 小时前
装备企业的 AI 路线图
人工智能·深度学习·机器学习·设计模式·机器人
AKAMAI2 小时前
Linode接口及默认防火墙现已全面开放使用
人工智能·云计算
前端开发江鸟3 小时前
RAG 回答错了,问题到底出在召回、重排,还是生成?
人工智能
美狐美颜SDK开放平台3 小时前
直播app开发如何实现主播级美颜效果?美颜sdk开发方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美颜api
东方小月3 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端
大龄码农有梦想3 小时前
使用大模型服务如何保证数据安全?企业 AI 安全、私有化部署与治理实践
人工智能·私有化部署·数据安全·信创·ai agent·智能体·智能体开发平台
冬奇Lab3 小时前
每日一个开源项目(第170篇):CodeWiki - ACL 2026 论文级代码库自动文档生成,递归多 Agent 架构
人工智能·开源·资讯
ofoxcoding3 小时前
2026年视频生成API选型指南:根据应用场景匹配最佳方案
ai·音视频
lxw18449125143 小时前
Claude-Code企业级培训教程
人工智能
冬奇Lab3 小时前
代码库知识库系列(01):技术全景——为什么代码理解比文档检索难十倍
人工智能