Claude Code 2.1 dropped today. 109 CLI changes. The unofficial changelog thread calls it “we are so back.”

They’re not wrong. This release addresses documented pain points that have frustrated users for months.

Skills: From Ambient Magic to Explicit Control

The skills controllability problem was real: Claude decides when to activate skills using semantic reasoning. You can’t force-invoke them. You can’t prevent them. You’re managing context carefully, then Claude auto-loads 10k tokens of skill instructions you didn’t ask for.

2.1 doesn’t give you full explicit invocation, but it closes the gap significantly:

  • Skills now appear in the slash command menu by default. If you have a skill in .claude/skills/, it’s visible as a slash command. Explicit invocation exists now. Opt-out with user-invocable: false in frontmatter if you don’t want it.
  • Hot-reload is automatic. Create or modify a skill in ~/.claude/skills or .claude/skills and it’s immediately available. No restart needed. Iteration is instant.
  • Skills show progress while executing. You see tool uses as they happen. No more black-box token consumption.
  • context: fork in frontmatter. Run skills in isolated sub-agent contexts. Your main conversation doesn’t get polluted with skill execution details.
The hybrid pattern works now

Create skills for context selection, expose them as slash commands for explicit invocation. Claude can still auto-invoke if relevant, but you can force it with /my-skill when you need it.

What’s still missing: no --disable-skill flag to block a skill for a session. No invocation logging to see why Claude chose to activate something. But the visibility and control improvements are substantial.

Hooks: First-Class Everywhere

Hooks as guardrails provide deterministic enforcement that executes regardless of what Claude thinks it should do. Exit code 2 = blocked. No negotiation.

Hooks are now first-class citizens across the entire system:

  • Hooks in agent frontmatter. Define PreToolUse, PostToolUse, and Stop hooks scoped to an agent’s lifecycle.
  • Hooks in skill frontmatter. Same pattern, scoped to skill execution.
  • Hooks in slash command frontmatter. Your custom commands can now have their own guardrails.
  • once: true config. Run a hook exactly once, then it’s done. Useful for session initialization.
  • PreToolUse hooks can act as middleware. Return updatedInput with an “ask” permission decision. The hook modifies the input, Claude still asks for consent.

Hooks moved from “feature you configure” to “primitive you build with.” Skills, agents, commands - all support the same hook lifecycle.

— The key insight

This validates the argument that hooks solve the context selection problem skills alone couldn’t. Now they’re integrated at every level.

Plan Mode: Frictionless

Plan Mode is mandatory. It’s the foundation of the core loop. But entering it required permission approval, which felt like friction for a read-only mode.

2.1 removes that friction:

  • No permission prompt to enter plan mode. Just do it. Start planning without approval dialogs.
  • /plan command shortcut. Type /plan anywhere in your prompt to enable plan mode directly. No Shift+Tab dance required.

Small changes, big impact. The core loop gets faster. Enter plan mode, explore, approve, execute, repeat.

Subagents: Resilient

The Task tool spawns subagents for parallel exploration. But previously, if a subagent hit a permission denial, it would often give up. Frustrating when you’re trying to do legitimate research across a codebase.

Fixed:

  • Subagents continue after permission denial. Instead of failing, they try alternative approaches.
  • Subagents inherit the parent’s model by default. Accidental model mismatches gone.
  • Task(AgentName) syntax to disable specific agents. In settings.json or via --disallowedTools. Fine-grained control over what can spawn.

This matters for the 19-agent trap. The complexity wasn’t in coordination - it was in reliability. Subagents that give up at the first obstacle don’t scale. Subagents that adapt do.

MCP: Dynamic and Reliable

MCP context isolation was a known problem. Tool schemas loading at startup, eating context whether you used them or not.

The overhead remains, but MCP servers are now more dynamic and reliable:

  • list_changed notifications. MCP servers can now dynamically update their available tools, prompts, and resources without requiring reconnection. Add a tool mid-session, Claude sees it immediately.
  • OAuth token refresh actually works. Fixed the race condition where stale tokens were read from keychain during concurrent refresh attempts. Fixed the case where server reports token expired but local check disagreed.

The MCP experience is still heavier than it should be. But dynamic tool updates mean you don’t need to restart sessions when servers change. That’s meaningful for long-running work.

Long-Running Operations: Hands-Off Mode

Background tasks were fragile. They’d fail with “git repository not found” for repos with dots in their names. Output would overflow context. Completion was noisy.

2.1 addresses the reliability layer:

  • Unified Ctrl+B backgrounding. Press once, background both bash commands and agents simultaneously.
  • Context overflow protection. Background tasks producing large output get truncated to 30K chars with a file path reference. The full output is there, just not polluting your context.
  • Clean completion messages. No more raw output dumps. Background tasks complete with a bullet point notification.
  • Incremental output for async agents. The main thread gets visibility into what background agents are doing without waiting for completion.

Critical for autonomous loops. Multi-hour tasks need background operations that don’t fail silently or overwhelm context when they complete.

Self-Verification: Auto-Continue

Claude’s ability to verify its own work compounds everything else. Tests, type checkers, browser automation. But output limits would truncate responses mid-thought, requiring manual “continue” prompts.

Now verification is more autonomous:

  • Auto-continue on output limit. Claude automatically continues when response is cut off due to output token limit. No error messages, no manual intervention.
  • Real-time thinking in transcript mode. Ctrl+O shows thinking blocks as they happen, not just after completion.
Verification loops matter more

With auto-continue and resilient subagents, verification loops become more reliable. Claude can run tests, hit an issue, try another approach, and keep going. The human-in-the-loop is for direction, not for babysitting output limits.

What’s Still Missing

Not everything made the cut:

  • No explicit skill invocation flag. Can’t claude --skill=analysis to force a skill when semantic matching fails.
  • No --disable-skill flag. Can’t block a skill for a session when you know you don’t want it.
  • No invocation logging. Can’t see which skills Claude considered and why.
  • Conditional logic still limited. Can’t say “only use this skill after X tool fails” in declarative config.
The trajectory matters

Claude Code is absorbing the patterns that work. Skills + slash commands. Hooks in frontmatter. Frictionless plan mode. The direction is toward explicit control and deterministic enforcement.

What to Watch

Two things to track:

Hooks as the guardrails layer. Guardrails by default isn’t just philosophy anymore. With hooks in agent/skill/command frontmatter, enforcement can be built into every capability you ship. The question is whether teams adopt this pattern or continue relying on prompt-based rules.

Skills as hybrid capabilities. The slash command visibility means skills can be both auto-invoked (when Claude thinks they’re relevant) and explicitly invoked (when you know you need them). This hybrid model is exactly what users asked for. Whether it works in practice depends on how well Claude’s semantic matching handles the overlap.

Try It

claude update

If you’re on 2.0.x, upgrade. If you’ve been frustrated by skills controllability, hooks limitations, or plan mode friction - this release is for you.

The documented pain points? Most of them are addressed. Not perfectly. But substantially. Claude Code is becoming the tool it should be.

The best AI coding tool isn’t the smartest. It’s the one that gives you control when you need it and gets out of the way when you don’t.