29 KiB
| read_when | summary | title | x-i18n | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Експериментальне захоплення повторно використовуваних процедур як workspace Skills із review, approval, quarantine і гарячим оновленням Skills | Plugin майстерні Skills |
|
Skill Workshop — експериментальна функція. Вона типово вимкнена, її евристики захоплення та prompts reviewer можуть змінюватися між випусками, а автоматичні записи слід використовувати лише в довірених робочих просторах після попереднього перегляду виводу в режимі pending.
Skill Workshop — це процедурна пам’ять для workspace Skills. Вона дає змогу агенту перетворювати
повторно використовувані робочі процеси, виправлення від користувача, важко здобуті рішення та
типові підводні камені на файли SKILL.md у:
<workspace>/skills/<skill-name>/SKILL.md
Це відрізняється від довготривалої пам’яті:
- Memory зберігає факти, уподобання, сутності та попередній контекст.
- Skills зберігають повторно використовувані процедури, яких агент має дотримуватися в майбутніх завданнях.
- Skill Workshop — це місток від корисного ходу до стійкого workspace Skill, із перевірками безпеки та необов’язковим схваленням.
Skill Workshop корисний, коли агент вивчає процедуру, наприклад:
- як перевіряти externally sourced анімовані GIF-ресурси
- як замінювати ресурси скриншотів і перевіряти розміри
- як запускати QA-сценарій, специфічний для repo
- як налагоджувати повторюваний збій provider
- як виправляти застарілу локальну нотатку робочого процесу
Він не призначений для:
- фактів на кшталт «користувачу подобається синій»
- широкої автобіографічної пам’яті
- архівації сирих транскриптів
- секретів, облікових даних або прихованого тексту prompt
- одноразових інструкцій, які не повторяться
Типовий стан
Вбудований Plugin є експериментальним і типово вимкненим, доки його не
ввімкнено явно в plugins.entries.skill-workshop.
Маніфест Plugin не задає enabledByDefault: true. Типове значення enabled: true
усередині схеми конфігурації Plugin застосовується лише після того, як запис Plugin уже
було вибрано й завантажено.
Експериментальний означає:
- Plugin достатньо підтримується для opt-in тестування та dogfooding
- зберігання пропозицій, пороги reviewer і евристики захоплення можуть еволюціонувати
- рекомендований початковий режим — pending approval
- auto apply призначений для довірених персональних/workspace конфігурацій, а не для спільних або ворожих середовищ із великим обсягом вхідних даних
Увімкнення
Мінімальна безпечна конфігурація:
{
plugins: {
entries: {
"skill-workshop": {
enabled: true,
config: {
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "hybrid",
},
},
},
},
}
З цією конфігурацією:
- tool
skill_workshopдоступний - явні повторно використовувані виправлення ставляться в чергу як pending proposals
- reviewer-перевірки на основі порогів можуть пропонувати оновлення Skills
- жоден файл Skill не записується, доки pending proposal не буде застосовано
Використовуйте автоматичні записи лише в довірених робочих просторах:
{
plugins: {
entries: {
"skill-workshop": {
enabled: true,
config: {
autoCapture: true,
approvalPolicy: "auto",
reviewMode: "hybrid",
},
},
},
},
}
approvalPolicy: "auto" усе одно використовує той самий scanner і шлях quarantine. Він
не застосовує proposals із критичними findings.
Конфігурація
| Ключ | Типове значення | Діапазон / значення | Значення |
|---|---|---|---|
enabled |
true |
boolean | Вмикає Plugin після завантаження запису Plugin. |
autoCapture |
true |
boolean | Вмикає post-turn capture/review після успішних ходів агента. |
approvalPolicy |
"pending" |
"pending", "auto" |
Ставити proposals у чергу або автоматично записувати безпечні proposals. |
reviewMode |
"hybrid" |
"off", "heuristic", "llm", "hybrid" |
Вибирає явне захоплення виправлень, reviewer LLM, обидва варіанти або жоден. |
reviewInterval |
15 |
1..200 |
Запускати reviewer після такої кількості успішних ходів. |
reviewMinToolCalls |
8 |
1..500 |
Запускати reviewer після такої кількості спостережених викликів tools. |
reviewTimeoutMs |
45000 |
5000..180000 |
Тайм-аут для вбудованого запуску reviewer. |
maxPending |
50 |
1..200 |
Максимум pending/quarantined proposals на workspace. |
maxSkillBytes |
40000 |
1024..200000 |
Максимальний розмір згенерованого файла skill/support. |
Рекомендовані профілі:
// Conservative: explicit tool use only, no automatic capture.
{
autoCapture: false,
approvalPolicy: "pending",
reviewMode: "off",
}
// Review-first: capture automatically, but require approval.
{
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "hybrid",
}
// Trusted automation: write safe proposals immediately.
{
autoCapture: true,
approvalPolicy: "auto",
reviewMode: "hybrid",
}
// Low-cost: no reviewer LLM call, only explicit correction phrases.
{
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "heuristic",
}
Шляхи захоплення
Skill Workshop має три шляхи захоплення.
Пропозиції через tool
Модель може викликати skill_workshop безпосередньо, коли бачить повторно використовувану процедуру
або коли користувач просить її зберегти/оновити Skill.
Це найявніший шлях, і він працює навіть з autoCapture: false.
Евристичне захоплення
Коли autoCapture увімкнено, а reviewMode має значення heuristic або hybrid,
Plugin сканує успішні ходи на явні фрази виправлення від користувача:
next timefrom now onremember tomake sure toalways ... use/check/verify/record/save/preferprefer ... when/for/instead/usewhen asked
Евристика створює proposal з останньої відповідної інструкції користувача. Вона використовує topic hints для вибору назв Skills для типових робочих процесів:
- завдання з анімованими GIF ->
animated-gif-workflow - завдання зі скриншотами або ресурсами ->
screenshot-asset-workflow - завдання з QA або сценаріями ->
qa-scenario-workflow - завдання з GitHub PR ->
github-pr-workflow - резервний варіант ->
learned-workflows
Евристичне захоплення навмисно вузьке. Воно призначене для чітких виправлень і повторюваних нотаток процесу, а не для загального підсумовування транскриптів.
LLM reviewer
Коли autoCapture увімкнено, а reviewMode має значення llm або hybrid, Plugin
запускає компактний вбудований reviewer після досягнення порогів.
Reviewer отримує:
- текст недавнього транскрипту, обмежений останніми 12 000 символів
- до 12 наявних workspace Skills
- до 2 000 символів з кожного наявного Skill
- інструкції лише у форматі JSON
Reviewer не має tools:
disableTools: truetoolsAllow: []disableMessageTool: true
Reviewer повертає або { "action": "none" }, або одну proposal. Поле action має значення create, append або replace — надавайте перевагу append/replace, коли відповідний Skill уже існує; використовуйте create, лише коли жоден наявний Skill не підходить.
Приклад create:
{
"action": "create",
"skillName": "media-asset-qa",
"title": "Media Asset QA",
"reason": "Reusable animated media acceptance workflow",
"description": "Validate externally sourced animated media before product use.",
"body": "## Workflow\n\n- Verify true animation.\n- Record attribution.\n- Store a local approved copy.\n- Verify in product UI before final reply."
}
append додає section + body. replace замінює oldText на newText у вказаному Skill.
Життєвий цикл proposal
Кожне згенероване оновлення стає proposal з такими полями:
idcreatedAtupdatedAtworkspaceDir- необов’язковий
agentId - необов’язковий
sessionId skillNametitlereasonsource:tool,agent_endабоreviewerstatuschange- необов’язкові
scanFindings - необов’язковий
quarantineReason
Статуси proposal:
pending- очікує схваленняapplied- записано в<workspace>/skillsrejected- відхилено оператором/моделлюquarantined- заблоковано критичними findings scanner
Стан зберігається окремо для кожного workspace у каталозі стану Gateway:
<stateDir>/skill-workshop/<workspace-hash>.json
Pending і quarantined proposals дедуплікуються за назвою Skill і payload
зміни. Сховище зберігає найновіші pending/quarantined proposals у межах
maxPending.
Довідник по tool
Plugin реєструє один agent tool:
skill_workshop
status
Порахувати proposals за станом для активного workspace.
{ "action": "status" }
Форма результату:
{
"workspaceDir": "/path/to/workspace",
"pending": 1,
"quarantined": 0,
"applied": 3,
"rejected": 0
}
list_pending
Перелічити pending proposals.
{ "action": "list_pending" }
Щоб перелічити інший статус:
{ "action": "list_pending", "status": "applied" }
Допустимі значення status:
pendingappliedrejectedquarantined
list_quarantine
Перелічити quarantined proposals.
{ "action": "list_quarantine" }
Використовуйте це, коли здається, що автоматичне захоплення нічого не робить, а в логах згадується
skill-workshop: quarantined <skill>.
inspect
Отримати proposal за id.
{
"action": "inspect",
"id": "proposal-id"
}
suggest
Створити proposal. За approvalPolicy: "pending" (типово) це ставить її в чергу, а не записує.
{
"action": "suggest",
"skillName": "animated-gif-workflow",
"title": "Animated GIF Workflow",
"reason": "User established reusable GIF validation rules.",
"description": "Validate animated GIF assets before using them.",
"body": "## Workflow\n\n- Verify the URL resolves to image/gif.\n- Confirm it has multiple frames.\n- Record attribution and license.\n- Avoid hotlinking when a local asset is needed."
}
{
"action": "suggest",
"apply": true,
"skillName": "animated-gif-workflow",
"description": "Validate animated GIF assets before using them.",
"body": "## Workflow\n\n- Verify true animation.\n- Record attribution."
}
{
"action": "suggest",
"apply": false,
"skillName": "screenshot-asset-workflow",
"description": "Screenshot replacement workflow.",
"body": "## Workflow\n\n- Verify dimensions.\n- Optimize the PNG.\n- Run the relevant gate."
}
{
"action": "suggest",
"skillName": "qa-scenario-workflow",
"section": "Workflow",
"description": "QA scenario workflow.",
"body": "- For media QA, verify generated assets render and pass final assertions."
}
{
"action": "suggest",
"skillName": "github-pr-workflow",
"oldText": "- Check the PR.",
"newText": "- Check unresolved review threads, CI status, linked issues, and changed files before deciding."
}
apply
Застосувати pending proposal.
{
"action": "apply",
"id": "proposal-id"
}
apply відмовляється застосовувати quarantined proposals:
quarantined proposal cannot be applied
reject
Позначити proposal як rejected.
{
"action": "reject",
"id": "proposal-id"
}
write_support_file
Записати допоміжний файл всередині каталогу наявного або запропонованого Skill.
Дозволені каталоги верхнього рівня для допоміжних файлів:
references/templates/scripts/assets/
Приклад:
{
"action": "write_support_file",
"skillName": "release-workflow",
"relativePath": "references/checklist.md",
"body": "# Release Checklist\n\n- Run release docs.\n- Verify changelog.\n"
}
Допоміжні файли мають область дії workspace, перевіряються за шляхом, обмежуються за байтами через
maxSkillBytes, скануються й записуються атомарно.
Записи Skills
Skill Workshop записує лише в:
<workspace>/skills/<normalized-skill-name>/
Назви Skills нормалізуються:
- переводяться в нижній регістр
- послідовності символів, що не входять до
[a-z0-9_-], перетворюються на- - початкові/кінцеві неалфавітно-цифрові символи видаляються
- максимальна довжина — 80 символів
- фінальна назва має відповідати
[a-z0-9][a-z0-9_-]{1,79}
Для create:
- якщо Skill не існує, Skill Workshop записує новий
SKILL.md - якщо він уже існує, Skill Workshop додає body до
## Workflow
Для append:
- якщо Skill існує, Skill Workshop додає в запитаний розділ
- якщо не існує, Skill Workshop створює мінімальний Skill, а потім додає в нього
Для replace:
- Skill уже має існувати
oldTextмає бути присутнім у точному вигляді- замінюється лише перший точний збіг
Усі записи атомарні й негайно оновлюють знімок Skills у пам’яті, тож новий або оновлений Skill може стати видимим без перезапуску Gateway.
Модель безпеки
Skill Workshop має safety scanner для згенерованого вмісту SKILL.md і допоміжних
файлів.
Критичні findings переводять proposals у quarantine:
| Rule id | Блокує вміст, який... |
|---|---|
prompt-injection-ignore-instructions |
наказує агенту ігнорувати попередні/вищі за пріоритетом інструкції |
prompt-injection-system |
посилається на system prompts, developer messages або приховані інструкції |
prompt-injection-tool |
заохочує обходити permission/approval для tools |
shell-pipe-to-shell |
містить curl/wget, передані через pipe у sh, bash або zsh |
secret-exfiltration |
схоже на спробу надіслати env/process env дані через мережу |
Попереджувальні findings зберігаються, але самі по собі не блокують:
| Rule id | Попереджає про... |
|---|---|
destructive-delete |
широкі команди в стилі rm -rf |
unsafe-permissions |
використання дозволів у стилі chmod 777 |
Quarantined proposals:
- зберігають
scanFindings - зберігають
quarantineReason - відображаються в
list_quarantine - не можуть бути застосовані через
apply
Щоб відновитися після quarantined proposal, створіть нову безпечну proposal, з якої прибрано небезпечний вміст. Не редагуйте JSON сховища вручну.
Вказівки для prompt
Коли Skill Workshop увімкнено, він додає короткий розділ prompt, який каже агенту
використовувати skill_workshop для стійкої процедурної пам’яті.
Ці вказівки наголошують на:
- процедурах, а не фактах/уподобаннях
- виправленнях від користувача
- неочевидних успішних процедурах
- повторюваних підводних каменях
- виправленні застарілих/слабких/неправильних Skills через append/replace
- збереженні повторно використовуваної процедури після довгих циклів tools або складних виправлень
- короткому імперативному тексті Skill
- відсутності зливів транскриптів
Текст режиму запису змінюється залежно від approvalPolicy:
- режим pending: ставити suggestions у чергу; застосовувати лише після явного схвалення
- режим auto: застосовувати безпечні оновлення workspace Skills, коли їхня повторна корисність очевидна
Вартість і поведінка runtime
Евристичне захоплення не викликає модель.
LLM review використовує вбудований run на активній/типовій моделі агента. Це порігозалежний механізм, тому типово він не запускається на кожному ході.
Reviewer:
- використовує той самий налаштований контекст provider/model, коли це можливо
- резервно використовує типові значення runtime агента
- має
reviewTimeoutMs - використовує легковагий bootstrap-контекст
- не має tools
- нічого не записує напряму
- може лише видати proposal, яка проходить звичайний scanner і шлях approval/quarantine
Якщо reviewer завершується помилкою, тайм-аутом або повертає невалідний JSON, Plugin записує попередження/повідомлення debug у лог і пропускає цей review pass.
Робочі шаблони
Використовуйте Skill Workshop, коли користувач каже:
- “next time, do X”
- “from now on, prefer Y”
- “make sure to verify Z”
- “save this as a workflow”
- “this took a while; remember the process”
- “update the local skill for this”
Хороший текст Skill:
## Workflow
- Verify the GIF URL resolves to `image/gif`.
- Confirm the file has multiple frames.
- Record source URL, license, and attribution.
- Store a local copy when the asset will ship with the product.
- Verify the local asset renders in the target UI before final reply.
Поганий текст Skill:
The user asked about a GIF and I searched two websites. Then one was blocked by
Cloudflare. The final answer said to check attribution.
Причини, чому поганий варіант не слід зберігати:
- має форму транскрипту
- не є імперативним
- містить шумні одноразові деталі
- не каже наступному агенту, що робити
Налагодження
Перевірте, чи завантажено Plugin:
openclaw plugins list --enabled
Перевірте кількість proposals із контексту agent/tool:
{ "action": "status" }
Перегляньте pending proposals:
{ "action": "list_pending" }
Перегляньте quarantined proposals:
{ "action": "list_quarantine" }
Поширені симптоми:
| Симптом | Ймовірна причина | Що перевірити |
|---|---|---|
| Tool недоступний | Запис Plugin не ввімкнено | plugins.entries.skill-workshop.enabled і openclaw plugins list |
| Автоматична proposal не з’являється | autoCapture: false, reviewMode: "off" або пороги не досягнуто |
Config, статус proposal, логи Gateway |
| Евристика не спрацювала | Формулювання користувача не збіглося з шаблонами виправлень | Використайте явний skill_workshop.suggest або ввімкніть reviewer LLM |
| Reviewer не створив proposal | Reviewer повернув none, невалідний JSON або спрацював тайм-аут |
Логи Gateway, reviewTimeoutMs, пороги |
| Proposal не застосовується | approvalPolicy: "pending" |
list_pending, потім apply |
| Proposal зникла з pending | Було повторно використано duplicate proposal, спрацювало обрізання max pending або її застосовано/відхилено/quarantined | status, list_pending з фільтрами status, list_quarantine |
| Файл Skill існує, але модель його не бачить | Знімок Skill не оновився або gating Skill його виключає | openclaw skills status і придатність workspace Skill |
Релевантні логи:
skill-workshop: queued <skill>skill-workshop: applied <skill>skill-workshop: quarantined <skill>skill-workshop: heuristic capture skipped: ...skill-workshop: reviewer skipped: ...skill-workshop: reviewer found no update
QA-сценарії
QA-сценарії, що підтримуються repo:
qa/scenarios/plugins/skill-workshop-animated-gif-autocreate.mdqa/scenarios/plugins/skill-workshop-pending-approval.mdqa/scenarios/plugins/skill-workshop-reviewer-autonomous.md
Запустіть детерміноване покриття:
pnpm openclaw qa suite \
--scenario skill-workshop-animated-gif-autocreate \
--scenario skill-workshop-pending-approval \
--concurrency 1
Запустіть покриття reviewer:
pnpm openclaw qa suite \
--scenario skill-workshop-reviewer-autonomous \
--concurrency 1
Сценарій reviewer навмисно винесено окремо, оскільки він вмикає
reviewMode: "llm" і перевіряє вбудований reviewer pass.
Коли не варто вмикати auto apply
Уникайте approvalPolicy: "auto", коли:
- workspace містить чутливі процедури
- агент працює з недовіреним вводом
- Skills спільно використовуються широкою командою
- ви ще налаштовуєте prompts або правила scanner
- модель часто обробляє ворожий web/email-контент
Спочатку використовуйте режим pending. Перемикайтеся на режим auto лише після перегляду того типу Skills, які агент пропонує в цьому workspace.