{"slug": "which-coding-agents-support-disable-model-invocation-manual-only-skills", "title": "Which coding agents support disable-model-invocation (manual-only skills)?", "summary": "A developer surveyed coding agents to determine which support the disable-model-invocation frontmatter field, which prevents AI models from automatically loading skills. The survey found that Claude Code, Cursor, VS Code Copilot, Factory, and pi support the field, while OpenAI Codex and OpenCode use alternative mechanisms. The developer also provided a deep dive into pi's implementation, noting that it strictly checks for the boolean true and only suppresses the skill from the system prompt, not from manual invocation.", "body_md": "Claude Code's Agent Skills format has an optional frontmatter field:\n\n`disable-model-invocation`\n\n— Set to`true`\n\nto prevent Claude from automatically loading this skill. Use for workflows you want to trigger manually with`/name`\n\n. Also prevents the skill from being preloaded into subagents. As of v2.1.196, also prevents the skill from running when a scheduled task fires with the skill as its prompt. Default:`false`\n\n.\n\nI went looking for which other agents support this (or something equivalent). The [agentskills.io](https://agentskills.io) open spec itself does **not** define this field — only `name`\n\n, `description`\n\n, and optionally `license`\n\n, `compatibility`\n\n, `metadata`\n\n, `allowed-tools`\n\n. So this is an extension various clients have converged on (or diverged around).\n\n| Agent | Notes |\n|---|---|\nClaude Code |\nOrigin of the field. Also blocks subagent preloading, and (v2.1.196+) blocks scheduled-task triggers. |\nCursor |\nSame name/semantics. `true` → only reachable via `/skill-name` . Their rules→skills migration auto-sets this for legacy slash commands. |\nVS Code (Copilot) |\nSame name. Paired with `user-invocable` (default `true` ), giving a 2×2 matrix: default, background-only, on-demand-only, or fully disabled. |\nFactory (Droid CLI) |\nSame name/semantics, also has the companion `user-invocable` field, same as VS Code. |\npi |\nImplements it faithfully — see deep dive below. |\n\n| Agent | Mechanism |\n|---|---|\nOpenAI Codex |\nSKILL.md only supports `name` /`description` . Manual-only invocation is instead set in a sidecar `agents/openai.yaml` file: `policy.allow_implicit_invocation: false` . Explicit `$skill` invocation still works; implicit matching is disabled. |\nOpenCode |\nNo per-skill frontmatter equivalent (frontmatter only recognizes `name` , `description` , `license` , `compatibility` , `metadata` ). Instead, access is controlled globally via `opencode.json` permissions: `permission.skill.<name>: \"deny\"` or `\"ask\"` . This restricts access rather than offering a \"model can't invoke it but user can\" mode. |\n\n**Amp**— frontmatter docs only mention`name`\n\n/`description`\n\n.**Roo Code**— only`name`\n\n/`description`\n\nrequired/recognized; adds mode-specific skill directories instead.**Gemini CLI**— discovery/activation flow (via an`activate_skill`\n\ntool + user consent), but no documented field for suppressing automatic invocation.\n\nLooked at the actual source (`@earendil-works/pi-coding-agent`\n\n+ underlying `pi-agent-core`\n\nharness).\n\n**Parsing** (`core/skills.js`\n\n):\n\n```\ndisableModelInvocation: frontmatter[\"disable-model-invocation\"] === true\n```\n\nStrict boolean check — only literal `true`\n\ncounts; anything else (missing, `false`\n\n, or a stray string `\"true\"`\n\n) leaves the skill enabled. No warning on misuse.\n\n**What it suppresses:** only the `<available_skills>`\n\nblock injected into the system prompt. Implemented as a simple filter, present in *both* the CLI package and the underlying harness:\n\n``` js\nexport function formatSkillsForPrompt(skills) {\n    const visibleSkills = skills.filter((s) => !s.disableModelInvocation);\n    ...\n```\n\n**What it does NOT suppress:** the skill is still fully registered as a `/skill:name`\n\ncommand. The command list building code maps over *all* loaded skills with no `disableModelInvocation`\n\ncheck:\n\n``` js\nconst skills = this._resourceLoader.getSkills().skills.map((skill) => ({\n    name: `skill:${skill.name}`,\n    description: skill.description,\n    source: \"skill\",\n    ...\n```\n\nAnd `_expandSkillCommand`\n\n(which inlines the skill body when you type `/skill:name`\n\n) also ignores the flag — it always works.\n\n**Things Claude's docs mention that don't apply to pi:**\n\n**Subagents**— pi has no subagent concept in the codebase at all, so there's nothing extra to suppress there.** Scheduled tasks**— pi has no scheduled-task feature, so the v2.1.196 Claude behavior has no analog.\n\n**Comparison table:**\n\n| Behavior | Claude Code | pi |\n|---|---|---|\n| Hides from auto-load / system prompt | ✅ | ✅ |\nStill invocable via `/name` |\n✅ | ✅ (`/skill:name` ) |\n| Prevented from preloading into subagents | ✅ | N/A (no subagents) |\n| Prevented from firing via scheduled task | ✅ (v2.1.196+) | N/A (no scheduled tasks) |\n| Value validated / warned on misuse | not documented | no, silently coerced via `=== true` |\n| Can disable manual invocation globally | n/a (per-skill) | yes, but only globally via `enableSkillCommands` , not per-skill |\n\nSo pi implements the core semantics faithfully — hide from auto-discovery, keep manual slash access — without the subagent/scheduled-task extensions Claude Code later added, simply because pi's architecture doesn't have those features (yet).", "url": "https://wpnews.pro/news/which-coding-agents-support-disable-model-invocation-manual-only-skills", "canonical_source": "https://gist.github.com/zeke/0f654737ec01b20e9bf85d3cc0bc1c14", "published_at": "2026-07-08 14:35:13+00:00", "updated_at": "2026-08-03 09:30:14.514129+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-tools"], "entities": ["Claude Code", "Cursor", "VS Code Copilot", "Factory", "pi", "OpenAI Codex", "OpenCode", "agentskills.io"], "alternates": {"html": "https://wpnews.pro/news/which-coding-agents-support-disable-model-invocation-manual-only-skills", "markdown": "https://wpnews.pro/news/which-coding-agents-support-disable-model-invocation-manual-only-skills.md", "text": "https://wpnews.pro/news/which-coding-agents-support-disable-model-invocation-manual-only-skills.txt", "jsonld": "https://wpnews.pro/news/which-coding-agents-support-disable-model-invocation-manual-only-skills.jsonld"}}