Перейти до основного вмісту
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.

Конфігурація

КлючТипове значенняДіапазон / значенняЗначення
enabledtruebooleanВмикає Plugin після завантаження запису Plugin.
autoCapturetruebooleanВмикає post-turn capture/review після успішних ходів агента.
approvalPolicy"pending""pending", "auto"Ставити proposals у чергу або автоматично записувати безпечні proposals.
reviewMode"hybrid""off", "heuristic", "llm", "hybrid"Вибирає явне захоплення виправлень, reviewer LLM, обидва варіанти або жоден.
reviewInterval151..200Запускати reviewer після такої кількості успішних ходів.
reviewMinToolCalls81..500Запускати reviewer після такої кількості спостережених викликів tools.
reviewTimeoutMs450005000..180000Тайм-аут для вбудованого запуску reviewer.
maxPending501..200Максимум pending/quarantined proposals на workspace.
maxSkillBytes400001024..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 time
  • from now on
  • remember to
  • make sure to
  • always ... use/check/verify/record/save/prefer
  • prefer ... when/for/instead/use
  • when 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: true
  • toolsAllow: []
  • 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 з такими полями:
  • id
  • createdAt
  • updatedAt
  • workspaceDir
  • необов’язковий agentId
  • необов’язковий sessionId
  • skillName
  • title
  • reason
  • source: tool, agent_end або reviewer
  • status
  • change
  • необов’язкові scanFindings
  • необов’язковий quarantineReason
Статуси proposal:
  • pending - очікує схвалення
  • applied - записано в <workspace>/skills
  • rejected - відхилено оператором/моделлю
  • 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:
  • pending
  • applied
  • rejected
  • quarantined

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 не створив proposalReviewer повернув none, невалідний JSON або спрацював тайм-аутЛоги Gateway, reviewTimeoutMs, пороги
Proposal не застосовуєтьсяapprovalPolicy: "pending"list_pending, потім apply
Proposal зникла з pendingБуло повторно використано duplicate proposal, спрацювало обрізання max pending або її застосовано/відхилено/quarantinedstatus, 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.md
  • qa/scenarios/plugins/skill-workshop-pending-approval.md
  • qa/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.

Пов’язані документи