skill-creator
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSkill Creator
Skill Creator
You are creating a new yoyo skill on demand, in direct response to an explicit request — either from the human creator or from a community issue asking for a new capability.
你将按需创建新的yoyo skill,直接响应明确的请求——无论是来自人类创建者,还是来自社区中要求新增功能的议题。
skill-creator vs skill-evolve
skill-creator vs skill-evolve
These are complementary, not redundant. Use the right one:
| Question | skill-creator (this skill) | skill-evolve |
|---|---|---|
| Who triggers it? | Human creator OR community issue (explicit ask) | GitHub Actions cron (autonomous) |
| When does it run? | Inside a normal evolve session, on demand | Hourly cron at |
| What signals does it use? | The user's request | Past-session evidence (learnings, journal, audit-log) |
| Recurrence gate? | No (human is in the loop) | Yes (≥3 sessions for create) |
| Diff-scope guard? | None — runs in evolve session | Yes — |
| Auto-commit? | Yes (inside evolve session's commit flow) | Yes (after diff-scope + build/test gates) |
Rule of thumb: if no human asked, you're not creating a skill — you're noticing a pattern. Write it to with a and let skill-evolve pick it up on the next cycle.
memory/learnings.jsonlpattern_key二者互为补充,而非重复。请选择合适的工具:
| 问题 | skill-creator(本技能) | skill-evolve |
|---|---|---|
| 触发者是谁? | 人类创建者 或 社区议题(明确请求) | GitHub Actions 定时任务(自主触发) |
| 运行时机? | 在常规的evolve会话中按需运行 | 每小时30分触发定时任务,需满足5会话计数器 + 24小时冷却期的限制 |
| 使用哪些信号? | 用户的请求 | 过往会话的证据(学习记录、日志、审计日志) |
| 是否有重复触发限制? | 无(人类参与流程) | 有(创建需≥3次会话记录) |
| 是否有差异范围防护? | 无——在evolve会话中运行 | 有——由 |
| 是否自动提交? | 是(在evolve会话的提交流程中完成) | 是(通过差异范围检查 + 构建/测试验证后) |
经验法则:如果没有人类提出请求,你不需要创建skill——而是要记录下相关模式。将其写入并添加,让skill-evolve在下一轮循环中处理。
memory/learnings.jsonlpattern_keyWhen NOT to use this skill
何时不应使用本技能
- You're inside a cycle. Use the Create branch in
scripts/skill_evolve.shinstead — it has the right gates (recurrence, dedup, ≤25 cap).skills/skill-evolve/SKILL.md - You noticed a recurring pattern but no one asked. Write a learning with ; skill-evolve owns autonomous creation.
pattern_key - The user asked for a one-off helper that won't be invoked again. Just write it inline; don't litter .
skills/
- 你正处于循环中。请改用
scripts/skill_evolve.sh中的Create分支——它具备正确的限制条件(重复触发、去重、≤25个上限)。skills/skill-evolve/SKILL.md - 你发现了重复出现的模式,但无人提出请求。请添加记录学习内容;自主创建是skill-evolve的职责。
pattern_key - 用户请求的是一次性辅助工具,不会再次调用。直接在代码中编写即可;不要在目录下添加冗余文件。
skills/
When to use this skill
何时应使用本技能
- The human creator (Yuanhao) tells you "scaffold a new skill for X"
- A community issue says "please add a skill for X" and you decide during a normal evolve session that the request is concrete enough to act on
- You're installing a third-party skill from outside the repo (uses or
origin: marketplace)origin: gh:author/repo
- 人类创建者(Yuanhao)告诉你“为X搭建新的skill框架”
- 社区议题中提到“请为X添加一个skill”,且你在常规evolve会话中判定该请求足够具体,可以执行
- 你正在从仓库外部安装第三方skill(使用或
origin: marketplace标识)origin: gh:author/repo
Procedure
操作流程
1. Capture intent
1. 明确意图
Ask (or infer from issue) — and write down explicit answers before writing any code:
- What does this skill do? (one sentence)
- When should it trigger? (concrete cues that should make a future agent reach for it)
- What tools does it need? (subset of yoagent's: ,
bash,read_file,write_file,edit_file,list_files,search,rename_symbol,ask_user,todo)sub_agent - What does success look like? (how does the agent know the skill worked?)
询问(或从议题中推断)——并在编写任何代码前记录下明确的答案:
- 本skill的功能是什么?(一句话描述)
- 触发时机是什么?(未来agent应调用本skill的具体场景)
- 需要使用哪些工具?(yoagent工具的子集:,
bash,read_file,write_file,edit_file,list_files,search,rename_symbol,ask_user,todo)sub_agent - 成功的标准是什么?(agent如何判断本skill已生效?)
2. Determine origin:
origin:2. 确定origin:
字段
origin:| Asker | Use of skill | | |
|---|---|---|---|
| Human creator (Yuanhao) | Foundational capability, not delegated to autonomous evolution | | yes |
| Human creator | Useful but yoyo-evolvable later | | no |
| Yoyo (during issue response) | Domain capability for yoyo's own future use | | no |
| External source | Installed third-party skill | | no |
The default if you're unsure: for yoyo-decided creations, for human-driven creations. Never default to .
origin: yoyoorigin: creatormarketplaceHARD PRECONDITION on / (closes a backdoor — these origins are off-limits to skill-evolve, so they must come from a real upstream, not be self-granted):
origin: marketplaceorigin: gh:…- The skill content MUST be downloaded in this same session from a verifiable URL (curl/git/gh). Record the URL in the skill's body under a section.
## Source - OR: Yuanhao explicitly typed in this session that the skill is being installed from and you can quote that statement.
<source>
If neither holds, refuse and pick or instead. A skill yoyo wrote itself but tagged would be a permanent un-evolvable artifact — that's a hole in the safety design.
creatoryoyomarketplace| 请求者 | skill用途 | | 是否设置 |
|---|---|---|---|
| 人类创建者(Yuanhao) | 基础功能,不交由自主演化处理 | | 是 |
| 人类创建者 | 有用但后续可由yoyo自主演化 | | 否 |
| Yoyo(响应议题时) | Yoyo未来使用的领域功能 | | 否 |
| 外部来源 | 已安装的第三方skill | | 否 |
不确定时的默认值:Yoyo自主决定创建的skill用,人类驱动创建的skill用。切勿默认使用。
origin: yoyoorigin: creatormarketplaceorigin: marketplaceorigin: gh:…- skill内容必须在本次会话中从可验证的URL(curl/git/gh)下载。在skill的正文部分记录该URL。
## Source - 或者:Yuanhao在本次会话中明确输入该skill来自,你可以引用该语句。
<source>
如果以上条件均不满足,请拒绝并选择或。Yoyo自行编写但标记为的skill会成为永久无法演化的产物——这会破坏安全设计。
creatoryoyomarketplace3. Pick a kebab-case name
3. 选择短横线分隔式(kebab-case)名称
Format: (e.g., , , ). Single-word names are okay only for genuinely-broad scopes (, ).
<verb>-<object>bisect-flaky-testcompose-changelogtriage-prresearchreleaseCheck for collision before going further:
bash
ls skills/ | grep -i "<your-name-stem>"If a similar name exists, stop and ask whether to refine the existing one instead — the answer is usually yes.
格式:(例如:, , )。只有当功能范围确实非常宽泛时,才允许使用单字名称(如, )。
<动词>-<对象>bisect-flaky-testcompose-changelogtriage-prresearchrelease继续下一步前检查是否重名:
bash
ls skills/ | grep -i "<your-name-stem>"如果存在相似名称,请停止并询问是否应优化现有skill——通常答案是肯定的。
4. Write the description (≤200 chars)
4. 编写描述(≤200字符)
This is the most important field. yoagent injects it into the system prompt; the LLM uses it to decide when to load this skill.
Use "intentionally pushy" trigger language — say what conditions trigger loading, not what the skill is.
| WEAK (descriptive) | STRONG (pushy) |
|---|---|
| "A skill for working with flaky tests" | "Investigate flaky tests by isolating, repeatedly running, and bisecting recent commits" |
| "Helps with releases" | "Validate readiness and publish to crates.io: gate checks (build/test/clippy/fmt) before any |
Hard cap: 200 chars. The Hermes ecosystem documented description-truncation failures (#13944) at higher lengths.
这是最重要的字段。yoagent会将其注入系统提示词;LLM会根据它决定何时加载本skill。
使用**“主动式触发语言”**——描述触发加载的条件,而非skill的功能。
| 不佳描述(说明性) | 优秀描述(触发式) |
|---|---|
| "A skill for working with flaky tests" | "通过隔离、重复运行和二分法排查最近提交的代码,调查不稳定测试问题" |
| "Helps with releases" | "在执行任何 |
硬性上限:200字符。Hermes生态系统记录了超过此长度时的描述截断故障(#13944)。
5. Pick keywords (only if origin: yoyo
)
origin: yoyo5. 选择关键词(仅适用于origin: yoyo
的skill)
origin: yoyoFor skills, list 3–5 distinctive substrings that would appear in a session's IF this skill were used. skill-evolve uses these to compute / / .
origin: yoyoaudit.jsonllast_useduseswinsExamples:
- skill:
release["cargo publish", "crates.io", "git tag v"] - skill:
social["gh api graphql", "discussion", "addDiscussionComment"]
Skip the field for skills (skill-evolve can't refine them anyway).
keywords:origin: creator对于的skill,列出3-5个独特子字符串,这些字符串会出现在使用本skill的会话中。skill-evolve会用这些字符串计算//指标。
origin: yoyoaudit.jsonllast_useduseswins示例:
- skill:
release["cargo publish", "crates.io", "git tag v"] - skill:
social["gh api graphql", "discussion", "addDiscussionComment"]
origin: creatorkeywords:6. Generate the SKILL.md scaffold
6. 生成SKILL.md框架
Choose the template that matches .
origin:For :
origin: creatoryaml
---
name: <name>
description: <pushy description ≤200 chars>
tools: [<subset of yoagent tools>]
core: true
origin: creator
---选择与匹配的模板。
origin:适用于:
origin: creatoryaml
---
name: <name>
description: <主动式描述 ≤200 chars>
tools: [<subset of yoagent tools>]
core: true
origin: creator
---<Title>
<Title>
When to use
何时使用
<concrete trigger conditions — when should the agent reach for this?>
<具体触发条件——agent应何时调用本skill?>
Quick reference
快速参考
<one-screen cheat sheet — verbs, file paths, common commands>
<单屏速查表——动词、文件路径、常用命令>
Procedure
操作流程
<numbered steps the agent should follow>
<agent应遵循的编号步骤>
Pitfalls
注意事项
<known failure modes — what to watch out for>
<已知故障模式——需要关注的问题>
Verification
验证方式
<how the agent confirms success>
```
For :
origin: yoyoyaml
---
name: <name>
description: "[CANDIDATE — unreviewed] <pushy description ≤200 chars>"
tools: [<subset of yoagent tools>]
origin: yoyo
status: candidate
score: 0.5
uses: 0
wins: 0
last_used: null
last_evolved: <today, YYYY-MM-DD>
parent_pattern_key: <kebab-case verb.object — describes the recurring pattern this skill addresses>
keywords: ["<distinctive 1>", "<distinctive 2>", "<distinctive 3>"]
---<agent如何确认操作成功>
**适用于`origin: yoyo`:**
```yaml
---
name: <name>
description: "[CANDIDATE — unreviewed] <pushy description ≤200 chars>"
tools: [<subset of yoagent tools>]
origin: yoyo
status: candidate
score: 0.5
uses: 0
wins: 0
last_used: null
last_evolved: <today, YYYY-MM-DD>
parent_pattern_key: <kebab-case verb.object — describes the recurring pattern this skill addresses>
keywords: ["<distinctive 1>", "<distinctive 2>", "<distinctive 3>"]
---<Title>
<Title>
(same body sections as above)
The `[CANDIDATE — unreviewed]` description prefix is critical for `origin: yoyo` skills — it tells future sessions to treat the skill as experimental until it proves itself (≥2 successful invocations → `status: active`).(same body sections as above)
`origin: yoyo`的skill必须添加`[CANDIDATE — unreviewed]`描述前缀——这会告知未来的会话将该skill视为实验性内容,直到它通过验证(≥2次成功调用 → `status: active`)。7. Validate before commit
7. 提交前验证
Run all of these. If any fails, fix before committing — do not push a malformed skill.
First, set the skill name as a shell variable so the rest of the block is copy-paste-safe (avoids the trap of literal strings reaching the shell):
<name>bash
export SKILL_NAME="<your-kebab-case-name>" # e.g., bisect-flaky-test
test -d "skills/$SKILL_NAME" || { echo "ERROR: skills/$SKILL_NAME doesn't exist"; exit 1; }bash
undefined运行以下所有验证步骤。如果任何步骤失败,请修复后再提交——不要推送格式错误的skill。
首先,将skill名称设置为shell变量,以便后续代码块可以直接复制使用(避免将字面量字符串传入shell):
<name>bash
export SKILL_NAME="<your-kebab-case-name>" # e.g., bisect-flaky-test
test -d "skills/$SKILL_NAME" || { echo "ERROR: skills/$SKILL_NAME doesn't exist"; exit 1; }bash
undefinedYAML frontmatter parses, ≤1900 chars (defends against Hermes #7390 truncation)
YAML frontmatter parses, ≤1900 chars (defends against Hermes #7390 truncation)
python3 - "$SKILL_NAME" <<'PYEOF'
import re, sys
name = sys.argv[1]
content = open(f"skills/{name}/SKILL.md").read()
m = re.match(r"---\n(.*?)\n---\n", content, re.DOTALL)
if not m:
sys.exit("ERROR: no frontmatter")
fm = m.group(1)
if len(fm) > 1900:
sys.exit(f"ERROR: frontmatter too long: {len(fm)} chars (cap 1900)")
python3 - "$SKILL_NAME" <<'PYEOF'
import re, sys
name = sys.argv[1]
content = open(f"skills/{name}/SKILL.md").read()
m = re.match(r"---\n(.*?)\n---\n", content, re.DOTALL)
if not m:
sys.exit("ERROR: no frontmatter")
fm = m.group(1)
if len(fm) > 1900:
sys.exit(f"ERROR: frontmatter too long: {len(fm)} chars (cap 1900)")
Crude key:value sanity
Crude key:value sanity
for line in fm.splitlines():
if line.strip() and ":" not in line:
sys.exit(f"ERROR: invalid frontmatter line: {line!r}")
print("frontmatter OK")
PYEOF
for line in fm.splitlines():
if line.strip() and ":" not in line:
sys.exit(f"ERROR: invalid frontmatter line: {line!r}")
print("frontmatter OK")
PYEOF
Description ≤200 chars
Description ≤200 chars
desc=$(grep '^description:' "skills/$SKILL_NAME/SKILL.md" | head -1 | sed 's/^description: *//')
[ "${#desc}" -le 200 ] || { echo "ERROR: description ${#desc} chars > 200"; exit 1; }
desc=$(grep '^description:' "skills/$SKILL_NAME/SKILL.md" | head -1 | sed 's/^description: *//')
[ "${#desc}" -le 200 ] || { echo "ERROR: description ${#desc} chars > 200"; exit 1; }
Body ≤5000 words (matches skill-evolve's cap)
Body ≤5000 words (matches skill-evolve's cap)
body_words=$(awk '/^---$/{n++; next} n>=2' "skills/$SKILL_NAME/SKILL.md" | wc -w)
[ "$body_words" -le 5000 ] || { echo "ERROR: body $body_words words > 5000"; exit 1; }
body_words=$(awk '/^---$/{n++; next} n>=2' "skills/$SKILL_NAME/SKILL.md" | wc -w)
[ "$body_words" -le 5000 ] || { echo "ERROR: body $body_words words > 5000"; exit 1; }
Directory name matches frontmatter name
Directory name matches frontmatter name
fm_name=$(grep '^name:' "skills/$SKILL_NAME/SKILL.md" | head -1 | sed 's/^name: *//' | tr -d '"' )
[ "$fm_name" = "$SKILL_NAME" ] || { echo "ERROR: dirname/name mismatch: dir=$SKILL_NAME fm=$fm_name"; exit 1; }
undefinedfm_name=$(grep '^name:' "skills/$SKILL_NAME/SKILL.md" | head -1 | sed 's/^name: *//' | tr -d '"' )
[ "$fm_name" = "$SKILL_NAME" ] || { echo "ERROR: dirname/name mismatch: dir=$SKILL_NAME fm=$fm_name"; exit 1; }
undefined8. Smoke-test the skill loads via yoagent
8. 冒烟测试:验证skill可通过yoagent加载
bash
cargo test --quiet --test integration skills_directory_loads_via_yoagent_skillsetThis regression test loads every via . If your new skill breaks parsing, the test fails immediately. If it fails, do not commit — fix the frontmatter first.
skills/*/SKILL.mdyoagent::skills::SkillSet::loadbash
cargo test --quiet --test integration skills_directory_loads_via_yoagent_skillset该回归测试会通过加载所有文件。如果你的新skill解析失败,测试会立即报错。如果测试失败,请不要提交——先修复前置元数据。
yoagent::skills::SkillSet::loadskills/*/SKILL.md9. Commit
9. 提交代码
bash
undefinedbash
undefinedReuse $SKILL_NAME from step 7
Reuse $SKILL_NAME from step 7
git add "skills/$SKILL_NAME/"
git commit -m "skill-creator: add $SKILL_NAME (origin: <creator|yoyo|marketplace>)"
The commit goes into the current evolve session's commit history. No separate push — the evolve session's normal end-of-session push will carry it.git add "skills/$SKILL_NAME/"
git commit -m "skill-creator: add $SKILL_NAME (origin: <creator|yoyo|marketplace>)"
提交会进入当前evolve会话的提交历史。无需单独推送——evolve会话结束时的常规推送会包含本次提交。10. Note in the journal
10. 在日志中记录
If you (yoyo) created this skill in response to a community issue, also write a journal entry explaining what was added and why. This is what skill is for.
communicate如果你(yoyo)是响应社区议题创建的本skill,还需撰写一篇日志条目,说明新增内容及原因。这是 skill的用途。
communicatePitfalls
注意事项
- Don't auto-create skills mid-session without an explicit request. Yoyo's autonomous self-creation belongs in skill-evolve, which has the right safety gates (recurrence, cooldown, dedup, blast-radius limits). Using skill-creator without a clear human ask is a hard rule violation.
- Don't set for skills the human creator explicitly asked for. Those are
origin: yoyo(and probablyorigin: creator). The reverse is also true — don't setcore: trueon something yoyo decided to make.origin: creator - Don't omit for
keywords:skills. Without keywords, skill-evolve can't compute usage signals; the skill becomes invisible to the scoring loop.origin: yoyo - Don't create a skill that overlaps an existing one. ≥3 keyword overlap with an existing skill's "When to use" → refine that one instead. Same rule skill-evolve uses.
- Don't skip step 7 validators. Silent frontmatter truncation, description routing failures, body-token blow-ups — all real failure modes documented in the Hermes ecosystem (#7390, #13944, #14405).
- Don't write a skill body that exceeds 5000 words. Loaded into the prompt every session = cumulative token cost. Be brutal about brevity.
- 不要在会话中未经明确请求就自动创建skill。 Yoyo的自主创建功能属于skill-evolve,它具备正确的安全限制(重复触发、冷却期、去重、影响范围限制)。未经明确人类请求使用skill-creator属于严重违规。
- 不要为人类创建者明确要求的skill设置。 这类skill应设置为
origin: yoyo(且通常设置origin: creator)。反之亦然——不要为Yoyo自主决定创建的skill设置core: true。origin: creator - 不要省略skill的
origin: yoyo字段。 没有关键词,skill-evolve无法计算使用信号;该skill会在评分循环中被忽略。keywords: - 不要创建与现有skill重叠的skill。 与现有skill的“何时使用”部分有≥3个关键词重叠时,请优化现有skill。这与skill-evolve遵循的规则相同。
- 不要跳过步骤7的验证器。 静默的前置元数据截断、描述路由失败、正文令牌超限——这些都是Hermes生态系统中记录的真实故障模式(#7390、#13944、#14405)。
- 不要编写超过5000词的skill正文。 每次会话都会将其加载到提示词中——会累积令牌成本。务必保持简洁。
Verification
验证标准
A skill is well-formed when:
- The integration test passes.
skills_directory_loads_via_yoagent_skillset - The skill's directory name matches the frontmatter field.
name: - All required frontmatter fields are present (per origin tier — see step 6 templates).
- Description ≤200 chars.
- Frontmatter ≤1900 chars total.
- Body ≤5000 words and contains the five sections: When to use / Quick reference / Procedure / Pitfalls / Verification.
- For skills:
origin: yoyohas ≥3 entries.keywords: - The and
cargo buildgates that follow your commit are still green.cargo test
一个格式规范的skill需满足:
- 集成测试通过。
skills_directory_loads_via_yoagent_skillset - skill的目录名称与前置元数据中的字段匹配。
name: - 所有必填前置元数据字段均已填写(根据origin层级——见步骤6的模板)。
- 描述≤200字符。
- 前置元数据总长度≤1900字符。
- 正文≤5000词,且包含五个部分:何时使用 / 快速参考 / 操作流程 / 注意事项 / 验证方式。
- 对于的skill:
origin: yoyo字段包含≥3个条目。keywords: - 提交后和
cargo build验证仍通过。cargo test
What this skill deliberately does NOT do
本skill明确不具备的功能
- No eval/benchmark pipeline. Anthropic's includes synthetic prompts + grader subagent + benchmark.json aggregation. That capability lives in skill-evolve's Refine action (steps R1–R6) where the snapshot+A/B pattern can compare a candidate against the prior version. Adding it to skill-creator would duplicate; new skills don't have a "prior version" to A/B against anyway.
skill-creator - No browser eval viewer. Yoyo runs autonomously in CI; no browser. If you need to compare versions, use .
git diff - No autonomous pattern detection. That is skill-evolve's job. Skill-creator runs only when explicitly invoked.
- No retirement / deprecation logic. Lifecycle management is skill-evolve's job. Skill-creator only creates; it does not delete or downgrade.
If you find yourself wanting any of these capabilities, ask yourself first whether you're really inside a skill-evolve cycle.
- 无评估/基准测试流程。 Anthropic的包含合成提示词 + 评分子agent + benchmark.json聚合功能。该功能属于skill-evolve的Refine操作(步骤R1–R6),其中快照+A/B模式可以比较候选版本与旧版本。将其添加到skill-creator会造成重复;新skill没有可用于A/B测试的“旧版本”。
skill-creator - 无浏览器评估查看器。 Yoyo在CI中自主运行;无浏览器。如果需要比较版本,请使用。
git diff - 无自主模式检测功能。 这是skill-evolve的职责。skill-creator仅在明确调用时运行。
- 无退役/废弃逻辑。 生命周期管理是skill-evolve的职责。skill-creator仅负责创建;不负责删除或降级。
如果你需要上述任何功能,请先确认自己是否正处于skill-evolve循环中。