Skill frontmatter `effort:` applied on slash-command invocation but ignored when the model invokes the skill via the Skill tool
Summary
A skill's frontmatter effort: field is applied when the user invokes the skill via slash command (/skill-name), but silently ignored when the model invokes the same skill via the Skill tool mid-session. The docs make no distinction between the two invocation paths, so this looks like an implementation gap rather than intended behavior.
Environment
- Claude Code v2.1.220 (CLI, macOS / darwin 25.2.0)
- Session model: Fable 5 (
claude-fable-5) - Session effort:
high(settings.jsoneffortLevel: "high"; noCLAUDE_CODE_EFFORT_LEVELenv var)
Repro
- Create a user skill (
~/.claude/skills/my-design-skill/SKILL.md) with:
---
name: my-design-skill
description: "..."
effort: xhigh
---
- Path A — slash command: in a session running at
effort: high, type/my-design-skill <topic>.
- Observed: every subsequent API request runs at
xhigh, starting with the first response. ✅ (matches docs)
- Path B — model-initiated Skill tool call: in a session running at
effort: high, ask for work that makes the model call the skill itself (the transcript shows an assistanttool_useblock withname: "Skill",input.skill: "my-design-skill").
- Observed: every request before and after the Skill call stays at
high, through the end of the session. ❌
Evidence
Verified from session transcripts (~/.claude/projects/**/<uuid>.jsonl): assistant events record the applied per-request effort in an "effort" field.
- Path A session: all effort-bearing assistant events log
"effort":"xhigh"immediately after the slash invocation (notably, the transcript contains zeroSkilltool_use events — the slash path injects the skill body directly and reconfigures the request). - Path B session (same day, same CC version, skill file unchanged): 66/66 effort-bearing assistant events log
"effort":"high", including all events after theSkilltool_use that loaded the skill. - Control: agent frontmatter
effort:works correctly on both paths — a subagent whose definition pinseffort: xhighlogs"effort":"xhigh"on 37/37 requests while the parent session runs athigh. The gap is specific to skill frontmatter + Skill-tool invocation.
Expected
Docs (Extend Claude with skills, Model configuration) state:
effort — Effort level when this skill is active. Overrides the session effort level.
and describe both invocation paths as equivalent ("You can type /skill-name to invoke it directly, and Claude can load it automatically when relevant"). Nothing restricts effort: to slash-command invocation, so the override should apply whenever the skill is active, regardless of who invoked it.
Actual
The frontmatter-to-session-config translation appears to run only in the slash-command dispatch path. The Skill tool path injects the skill body as a tool result without applying effort:.
Related issues (same pattern on sibling frontmatter fields)
- #45191 — skill frontmatter
model:ignored at runtime (closed as not planned / stale) - #17283 — Skill tool does not honor
context: fork/agent:frontmatter - #45714 —
context: forkignored for plugin skills
These share the same shape: frontmatter fields that require session-level reconfiguration are honored by the slash-command dispatch path but dropped by the Skill tool path.
Ask
Either apply skill frontmatter effort: (and ideally the sibling execution-control fields) on the Skill tool invocation path, or document explicitly that these fields only take effect on slash-command invocation.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗