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•案例 Skillskills/frontend-dev-prompt-craft08 讲原则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打基线一次只修一个 bugevolution-hypothesis.json锁一个维度CI 红了不许合check_regression.pyhigh 挂就 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-001007 全补上 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。2Triage先打哪只蚊子./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 条 openL10/L11path 双轨、术语→枚举优先级最高。每周只啃 top 1 的 high比一次改五处靠谱。3把问题变成 Eval有两种做法•半自动convert_issue_to_eval.py --dry-run预览确认后--apply•手工像我们当时那样eval-007craftloop 串联已经在 v0.1.1 建好本轮直接拿来当锚点关键不是「谁写的 eval」而是改 Skill 之前先有一条能复现失败的测试。4改之前先打基线有 fixture 时本地零 Tokenpython3 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 }脚手架约定的可改维度每次只选一个维度改什么triggerdescription / When to ActivateworkflowWorkflow 步骤output-contractreferences/output-contract.mdtemplatereferences/prompt-templates.mdanti-patternAnti-patterns 表那一轮实际改的是validate-output.sh --chain让 eval-007 能卡住「双 path userType」。 假设写清楚回滚才有依据——不是「感觉不对再 git 找」而是「旧 regression 挂了就 REVERT」。6考试过了才 KEEPpython3 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 riskpython3 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 →KEEPv0.1.3给 001006 全补 fixture7/7 PASSmaturity → beta挂了怎么办回滚本轮改动把失败原因写回 hypothesis / practice log下一轮换假设。棘轮的意义不是让你永远成功而是让失败变得便宜、可复盘。7发版并把 issue 关掉KEEP 之后才做这些1.更新CHANGELOG.md、.skill-meta.json2.相关 issue 标fixed可用mark_issue_resolved.py3.需要的话写两句LEARNINGS.md4.看趋势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。Darwindarwin-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补齐 001007 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 high3.写一份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 是可选外挂它帮你提改法考试规则仍是你们自己的棘轮。