Claude Code Guide

The complete guide to Claude Code setup (Opus 4.6, Sonnet 4.6, Haiku 4.5). 1M token context window. 100+ hours saved. 25 hook events. Agent teams and task management. Production-tested patterns for skills, hooks, and MCP integration.

View the Project on GitHub ytrofr/claude-code-guide

Claude Code 2.1.87-2.1.88 — New Features & Improvements

Released: March 2026

Overview

Claude Code 2.1.87-2.1.88 delivers flicker-free alt-screen rendering, a new PermissionDenied hook event, named subagent typeahead, and a large batch of high-impact bug fixes targeting prompt cache efficiency, nested CLAUDE.md re-injection, hook reliability, LSP stability, and memory leaks. Version 2.1.88 is a significant stability release with platform-specific fixes for Windows, macOS, and terminal emulators.


2.1.87: Cowork Dispatch Fix

Fixed messages in Cowork Dispatch not getting delivered. No configuration changes needed – this is an automatic fix for users of the Cowork feature.


Flicker-Free Alt-Screen Rendering (2.1.88)

A new environment variable eliminates terminal flickering during parallel tool calls and streaming output.

How it Works

export CLAUDE_CODE_NO_FLICKER=1

Setting this opts into alt-screen rendering with virtualized scrollback – the same rendering mode used by vim, less, and htop. The terminal switches to an alternate screen buffer where updates are drawn without visible flicker.

Tradeoff

Alt-screen content disappears from terminal scrollback on exit. When you quit Claude Code (or the session ends), the alternate screen buffer is discarded – you cannot scroll up to see prior output. This is standard alt-screen behavior, identical to exiting vim or less.

When to Use

Adding to Shell Profile

# ~/.bashrc or ~/.zshrc
export CLAUDE_CODE_NO_FLICKER=1

PermissionDenied Hook (2.1.88)

A new hook event that fires after auto mode classifier denials. This enables logging, custom retry logic, and observability for permission-denied actions.

Hook Configuration

{
  "hooks": {
    "PermissionDenied": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo \"[PermissionDenied] $(date -Iseconds)\" >> ~/.claude/logs/permission-denials.log",
            "async": true
          }
        ]
      }
    ]
  }
}

Return Values

Return Effect
{retry: true} Tells the model it can retry the denied action
No return / empty Default behavior – denial logged, no retry

Visibility Improvements

Auto mode denied commands now:

Use Cases


Named Subagents in @ Mention (2.1.88)

Named subagents now appear in @ mention typeahead suggestions. When you type @ in the input, running named agents appear as completion options alongside files and symbols.

This makes it easier to reference and interact with running agents without remembering exact names or switching context.


Nested CLAUDE.md Re-injection Fix (2.1.88) – HIGH IMPACT

Fixed nested CLAUDE.md files being re-injected dozens of times in long sessions that read many files.

The Problem

In setups with global (~/.claude/CLAUDE.md) and per-project (.claude/CLAUDE.md) files, each file read could trigger re-injection of nested CLAUDE.md content. Over a long session with many file reads, the same CLAUDE.md content would be injected 20-50+ times, silently consuming context window capacity.

Impact

Resolution

No action needed – this is an automatic fix. Long sessions with multi-level CLAUDE.md setups will see improved context efficiency immediately.


Prompt Cache Fix (2.1.88) – HIGH IMPACT

Fixed prompt cache misses in long sessions caused by tool schema bytes changing mid-session.

The Problem

When MCP servers, plugins, or deferred tools update their schema mid-session, the prompt cache key changed, invalidating cached prompts. This forced re-caching of the entire system prompt on every turn.

Impact

Resolution

No action needed – automatic fix. Sessions with complex tool configurations will see reduced API costs.


Hook if Compound Command Fix (2.1.88)

Fixed hooks if condition filtering not matching compound commands or commands with environment variable prefixes.

What Changed

Command Before (2.1.85-2.1.87) After (2.1.88)
ls && git push if: "Bash(git *)" did NOT match Matches correctly
FOO=bar git push if: "Bash(git *)" did NOT match Matches correctly
npm test && git commit if: "Bash(git *)" did NOT match Matches correctly

Behavior Change

Hooks with if conditions may now fire more frequently than before. This is correct behavior – the previous implementation was silently skipping legitimate matches. Review your hook scripts if they assume a lower invocation rate.


PreToolUse/PostToolUse Absolute file_path (2.1.88)

Fixed PreToolUse/PostToolUse hooks not providing file_path as an absolute path for Write, Edit, and Read tools.

Before

Hook scripts received file_path from tool_input JSON as a relative path (e.g., src/index.ts), requiring manual resolution.

After

file_path is always an absolute path (e.g., /home/user/project/src/index.ts). Hook scripts that parse file_path from the tool input JSON now work correctly without path resolution logic.


LSP Server Auto-Restart (2.1.88)

Fixed LSP server zombie state after crash. Previously, if a language server (e.g., typescript-lsp, pyright-lsp) crashed mid-session, it remained in a dead state until the entire Claude Code session was restarted.

Now the LSP server restarts automatically on the next request. This benefits all code intelligence plugins.


Memory Leak Fix (2.1.88)

Fixed memory leak where large JSON inputs were retained as LRU cache keys in long-running sessions.

Who Was Affected

Sessions with heavy hook usage that passes JSON via stdin. The JSON payloads (which can be large for tools like Edit with full file content) were kept as cache keys indefinitely, growing memory usage over time.

Resolution

Automatic fix. Long-running sessions with many hook invocations will maintain stable memory usage.


Additional Bug Fixes (2.1.88)

Stability Fixes

Data Integrity Fixes

UI Fixes


Platform-Specific Fixes (2.1.88)

Windows

macOS

Terminal Emulators


UI/UX Improvements (2.1.88)

Thinking Summaries Default Off

Thinking summaries are no longer generated by default. To restore them:

{
  "showThinkingSummaries": true
}

This reduces token usage for users who don’t need inline reasoning summaries.

Other UI Changes


Computer Use (2.1.85+ – macOS Only)

Claude Code gained built-in computer use via a computer-use MCP server. This provides screenshot-based desktop control – opening apps, clicking buttons, and typing text.

Requirements

Capabilities and Limitations

Action Via Computer Use
Open applications Yes
Click UI buttons Yes
Type text into fields Yes
Browser interaction View-only (no clicking links/buttons)
Terminal interaction Click-only (no typing commands)

Fallback Priority

Computer use is the last resort in the tool selection hierarchy:

MCP Tools > Bash > Chrome/Playwright > Computer Use

Claude falls back to computer use only when no better tool exists for the task.


Migration Checklist

  1. Add CLAUDE_CODE_NO_FLICKER=1 to your shell profile if terminal flickering is an issue (especially WSL2)
  2. Add PermissionDenied hook if you use auto mode – log denials for observability
  3. Check showThinkingSummaries – now OFF by default. Set true in settings if you want them back
  4. Verify hook behaviorif conditions now match compound commands, increasing hook invocations (this is correct behavior)
  5. Review /stats – now includes subagent/fork usage, historical data preserved across format changes
  6. No action needed for: nested CLAUDE.md fix, prompt cache fix, LSP auto-restart, memory leak fix (all automatic)

Previous: Chapter 65 – Cross-Project AI Knowledge Sharing Next: Chapter 67 – Claude Code Internal Architecture

Updated: 2026-03-31