Tool Result Persistence #
What: Large tool outputs (>400KB) are now saved to disk instead of being truncated, allowing Claude to access the full data later.
How it works: When a tool produces output exceeding 400KB with ENABLE_TOOL_RESULT_SIZE_LIMIT enabled, the output is:
- Saved to
~/.claude/projects/<project>/tool-results/<tool>-<timestamp>/result.{txt|json} - A 2KB preview is shown inline
- Claude receives instructions on how to explore the full file
Example output:
<persisted-output>
Output too large (1.5 MB). Full output saved to: ~/.claude/projects/.../tool-results/Bash-1701234567890/result.txt
Preview (first 2.0 KB):
[preview content...]
...
You can explore this file using:
- Read tool to view portions of the file
- Grep tool to search for patterns
- Bash with jq to query JSON data
- Bash with head/tail for beginning/end
</persisted-output>
Details:
- Automatically detects JSON output and creates
.json files with jq usage examples - Tool result files are automatically granted read permission (no prompts needed)
- Falls back to truncation if file writing fails
- Evidence:
$_2() at line 403698, if5() at line 403760, nf5() at line 403783
Custom Session Environment File #
What: New CLAUDE_ENV_FILE environment variable allows loading custom session environment scripts.
How to use:
export CLAUDE_ENV_FILE=/path/to/my-env-setup.sh
claude
Details:
- Scripts from
CLAUDE_ENV_FILE are loaded before hook files from session-env directory - Multiple sources can be combined (env file + hooks)
- Independent error handling - failures in one source don't prevent loading others
- Useful for personal environment configuration that doesn't belong in hooks
- Evidence:
kqB() at line 232402, environment read at line 232407
Bubblewrap Sandbox Detection #
What: New detection capability for when Claude Code is running inside a Bubblewrap sandbox on Linux.
How it works:
- Checks
process.platform === "linux" AND process.env.CLAUDE_CODE_BUBBLEWRAP === "1" - Infrastructure for future sandbox-aware behavior
Details:
- Currently unused in application code (preparation for future features)
- Part of environment detection module
- Evidence:
OV6() at line 228083
What: Debug logging now uses intelligent buffering instead of direct filesystem writes.
Details:
- Accumulates log entries in memory (up to 100 entries)
- Flushes every 1000ms or when buffer is full
- Reduces filesystem I/O by 10-100x when debug logging is enabled
- Automatic immediate mode when using
--debug flags (for real-time debugging) - Graceful disposal ensures logs are flushed on exit
- Evidence:
QC0() at line 2348, nw9() at line 2404
Startup Profiling Reports Saved to Files #
What: When startup profiling is enabled, reports are now saved to persistent files for later analysis.
How to use:
export CLAUDE_CODE_PROFILE_STARTUP=1
claude <command>
# Report saved to: ~/.claude/startup-perf/<timestamp>.txt
Details:
- Previously only logged to console (ephemeral)
- Now saves to
~/.claude/startup-perf/<timestamp>.txt - Directory created automatically if missing
- Still logs to console in addition to file
- Evidence:
WV9() at line 507095, cP3() at line 507106
Consolidated Permission Checks for Special Files #
What: Permission checks for session files (bash outputs, session memory, plan files, tool results) are now centralized.
Details:
- New
FP3() helper function consolidates all special file permission logic - Tool result files automatically granted read permission (new)
- Cleaner codebase with less duplication
- Evidence:
FP3() at line 506192
Wildcard Tool Permission Rules #
What: Added support for parsing wildcard tool permission rules like ToolName:*.
Details:
- New
Wt8() function parses wildcard patterns in permission rules - New
Mq() function parses tool names with optional rule content in format toolName(ruleContent) - Enhanced permission system flexibility
- Evidence:
Wt8() at line 190167, Mq() at line 502273
Progress Indicator Architecture Refactored #
What: The ConEmu/Ghostty progress reporting system was refactored from an independent side-channel to an integrated render pipeline.
Details:
- Removed:
O81 class (ConEmu progress reporter), T1A class (progress manager), LOA global instance - Added:
ink-progress DOM elements, sGB() progress extraction from DOM - Progress now updates synchronously with UI renders
- Same ANSI escape sequences generated, but through render pipeline
- Evidence: Removed classes at lines 403283-403407 (v2.0.51), new functions at lines 218873, 220775
Growthbook Experiment Tracking #
What: Added telemetry for A/B test experiment exposure tracking.
Details:
- Tracks which users are exposed to which experiment variations
- Events include: experiment ID, variation ID, device ID, user attributes
- Batched transmission via OpenTelemetry log pipeline
- Internal analytics only - no user-visible impact
- Evidence:
rNB() at line 231011, tNB() at line 231925, aNB() at line 230979
Enhanced GitHub Actions Telemetry #
What: When running in GitHub Actions, Claude Code now collects additional metadata.
Details:
- New fields collected: actor, actor ID, repository, repository ID, owner, owner ID
- Sent via
github_actions_metadata telemetry field - Only when
GITHUB_ACTIONS=true environment variable is set - Evidence: Metadata collection at lines 228565-228573, telemetry at line 231700
Remote Session ID Tracking #
What: New CLAUDE_CODE_REMOTE_SESSION_ID environment variable for tracking remote sessions.
Details:
- Read from environment and included in telemetry
- Sent as HTTP header
x-claude-remote-session-id in API requests - Enables correlation of events across remote Claude Code sessions
- Evidence: Environment read at line 231577, telemetry at line 231676, header at line 301327
Optimized Hook Count Tracking #
What: Refactored how hook progress and resolution counts are tracked during tool execution.
Details:
- New
J29() function pre-computes hook tracking maps W29() and F29() provide efficient lookup of sibling tool IDs and pending hooks- Improves performance during parallel tool execution
- Evidence:
J29() at line 503835, W29() at line 503879, F29() at line 503889