[BUG] Skill tool broken in headless (`claude -p`) mode since v2.1.141 — returns is_error, skill body never loaded
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Since v2.1.141, the Skill tool no longer works in headless / print mode (claude -p). When a skill is invoked, the Skill tool call returns is_error: true and the skill body is never loaded into context — the tool result content is just the literal label Execute skill: <name>.
The exact same invocation works correctly in v2.1.140 and earlier. There the result is is_error: null with content Launching skill: <name> and the skill instructions are loaded as expected.
The skill itself is correctly registered — it appears in the session-init skills list and in slash_commands, the Skill tool is present in tools, and (for plugin skills) the plugin shows as connected. Nothing about discovery is broken; only execution in -p mode fails.
Interactive (TUI) skill invocation is unaffected. This is specific to non-interactive -p / --print runs, which is what breaks CI and orchestration workflows that depend on skills.
What Should Happen?
Invoking the Skill tool in claude -p should execute the skill and load its instructions into context — identical to interactive mode and identical to the behavior in v2.1.140 and earlier. The tool result should be is_error: null / Launching skill: <name>.
Error Messages/Logs
# Skill tool result in the stream-json output (v2.1.141, 2.1.142, 2.1.143):
{"type":"tool_result","is_error":true,"content":"Execute skill: figma:figma-use","tool_use_id":"toolu_..."}
# The model then gives up on the skill:
"The figma:figma-use skill failed to load."
# Same call on v2.1.140 and v2.1.139 (working):
{"type":"tool_result","is_error":null,"content":"Launching skill: figma:figma-use","tool_use_id":"toolu_..."}
Steps to Reproduce
- Install/enable a plugin that ships a skill. I used the official
figmaplugin (v2.1.30), which provides thefigma:figma-useskill. (A non-plugin user/project skill reproduces it just as well.)
- Run a headless invocation that asks the model to call the
Skilltool:
``bash``
claude -p 'Use the Skill tool to invoke the skill named "figma:figma-use" as your very first action, then report whether it succeeded.' \
--output-format stream-json --verbose \
--max-turns 4 --permission-mode acceptEdits \
--setting-sources project,local \
--model claude-haiku-4-5-20251001
- Inspect the
Skilltool result in the stream-json output.
- v2.1.140 and earlier:
is_error: null, contentLaunching skill: figma:figma-use, skill body loaded. ✅ - v2.1.141, 2.1.142, 2.1.143:
is_error: true, contentExecute skill: figma:figma-use, skill body never loaded. ❌
I bisected every build between the last-good and current version with this identical repro:
| Version | Skill in claude -p | Result |
| --- | --- | --- |
| 2.1.139 | ✅ works | is_error: null — Launching skill: figma:figma-use |
| 2.1.140 | ✅ works | is_error: null — Launching skill: figma:figma-use |
| 2.1.141 | ❌ broken | is_error: true — Execute skill: figma:figma-use |
| 2.1.142 | ❌ broken | is_error: true — Execute skill: figma:figma-use |
| 2.1.143 | ❌ broken | is_error: true — Execute skill: figma:figma-use |
Last good: 2.1.140. First bad: 2.1.141.
Claude Model
Not sure / Multiple models
Is this a regression?
Yes, this worked in a previous version
Last Working Version
2.1.140
Claude Code Version
2.1.143 (Claude Code)
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Non-interactive/CI environment
Additional Information
- Model-independent. Reproduced with both Opus and Haiku — this is a harness / tool-execution-layer issue, not a model behavior issue.
- Likely the same root cause as #59105. The 2.1.140 → 2.1.141 boundary lines up exactly with v2.1.141 reclassifying non-TTY
claude -pruns assdk-cliand diverging them from the interactive request scaffold. This report is a concrete, user-visible symptom of that change. - Related (not duplicate): #58535 reports forked-skill dispatch breaking around v2.1.139–2.1.140 in the VS Code extension. That is a different surface (VS Code extension vs. CLI
-p) and a different failure mode (Agent()-spawned subagent loses skill context vs. theSkilltool returningis_error), but it appears to be part of the same cluster of skill regressions in the v2.1.139–2.1.143 range. - Impact. Any headless / CI / multi-agent-orchestration workflow that relies on skills silently degrades on 2.1.141+: the agent receives an error instead of the skill and proceeds without the guidance the skill was meant to inject. In my case, ~95 successful headless skill invocations across v2.1.112 → v2.1.139 all broke at once after upgrading to 2.1.143.
4 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
Thanks for the triage — but this is not a duplicate of any of the three linked issues. They describe a different failure at a different layer.
#36570, #32184, and #44756 are all about skill auto-triggering / recall — the model not deciding to invoke a skill from its description in headless mode (
trigger_rate: 0, "recall 0%"). #44756 in particular explicitly states thatclaude -p "/my-skill"does execute the skill correctly — its actual bug is--printvs-pflag confusion.This report is the opposite layer: the model does explicitly invoke the
Skilltool, and the tool call itself fails — it returnsis_error: truewith the bodyExecute skill: <name>, and the skill is never loaded. That's a tool-execution failure, not a triggering/recall failure.Two things that further distinguish it:
is_error: null/Launching skill: <name>); v2.1.141, 2.1.142, and 2.1.143 all fail. The three linked issues are from March/early-April (v2.1.80-era) and aren't framed as a 2.1.141 regression — #44756 actually documentsclaude -pskills working at that time, consistent with the break landing later.Skilltool call, so skill-description quality (the subject of #36570 and #32184) is irrelevant to it.Please keep this open. Happy to attach stream-json captures from a passing (2.1.140) and failing (2.1.143) run if that helps.
This issue was fixed as of version 2.1.144.
This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.