1. 为什么你的 SKILL.md 越改越乱
先说一个我观察到的现象:很多人第一次写 SKILL.md 的时候,结构清晰、步骤明确,用起来效果不错。但用了一段时间,随着需求变化不断往里加东西,文件越来越长,逻辑越来越绕,最后连自己都不敢改——因为改完不知道是变好了还是变差了。
这个问题的本质是:SKILL.md 缺少版本化的进化轨迹。你每次修改都是"覆盖式"的,改之前的版本没了,改之后的效果也没人帮你验证。改对了是运气,改错了只能靠回忆往回找。
达尔文 Skill 想解决的就是这件事。它的核心思路很朴素:把 SKILL.md 当成一份可以被 git 管理的代码资产,每一次优化都是一次 commit,分数涨了就保留,分数跌了就 revert。这样你的 Skill 就有一条清晰的进化轨迹,而不是一团越滚越大的雪球。
具体来说,达尔文 Skill 在 Codex 环境下的工作方式是:
- 读取目标 SKILL.md,做 9 个维度的基线评分
- 找出加权短板最大的那个维度,生成一个具体改进方案
- 编辑 SKILL.md,提交 git commit
- 启动两个独立子 agent 重新评分(避免自己改自己评)
- 新分高于旧分则保留,否则 git revert 回滚
- 关键阶段暂停,等你确认
这套机制里,git 不是配角,而是整个进化系统的骨架。没有 git,回滚就是一句空话;没有 commit 历史,你就看不到 Skill 是怎么一步步变成现在这样的。
所以这篇文章不讲空泛的"Skill 优化理念",而是聚焦一件事:怎么在 Codex 里用 git 把 SKILL.md 的进化过程管起来。我会给出可复制的 SKILL.md 模板、git 分支与提交规范、Codex 中加载验证的具体步骤,以及怎么通过 TaoToken 统一 Key/API 通道接入模型完成 Skill 自评与改写。
适合谁看:已经在用 Codex 写 Skill、手里有 5 个以上 SKILL.md、开始觉得手动维护吃力的开发者。如果你还没写过 SKILL.md,建议先写一个能跑通的版本再来看这篇。
2. TaoToken 前置:统一 Key 与 API 通道
在讲 git 操作之前,得先把模型接入这件事说清楚。达尔文 Skill 的评分和改写都需要调用模型,如果你每个子 agent 都配一套 Key,管理起来会很乱。我的做法是用 TaoToken 统一 Key/API 通道,所有模型调用走同一个入口。
TaoToken 是一个模型 API 聚合服务,官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。它的作用是让你用一个 Key 就能调用多个模型,不用在 Codex 配置里来回切换。
2.1 为什么达尔文 Skill 需要统一通道
达尔文 Skill 的评分环节会启动两个独立子 agent,改写环节还会再调一次模型。如果每个环节用不同的 Key 和 Base URL,配置会散落在多个文件里,排查问题的时候很痛苦。
统一通道的好处有三个:
第一,评分和改写用同一个模型入口,分数才有可比性。如果基线评估用 A 模型,优化后评估用 B 模型,分数变化就说不清是 Skill 改好了还是模型换强了。
第二,Key 只存一份,泄露风险可控。你不需要在 SKILL.md、Codex 配置、环境变量里各放一份 Key。
第三,切换模型只改一个地方。今天想用这个模型评分,明天想换那个模型改写,改一处配置就行。
2.2 在 Codex 里配置 TaoToken 通道
Codex 的模型配置通常放在~/.codex/config.toml或者项目级的.codex/config.toml里。你需要把 Base URL 指向 TaoToken 的 API 地址,Key 用你在 TaoToken 控制台生成的 Key。
先拿到 Key。访问 https://taotoken.net/api-keys 生成一个 API Key,复制下来。
然后在 Codex 配置里写入:
# ~/.codex/config.toml model_provider = "taotoken" model = "claude-sonnet-4-20250514" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"这里有几个点要注意:
base_url填https://taotoken.net/api,不要加多余的路径。env_key指定从环境变量读取 Key,这样 Key 不会明文写在配置文件里。wire_api用chat兼容模式,大部分模型都能走通。
然后在 shell 里设置环境变量:
export TAOTOKEN_API_KEY="sk-你的Key"如果你用的是 zsh,把这行加到~/.zshrc;bash 就加到~/.bashrc。设置完执行source ~/.zshrc让它生效。
2.3 验证通道是否通
配置完先别急着跑达尔文 Skill,用一条最简单的请求验证通道:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复 OK 两个字母"}], "max_tokens": 10 }'如果返回的 JSON 里有choices字段,说明通道通了。如果返回 401,检查 Key 是否正确;如果返回连接错误,检查 Base URL 有没有写错。
这一步看起来简单,但它是后面所有操作的基础。通道不通,达尔文 Skill 的评分和改写都跑不起来。
2.4 模型 ID 怎么选
达尔文 Skill 的评分需要模型有一定的推理能力,改写需要模型能理解 SKILL.md 的结构。我的建议是评分和改写用同一个模型,避免引入变量。
在 TaoToken 的模型列表里选一个你熟悉的模型 ID,填到 Codex 配置的model字段。如果你不确定选哪个,可以先用默认的,跑通流程后再换。
需要说明的是,模型 ID 要和你实际能调用的模型一致。填错了会报模型不存在的错误。你可以在 https://taotoken.net/models 查看可用模型列表。
3. 可复制配置:SKILL.md 模板与 git 规范
这一节是全文的核心。我会给出一个可以直接复制的 SKILL.md 模板,然后讲 git 分支和提交规范怎么定。
3.1 SKILL.md 模板
达尔文 Skill 评估的 9 个维度里,有几个是结构性的,比如"失败模式编码""可执行具体性""高风险行动黑名单"。这些维度在写 SKILL.md 的时候就可以提前满足,不用等达尔文来帮你补。
下面这个模板是我根据达尔文的评分维度整理的,你可以直接拿去用:
--- name: your-skill-name version: 0.1.0 description: 一句话说明这个 Skill 做什么 --- # Your Skill Name ## 适用场景 - 场景一:具体描述 - 场景二:具体描述 ## 输入要求 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | input | string | 是 | 输入内容 | | mode | string | 否 | 模式,默认 standard | ## 执行步骤 ### 步骤 1:读取输入 读取用户提供的 input,检查是否为空。为空则返回错误码 E001。 ### 步骤 2:处理 按 mode 分支处理: - standard:走标准流程 - fast:跳过校验直接处理 ### 步骤 3:输出 返回结构化结果,包含 status、data、message 三个字段。 ## 失败模式与兜底 | 失败场景 | 触发条件 | 处理方式 | |----------|----------|----------| | 输入为空 | input 为空字符串 | 返回 E001,提示用户补充 | | 格式错误 | input 不符合预期格式 | 返回 E002,附上格式示例 | | 超时 | 处理超过 30 秒 | 返回 E003,建议拆分输入 | ## 高风险行动黑名单 以下操作禁止执行: - rm -rf 任何路径 - git reset --hard - git push --force - 删除任何非本 Skill 生成的文件 ## CHECKPOINT 在执行步骤 2 之前,如果 mode 为 standard,暂停并展示处理计划,等待用户确认。 ## 输出格式 ```json { "status": "success", "data": {}, "message": "" }这个模板里有几个关键点: **失败模式表格**是达尔文重点评估的维度。不要写"注意处理异常"这种模糊的话,要列出具体的失败场景、触发条件和处理方式。 **高风险行动黑名单**必须明文列出。达尔文会检查你有没有把 `rm`、`git reset --hard`、`force push` 这些操作列进去。 **CHECKPOINT**是人在回路的体现。在关键步骤前暂停,等用户确认再继续。 **可执行具体性**要求你禁用"建议""可以考虑""根据情况""灵活把握"这类模糊措辞。每一步都要说清楚做什么、怎么做、做完输出什么。 ### 3.2 git 分支规范 达尔文 Skill 的棘轮机制依赖 git 的 commit 和 revert。如果分支管理混乱,回滚就会出问题。 我的建议是用三个分支: ```bash # 主分支,存放当前最优版本 main # 优化分支,达尔文每次优化在这里提交 skill/your-skill-name # 实验分支,跑测试提示词用 test/your-skill-name日常操作流程是:
# 从 main 切出优化分支 git checkout -b skill/your-skill-name # 达尔文每次优化提交一个 commit git add SKILL.md git commit -m "opt(failure-mode): 补充超时兜底分支" # 如果分数涨了,合并回 main git checkout main git merge skill/your-skill-name # 如果分数跌了,revert 掉 git revert HEAD注意:达尔文内部用的是git revert而不是git reset --hard。因为reset --hard会丢掉历史,而revert会保留一条"回滚"的 commit,这样进化轨迹是完整的。
3.3 提交信息规范
提交信息要能看出这次优化改了哪个维度。我用的格式是:
opt(维度名): 具体改动描述维度名用达尔文 9 个维度的英文简写,比如:
git commit -m "opt(failure-mode): 补充输入为空的兜底分支" git commit -m "opt(specificity): 把'建议检查'改为'检查 input 长度是否大于 0'" git commit -m "opt(blacklist): 补充 git push --force 到黑名单" git commit -m "opt(checkpoint): 在步骤 2 前增加确认暂停"这样你git log --oneline一看,就知道每个 commit 优化了哪个维度,分数变化对应的是哪次改动。
3.4 测试提示词文件
达尔文会读test-prompts.json来跑效果验证。这个文件放在 SKILL.md 同级目录:
{ "skill": "your-skill-name", "prompts": [ { "id": "p1", "input": "正常输入示例", "expected": "应该返回 success" }, { "id": "p2", "input": "", "expected": "应该返回 E001" }, { "id": "p3", "input": "格式错误的输入", "expected": "应该返回 E002" } ] }测试提示词要覆盖正常路径和失败路径。达尔文跑回归测试的时候会用这个文件,如果失败路径没覆盖,评分会偏低。
3.5 目录结构
把上面这些文件放在一起,目录结构是这样的:
your-skill/ ├── SKILL.md ├── test-prompts.json └── .git/如果你有多个 Skill,建议每个 Skill 一个独立目录,各自管理 git 历史。不要把所有 SKILL.md 塞在一个仓库里,那样 commit 历史会混在一起,回滚的时候容易误伤。
4. 验证请求:在 Codex 里加载并跑通进化流程
配置和模板都准备好了,这一节讲怎么在 Codex 里实际跑一遍。
4.1 安装达尔文 Skill
如果你的 Codex 环境已经就绪,直接在对话框里执行:
npx skills add alchaincyf/darwin-skill执行前会询问确认,确认后安装完成。安装完之后,达尔文 Skill 就注册到 Codex 的 Skill 列表里了。
4.2 准备目标 Skill
假设你要优化的是your-skill-name,先确保它在 git 仓库里,并且有一个干净的初始 commit:
cd your-skill git init git add SKILL.md test-prompts.json git commit -m "init: 初始版本"这一步很重要。达尔文的棘轮机制需要一个基线 commit 来做对比,如果没有初始 commit,第一次优化就没法判断是涨了还是跌了。
4.3 触发达尔文优化
在 Codex 对话框里告诉它你要优化哪个 Skill:
优化 your-skill-name 这个 skill达尔文会先做 Phase 1 基线评估。它会读取 SKILL.md,按 9 个维度打分,给出诊断报告。报告里会列出每个维度的得分和加权短板。
你需要审核这份报告,决定优先优化哪个维度。达尔文默认会选加权短板最大的那个,但你可以手动指定。
4.4 Phase 2 单维度优化
选定维度后,达尔文会生成一个具体改进方案,编辑 SKILL.md,然后提交 git commit。
这一步的关键是:达尔文只改一个维度。它不会一次改多个维度,因为那样就无法归因——分数涨了不知道是哪个改动起的作用。
改完之后,达尔文会启动两个独立子 agent 重新评分。这两个子 agent 用的是同一个 TaoToken 通道,但 prompt 是独立的,避免"自己改自己评"的偏差。
新分高于旧分则保留 commit,否则git revert回滚。单轮涨幅低于 1 分自动早停。
4.5 CHECKPOINT 确认
Phase 2 结束后会强制暂停,展示 diff 和分数变化,等你确认。
这一步是人在回路的体现。你可以看到:
- 改了哪几行
- 旧分多少,新分多少
- 哪个维度涨了,涨了多少
确认没问题就继续,有问题就回滚。
4.6 验证进化轨迹
跑完几轮之后,用 git log 看进化轨迹:
git log --oneline输出大概是这样:
a1b2c3d opt(failure-mode): 补充超时兜底分支 e4f5g6h opt(specificity): 把模糊措辞改为具体检查 i7j8k9l opt(blacklist): 补充 force push 到黑名单 m0n1o2p init: 初始版本每个 commit 对应一次优化,维度名在括号里。你可以git show a1b2c3d看具体改了什么。
4.7 用 TaoToken 做 Skill 自评
如果你想手动做一次自评,不走达尔文的自动流程,可以用 TaoToken 的模型对话接口直接问模型。
访问 https://taotoken.net/chat 打开模型对话页面,把 SKILL.md 内容贴进去,然后问:
请按以下 9 个维度给这个 SKILL.md 打分,每个维度满分 100,给出加权总分和短板分析: 1. 失败模式编码 2. 可执行具体性 3. 高风险行动黑名单 4. 结构清晰度 5. 输入输出定义 6. CHECKPOINT 设置 7. 测试覆盖 8. 边界处理 9. 可维护性模型会给出评分和诊断。这个结果可以和达尔文的评分对照,看看是否一致。
4.8 回归测试
当多轮优化累积后,达尔文会进入 Phase 3 回归测试。多评委独立审查,涨幅低于阈值强制停手。
回归测试的目的是防止"局部优化导致全局退化"。比如你为了提升"失败模式编码"维度,加了很多兜底分支,结果"结构清晰度"维度跌了。回归测试会检测到这种退化,强制停手让你检查。
5. 本篇常见错排查
这一节列几个实际跑的时候容易遇到的报错,以及怎么排查。
5.1 401 Unauthorized
报错长这样:
Error: 401 Unauthorized {"error": {"message": "Invalid API key", "type": "invalid_request_error"}}原因:TaoToken 的 Key 没设置对,或者环境变量没生效。
排查步骤:
# 检查环境变量是否设置 echo $TAOTOKEN_API_KEY # 如果为空,重新设置 export TAOTOKEN_API_KEY="sk-你的Key" # 检查 Codex 配置里的 env_key 是否和变量名一致 grep env_key ~/.codex/config.toml如果环境变量有值但还是 401,检查 Key 是否过期或被禁用。去 https://taotoken.net/api-keys 重新生成一个。
5.2 local proxy failed
报错长这样:
Error: local proxy failed: connection refused原因:Codex 配置里的 Base URL 写错了,或者网络不通。
排查步骤:
# 直接 curl 测试通道 curl -I https://taotoken.net/api # 检查配置里的 base_url grep base_url ~/.codex/config.tomlbase_url应该是https://taotoken.net/api,不要加/v1或其他路径。如果 curl 不通,检查网络连接。
5.3 reading choices 报错
报错长这样:
Error: reading choices: unexpected end of JSON input原因:模型返回的响应格式不对,通常是wire_api配置错了。
排查步骤:
# 检查 wire_api 配置 grep wire_api ~/.codex/config.tomlwire_api应该是chat。如果写成了responses或其他值,改成chat再试。
5.4 OAuth 相关报错
报错长这样:
Error: OAuth token expired原因:如果你用的是 OAuth 方式认证,token 过期了。
排查步骤:OAuth 认证和 API Key 认证是两条路。如果你用 TaoToken 的 API Key,就不应该走 OAuth 流程。检查 Codex 配置里有没有残留的 OAuth 设置,有的话删掉。
5.5 git revert 冲突
报错长这样:
error: could not revert a1b2c3d... opt(failure-mode): 补充超时兜底分支 hint: after resolving the conflicts, mark the corrected paths原因:回滚的时候 SKILL.md 已经被后续 commit 改过了,产生冲突。
排查步骤:
# 查看冲突文件 git status # 手动解决冲突后 git add SKILL.md git revert --continue预防办法:每次优化前确保工作区干净,git status没有未提交的改动。
5.6 模型 ID 不存在
报错长这样:
Error: model not found: claude-sonnet-4-20250514原因:配置里的模型 ID 和 TaoToken 实际支持的模型不一致。
排查步骤:去 https://taotoken.net/models 查看可用模型列表,把配置里的model字段改成列表里的 ID。
5.7 三件套检查清单
如果你用的是 CC Switch、Cline MCP 或 Codex auth.json,出现连接问题时按这个清单检查三件套:
| 项目 | 检查点 | 正确示例 |
|---|---|---|
| Base URL | 是否指向 TaoToken API | https://taotoken.net/api |
| Key | 是否有效且未过期 | sk-开头,控制台可查 |
| Model ID | 是否在可用列表里 | 与 https://taotoken.net/models 一致 |
三件套任何一个不对,都会导致连接失败。排查的时候按顺序检查,先确认 Base URL,再确认 Key,最后确认 Model ID。
6. 把进化轨迹用起来
跑通流程之后,你会发现 git log 本身就是一份有价值的文档。每次优化对应一个 commit,维度名在括号里,改动描述在后面。回头看的时候,你能清楚看到 Skill 是怎么一步步变好的。
几个实用技巧:
用 git tag 标记里程碑。当分数突破某个阈值时,打个 tag:
git tag -a v0.2.0 -m "总分突破 80"这样你可以随时git checkout v0.2.0回到那个版本。
用 git diff 对比版本。想知道两个版本之间改了什么:
git diff v0.1.0 v0.2.0 -- SKILL.md用 git bisect 定位退化。如果发现某个版本效果变差了,用 bisect 找到是哪个 commit 引入的:
git bisect start git bisect bad HEAD git bisect good v0.1.0定期清理实验分支。test/分支跑完就删,不要留一堆没用的分支。
最后说一个我踩过的坑:不要在一次优化里改多个维度。达尔文的棘轮机制依赖单维度归因,如果你手动改的时候一次改了好几个地方,分数涨了也不知道是哪个改动起的作用。老老实实一个维度一个 commit,虽然慢一点,但进化轨迹是清晰的。
如果你还没配 TaoToken 通道,先去 https://taotoken.net/api-keys 拿 Key,然后按第 2 节的配置写进 Codex。通道通了,后面的流程才能跑起来。接入文档在 https://taotoken.net/doc ,遇到配置问题可以对照着检查。