diff --git a/REPL.md b/REPL.md index 59e1cd6..4e8cc2a 100644 --- a/REPL.md +++ b/REPL.md @@ -78,6 +78,9 @@ cannot be persisted to a file and saved. Skills are modular knowledge or capability packs the LLM can load and unload mid-conversation. Multiple skills can be loaded at once; their instructions stack and their tools/MCP servers union with the active role/agent/session. +> **Requires function calling.** Skills depend on Coyote's function calling system. If `function_calling_support: false` +> in your global config, the `.skill load` and `.skill unload` commands refuse, and the model cannot load skills itself. + | Command | Description | |------------------------|---------------------------------------------------------------------------------------------------| | `.skill loaded` | List currently-loaded skills in this session | diff --git a/Skills.md b/Skills.md index 9695deb..42ce164 100644 --- a/Skills.md +++ b/Skills.md @@ -11,6 +11,13 @@ Common uses: - **Toolkit unlocks** that grant a small bundle of tools or MCP servers without changing the active role. - **One-shot helpers** that auto-unload after the model finishes a task (see [auto_unload](#auto-unload)). +> **Prerequisite: function calling must be enabled.** Skills are built on top of Coyote's function calling system so as +> to not overwhelm the context with skill descriptions. `skill__list`, `skill__load`, and `skill__unload` meta-tools are +> themselves function calls, and most skills grant tools the model needs to invoke. If your global config has +> `function_calling_support: false`, the entire skills system is disabled: the meta-tools are not registered, the REPL +> `.skill load` command refuses, and `coyote --skill ` exits with a clear error. See [Function Calling](Tools) to +> enable it. + --- # Skill Definition @@ -175,13 +182,19 @@ filtered out of the response and cannot be loaded. `skill__load` rejects it with ## Validation -Three validation points enforce these rules: +Four validation points enforce these rules: -| Where | What is checked | Severity | -|------------------------|---------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| **Config load** | Every name in any `enabled_skills` exists on disk AND is in global `visible_skills` (when `visible_skills` is set). | **Hard error**. Refuses to start with the offending name + level. | -| **Runtime list/build** | For each enabled skill: declared tools require function calling; declared MCPs require MCP support. | **Filter + warn**. Incompatible skills are dropped from `skill__list`. | -| **`skill__load` call** | Skill is in the effective enabled set AND compatible with current feature flags. | **Tool error to model** with a distinct message per failure mode. | +| Where | What is checked | Severity | +|-------------------------|---------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------| +| **Global feature gate** | `function_calling_support: true` is required for skills to exist at all (registry/tools/REPL/CLI). | **Skills are silently disabled**. No `skill__*` tools, `.skill load` and `--skill` refuse. | +| **Config load** | Every name in any `enabled_skills` exists on disk and is in global `visible_skills` (when `visible_skills` is set). | **Hard error**. Refuses to start with the offending name + level. | +| **Runtime list/build** | For each enabled skill: declared MCPs require MCP support. | **Filter + warn**. Incompatible skills are dropped from `skill__list`. | +| **`skill__load` call** | Skill is in the effective enabled set and its declared MCPs are usable. | **Tool error to model** with a distinct message per failure mode. | + +> **Skills require function calling.** Skills are useless without it. The meta-tools (`skill__list`, `skill__load`, +> `skill__unload`) are themselves function calls, and most skills grant tools the model needs to invoke. If +> `function_calling_support: false` in your global config, the entire skills feature is off. The REPL `.skill load` +> command, the CLI `--skill ` flag, and the model's own `skill__load` invocation all refuse with a clear error. --- @@ -274,4 +287,6 @@ When skills are enabled, the model has three tools available for managing them i | `skill__unload` | `name: string` | Unloads a loaded skill. Releases its MCP server handles. | These are how the model discovers and uses skills mid-conversation. You can disable this discovery channel by setting -`skills_enabled: false` at any level; the three tools then disappear from the model's function list entirely. +`skills_enabled: false` at any level; the three tools then disappear from the model's function list entirely. The same +happens if `function_calling_support: false` is set globally. Without function calling, the skill system has no surface +to operate on, so it is silently disabled across REPL, CLI, agents, and the model's tool list.