达尔文Skill实战:用git让SKILL.md在Codex里自己进化
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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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_KEYsk-你的Key如果你用的是 zsh把这行加到~/.zshrcbash 就加到~/.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 仓库里并且有一个干净的初始 commitcd 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_KEYsk-你的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 APIhttps://taotoken.net/apiKey是否有效且未过期sk-开头控制台可查Model ID是否在可用列表里与 https://taotoken.net/models 一致三件套任何一个不对都会导致连接失败。排查的时候按顺序检查先确认 Base URL再确认 Key最后确认 Model ID。6. 把进化轨迹用起来跑通流程之后你会发现 git log 本身就是一份有价值的文档。每次优化对应一个 commit维度名在括号里改动描述在后面。回头看的时候你能清楚看到 Skill 是怎么一步步变好的。几个实用技巧用 git tag 标记里程碑。当分数突破某个阈值时打个 taggit 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 遇到配置问题可以对照着检查。