skill-creator

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Skill 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:
Questionskill-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 demandHourly cron at
:30
, gated by 5-session counter + 24h cooldown
What signals does it use?The user's requestPast-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 sessionYes —
scripts/skill_evolve.sh
enforces
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
memory/learnings.jsonl
with a
pattern_key
and let skill-evolve pick it up on the next cycle.
二者互为补充,而非重复。请选择合适的工具:
问题skill-creator(本技能)skill-evolve
触发者是谁?人类创建者 或 社区议题(明确请求)GitHub Actions 定时任务(自主触发)
运行时机?在常规的evolve会话中按需运行每小时30分触发定时任务,需满足5会话计数器 + 24小时冷却期的限制
使用哪些信号?用户的请求过往会话的证据(学习记录、日志、审计日志)
是否有重复触发限制?无(人类参与流程)有(创建需≥3次会话记录)
是否有差异范围防护?无——在evolve会话中运行有——由
scripts/skill_evolve.sh
强制执行
是否自动提交?是(在evolve会话的提交流程中完成)是(通过差异范围检查 + 构建/测试验证后)
经验法则:如果没有人类提出请求,你不需要创建skill——而是要记录下相关模式。将其写入
memory/learnings.jsonl
并添加
pattern_key
,让skill-evolve在下一轮循环中处理。

When NOT to use this skill

何时不应使用本技能

  • You're inside a
    scripts/skill_evolve.sh
    cycle. Use the Create branch in
    skills/skill-evolve/SKILL.md
    instead — it has the right gates (recurrence, dedup, ≤25 cap).
  • You noticed a recurring pattern but no one asked. Write a learning with
    pattern_key
    ; skill-evolve owns autonomous creation.
  • 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
    循环中。请改用
    skills/skill-evolve/SKILL.md
    中的Create分支——它具备正确的限制条件(重复触发、去重、≤25个上限)。
  • 你发现了重复出现的模式,但无人提出请求。请添加
    pattern_key
    记录学习内容;自主创建是skill-evolve的职责。
  • 用户请求的是一次性辅助工具,不会再次调用。直接在代码中编写即可;不要在
    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
    origin: marketplace
    or
    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:

2. 确定
origin:
字段

AskerUse of skill
origin:
core: true
?
Human creator (Yuanhao)Foundational capability, not delegated to autonomous evolution
creator
yes
Human creatorUseful but yoyo-evolvable later
creator
no
Yoyo (during issue response)Domain capability for yoyo's own future use
yoyo
no
External sourceInstalled third-party skill
marketplace
(or
gh:author/repo
)
no
The default if you're unsure:
origin: yoyo
for yoyo-decided creations,
origin: creator
for human-driven creations. Never default to
marketplace
.
HARD PRECONDITION on
origin: marketplace
/
origin: gh:…
(closes a backdoor — these origins are off-limits to skill-evolve, so they must come from a real upstream, not be self-granted):
  • 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
    ## Source
    section.
  • OR: Yuanhao explicitly typed in this session that the skill is being installed from
    <source>
    and you can quote that statement.
If neither holds, refuse and pick
creator
or
yoyo
instead. A skill yoyo wrote itself but tagged
marketplace
would be a permanent un-evolvable artifact — that's a hole in the safety design.
请求者skill用途
origin:
是否设置
core: true
人类创建者(Yuanhao)基础功能,不交由自主演化处理
creator
人类创建者有用但后续可由yoyo自主演化
creator
Yoyo(响应议题时)Yoyo未来使用的领域功能
yoyo
外部来源已安装的第三方skill
marketplace
(或
gh:author/repo
不确定时的默认值:Yoyo自主决定创建的skill用
origin: yoyo
,人类驱动创建的skill用
origin: creator
。切勿默认使用
marketplace
origin: marketplace
/
origin: gh:…
的硬性前提条件
(关闭后门——这些标识对skill-evolve不可用,因此必须来自真实的上游源,而非自行设置):
  • skill内容必须在本次会话中从可验证的URL(curl/git/gh)下载。在skill的正文
    ## Source
    部分记录该URL。
  • 或者:Yuanhao在本次会话中明确输入该skill来自
    <source>
    ,你可以引用该语句。
如果以上条件均不满足,请拒绝并选择
creator
yoyo
。Yoyo自行编写但标记为
marketplace
的skill会成为永久无法演化的产物——这会破坏安全设计。

3. Pick a kebab-case name

3. 选择短横线分隔式(kebab-case)名称

Format:
<verb>-<object>
(e.g.,
bisect-flaky-test
,
compose-changelog
,
triage-pr
). Single-word names are okay only for genuinely-broad scopes (
research
,
release
).
Check 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-test
,
compose-changelog
,
triage-pr
)。只有当功能范围确实非常宽泛时,才允许使用单字名称(如
research
,
release
)。
继续下一步前检查是否重名:
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
cargo publish
"
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""在执行任何
cargo publish
前,验证发布准备状态并发布至crates.io:执行构建/测试/clippy/fmt等检查"
硬性上限:200字符。Hermes生态系统记录了超过此长度时的描述截断故障(#13944)。

5. Pick keywords (only if
origin: yoyo
)

5. 选择关键词(仅适用于
origin: yoyo
的skill)

For
origin: yoyo
skills, list 3–5 distinctive substrings that would appear in a session's
audit.jsonl
IF this skill were used. skill-evolve uses these to compute
last_used
/
uses
/
wins
.
Examples:
  • release
    skill:
    ["cargo publish", "crates.io", "git tag v"]
  • social
    skill:
    ["gh api graphql", "discussion", "addDiscussionComment"]
Skip the
keywords:
field for
origin: creator
skills (skill-evolve can't refine them anyway).
对于
origin: yoyo
的skill,列出3-5个独特子字符串,这些字符串会出现在使用本skill的会话
audit.jsonl
中。skill-evolve会用这些字符串计算
last_used
/
uses
/
wins
指标。
示例:
  • release
    skill:
    ["cargo publish", "crates.io", "git tag v"]
  • social
    skill:
    ["gh api graphql", "discussion", "addDiscussionComment"]
origin: creator
的skill无需填写
keywords:
字段(skill-evolve无法对其进行优化)。

6. Generate the SKILL.md scaffold

6. 生成SKILL.md框架

Choose the template that matches
origin:
.
For
origin: creator
:
yaml
---
name: <name>
description: <pushy description ≤200 chars>
tools: [<subset of yoagent tools>]
core: true
origin: creator
---
选择与
origin:
匹配的模板。
适用于
origin: creator
yaml
---
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: 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>"]
---
<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
<name>
strings reaching the shell):
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变量,以便后续代码块可以直接复制使用(避免将字面量
<name>
字符串传入shell):
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

YAML 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; }
undefined
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; }
undefined

8. Smoke-test the skill loads via yoagent

8. 冒烟测试:验证skill可通过yoagent加载

bash
cargo test --quiet --test integration skills_directory_loads_via_yoagent_skillset
This regression test loads every
skills/*/SKILL.md
via
yoagent::skills::SkillSet::load
. If your new skill breaks parsing, the test fails immediately. If it fails, do not commit — fix the frontmatter first.
bash
cargo test --quiet --test integration skills_directory_loads_via_yoagent_skillset
该回归测试会通过
yoagent::skills::SkillSet::load
加载所有
skills/*/SKILL.md
文件。如果你的新skill解析失败,测试会立即报错。如果测试失败,请不要提交——先修复前置元数据。

9. Commit

9. 提交代码

bash
undefined
bash
undefined

Reuse $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
communicate
skill is for.
如果你(yoyo)是响应社区议题创建的本skill,还需撰写一篇日志条目,说明新增内容及原因。这是
communicate
skill的用途。

Pitfalls

注意事项

  • 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
    origin: yoyo
    for skills the human creator explicitly asked for.
    Those are
    origin: creator
    (and probably
    core: true
    ). The reverse is also true — don't set
    origin: creator
    on something yoyo decided to make.
  • Don't omit
    keywords:
    for
    origin: yoyo
    skills.
    Without keywords, skill-evolve can't compute usage signals; the skill becomes invisible to the scoring loop.
  • 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设置
    origin: yoyo
    这类skill应设置为
    origin: creator
    (且通常设置
    core: true
    )。反之亦然——不要为Yoyo自主决定创建的skill设置
    origin: creator
  • 不要省略
    origin: yoyo
    skill的
    keywords:
    字段。
    没有关键词,skill-evolve无法计算使用信号;该skill会在评分循环中被忽略。
  • 不要创建与现有skill重叠的skill。 与现有skill的“何时使用”部分有≥3个关键词重叠时,请优化现有skill。这与skill-evolve遵循的规则相同。
  • 不要跳过步骤7的验证器。 静默的前置元数据截断、描述路由失败、正文令牌超限——这些都是Hermes生态系统中记录的真实故障模式(#7390、#13944、#14405)。
  • 不要编写超过5000词的skill正文。 每次会话都会将其加载到提示词中——会累积令牌成本。务必保持简洁。

Verification

验证标准

A skill is well-formed when:
  • The integration test
    skills_directory_loads_via_yoagent_skillset
    passes.
  • The skill's directory name matches the
    name:
    frontmatter field.
  • 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
    origin: yoyo
    skills:
    keywords:
    has ≥3 entries.
  • The
    cargo build
    and
    cargo test
    gates that follow your commit are still green.
一个格式规范的skill需满足:
  • 集成测试
    skills_directory_loads_via_yoagent_skillset
    通过。
  • skill的目录名称与前置元数据中的
    name:
    字段匹配。
  • 所有必填前置元数据字段均已填写(根据origin层级——见步骤6的模板)。
  • 描述≤200字符。
  • 前置元数据总长度≤1900字符。
  • 正文≤5000词,且包含五个部分:何时使用 / 快速参考 / 操作流程 / 注意事项 / 验证方式。
  • 对于
    origin: yoyo
    的skill:
    keywords:
    字段包含≥3个条目。
  • 提交后
    cargo build
    cargo test
    验证仍通过。

What this skill deliberately does NOT do

本skill明确不具备的功能

  • No eval/benchmark pipeline. Anthropic's
    skill-creator
    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.
  • 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的
    skill-creator
    包含合成提示词 + 评分子agent + benchmark.json聚合功能。该功能属于skill-evolve的Refine操作(步骤R1–R6),其中快照+A/B模式可以比较候选版本与旧版本。将其添加到skill-creator会造成重复;新skill没有可用于A/B测试的“旧版本”。
  • 无浏览器评估查看器。 Yoyo在CI中自主运行;无浏览器。如果需要比较版本,请使用
    git diff
  • 无自主模式检测功能。 这是skill-evolve的职责。skill-creator仅在明确调用时运行。
  • 无退役/废弃逻辑。 生命周期管理是skill-evolve的职责。skill-creator仅负责创建;不负责删除或降级。
如果你需要上述任何功能,请先确认自己是否正处于skill-evolve循环中。