Claude Code v2.1.123 — Background Daemons, Agent Fleets, and CoWork Memory#
Published on April 29, 2026
Part of the Claude Code Version Tracker series. | Official Env Vars | Official Changelog
Claude Code moved from v2.1.118 to v2.1.123 across five releases[1]. The daily-use improvements are substantial on their own: /config settings finally survive restarts, alwaysLoad eliminates per-session MCP tool search, PostToolUse hooks can rewrite output from any tool, and /resume can find a session by pasting in the PR URL it created. The deeper architectural signal is in the env var set: a background daemon has graduated from a single flag to a fully specified IPC contract, and two new abstractions — a named agent fleet layer and inter-agent CoWork memory — move from theoretical to instrumented.
What Changed#
| Metric | v2.1.118 | v2.1.123 |
|---|---|---|
| Environment variables | 260 | 290+ |
| Model IDs | 17 | 17 |
| Feature gates | — | — |
| Dynamic configs | — | — |
| Slash commands | 25 | 25 |
What's New for Daily Users#
/config settings now persist — finally#
Before v2.1.119, changing your theme, editor mode, or verbosity via /config was session-local. Restart Claude Code and you were back to defaults. v2.1.119 fixed this: /config writes to ~/.claude/settings.json and participates in the same project/local/policy precedence as every other setting. Your theme choice sticks. Your editor mode sticks. The setting also added a new prUrlTemplate key for teams on GitLab or internal code-review tools who want the PR badge in the footer to point somewhere other than github.com.
alwaysLoad makes MCP servers instant#
v2.1.121 added alwaysLoad: true to MCP server config. By default, Claude Code defers loading tools from MCP servers until tool-search decides they're relevant — reducing startup cost for sessions that don't need them. The downside: in sessions where you know you'll use a server, there's latency on the first invocation while tool-search runs. Set alwaysLoad: true on the servers you always reach for and their tools are immediately available with zero deferral. This belongs in your ~/.claude/settings.json for any MCP server you use daily.
PostToolUse hooks can now replace tool output for every tool#
Previously hookSpecificOutput.updatedToolOutput only worked for MCP tools. v2.1.121 extends it to all tools — including Bash, Read, Edit, and Write. You can now have a PostToolUse hook intercept any tool result and replace what Claude sees before it processes the output. Practical applications: normalize newlines from Bash output before they hit context, inject structured metadata after a file read, or suppress noisy log sections that waste tokens. Combined with v2.1.119's addition of duration_ms to PostToolUse inputs, hooks can now measure and reshape any tool result in the pipeline.
/resume finds sessions by PR URL#
v2.1.122 added PR URL lookup to the /resume search box. Paste a GitHub, GitHub Enterprise, GitLab, or Bitbucket pull-request URL and /resume finds the Claude Code session that created it. For engineers who open PRs with Claude and then come back to them days later for review or fixup, this eliminates the "which session was this?" problem. The feature works because sessions now carry structured metadata linking them to the PRs they opened — which is exactly what the new CLAUDE_CODE_SESSION_LOG env var surfaces to subprocesses.
claude ultrareview is now a first-class CLI subcommand#
v2.1.120 promoted /ultrareview from an interactive-only slash command to a scriptable CLI subcommand: claude ultrareview [target]. It prints findings to stdout, exits 0 on clean and 1 on failure, and accepts --json for machine-readable output. No target defaults to the current branch; pass a PR number or URL for a specific review. This means you can gate a CI step on claude ultrareview --json | jq '.critical > 0' or run it from a pre-push hook without opening an interactive session.
Default effort raised to high for Pro and Max#
v2.1.117 changed the default effort level for Pro and Max subscribers on Opus 4.6 and Sonnet 4.6 from medium to high. If you're on either of those plans and haven't tuned effort manually, you're getting more compute per request than you were before, at no explicit cost increase. The same release also fixed Opus 4.7 sessions computing against a 200K context window instead of its native 1M, which was causing autocompaction to fire far too early on long sessions.
Memory leaks squashed#
v2.1.121 fixed three significant memory leaks that affected power users: multi-GB RSS growth when processing many images in a session, roughly 2GB of leaked memory when /usage loaded large transcript histories, and unbounded growth from long-running tools that failed to emit progress events. If you've been restarting Claude Code sessions because they get sluggish over time, v2.1.121 is the release that addressed it.
Windows no longer requires Git Bash#
v2.1.120 removed Git for Windows (Git Bash) as a requirement on Windows. When Git Bash isn't installed, Claude Code now uses PowerShell as the shell tool instead. Combined with v2.1.119's PowerShell tool commands becoming auto-approvable in permission mode (matching Bash behavior), Windows is now a peer platform for Claude Code usage rather than a second-class install.
Other quality-of-life wins#
--from-praccepts GitLab MR, Bitbucket PR, and GitHub Enterprise URLs (v2.1.119) — not just github.com anymore- Vim visual mode (
vandVwith operators and selection feedback) in v2.1.118 /usagereplaces/costand/stats(v2.1.118) — both aliases still work- Custom themes from
/theme, hand-editable JSON in~/.claude/themes/, shippable via plugins (v2.1.118) ${CLAUDE_EFFORT}in skill content (v2.1.120) — skills can adapt their behavior based on the current effort level/resumeup to 67% faster on sessions over 40MB (v2.1.116)/powerupinteractive feature tutorials with animated demos (v2.1.115)ANTHROPIC_BEDROCK_SERVICE_TIER(v2.1.122) — selects default, flex, or priority tier for Bedrock requests- Hooks can invoke MCP tools directly via
type: "mcp_tool"(v2.1.118) - MCP servers now auto-retry 3× on transient startup errors (v2.1.121) instead of staying disconnected
The Background Daemon — What It Actually Is#
The v2.1.114 analysis flagged CLAUDE_BG_BACKEND=daemon as "first evidence of a long-running daemon." Several of this release's new env vars fill in its complete IPC contract. It is worth explaining what this architecture is before cataloguing the variables.
Claude Code historically worked as a purely foreground process: the terminal session was the process, and closing the terminal ended the work. That model breaks for anything you want to run autonomously while you're not watching — overnight CI, long research tasks, scheduled routines, or background agent work triggered from your phone via Remote Control. The solution is a local daemon process that starts independently, waits on a socket (CLAUDE_BG_RENDEZVOUS_SOCK), and accepts work from any Claude Code surface that knows the socket path. The foreground session — whether a terminal, VS Code extension, or Remote Control client — connects to the daemon rather than spawning a new agent process. The daemon can outlive the connecting session, records the full PTY stream (CLAUDE_PTY_RECORD) for audit, tags each job with its originating source (CLAUDE_BG_SOURCE), and tracks whether it started cold or resumed warm (CLAUDE_CODE_DAEMON_COLD_START).
This is not a cloud service — it is a local persistent process running on your machine under your credentials. The CLAUDE_BRIDGE_REATTACH_* variables describe the reconnection protocol when a session bridge drops and reconnects: CLAUDE_BRIDGE_REATTACH_SESSION presents the session identity and CLAUDE_BRIDGE_REATTACH_SEQ presents the sequence number, so the daemon can replay any events the client missed since that point. Sequence-numbered replay is standard at-least-once delivery semantics — the same pattern used in Kafka consumer offsets or Postgres WAL streaming. v2.1.122 fixed "Remote Control sessions archived on transient CCR blips during JWT refresh," which is exactly the failure mode these variables address: the bridge reconnects, presents its sequence, and the daemon resumes without losing state.
The fleet layer (CLAUDE_CODE_DISABLE_AGENTS_FLEET, CLAUDE_AGENTS_SELECT, CLAUDE_AGENTS_AUTO_RELAUNCHED_AT) sits above the daemon: it manages which named agents are running, restarts crashed ones, and records when a relaunch happened so downstream consumers can detect state that predates it. CLAUDE_CODE_FORK_SUBAGENT=1 (confirmed in the changelog for v2.1.117 and extended to non-interactive SDK sessions in v2.1.121) makes each subagent a separate forked process rather than an in-process coroutine — true process isolation with independent resource limits.
CoWork memory (CLAUDE_COWORK_MEMORY_GUIDELINES, CLAUDE_COWORK_MEMORY_INDEX_CONTENT) is the inter-agent coordination primitive sitting above all of this. It is distinct from user memory (~/.claude/) and project memory (CLAUDE.md): multiple agents in a fleet read the same guidelines when deciding how to write to shared memory, and the index carries structured summaries agents use to find relevant prior work without replaying raw transcripts. This is the retrieval half of a lightweight inter-agent RAG layer — the first Claude Code abstraction that only makes sense when more than one agent is running.
New Environment Variables#
| Variable | Likely Purpose |
|---|---|
CLAUDE_BG_RENDEZVOUS_SOCK | Socket path for the IPC channel between a foreground Claude session and the background daemon. The daemon starts independently and listens; the foreground session connects rather than spawning. The daemon survives terminal disconnects and can accept connections from any surface — CLI, VS Code extension, Remote Control. |
CLAUDE_BG_ISOLATION | Isolation mode for background agent processes — controls how separated the daemon's process space is from the foreground session. Values likely span a native-to-sandboxed spectrum, letting enterprise deployments enforce stricter boundaries than personal setups. |
CLAUDE_BG_SOURCE | Tags where a background job originated: CLI, SDK, Remote Control, another agent. Present on the daemon side so it can route, prioritize, or attribute work without the originator being alive when the job finishes. |
CLAUDE_JOB_DIR | Working directory for a background job, independent of the daemon's own cwd. Background jobs may target a different directory than the session that spawned them — this variable pins job context so the daemon doesn't inherit a stale path from the socket connection. |
CLAUDE_CODE_DAEMON_COLD_START | Set when the daemon starts from a completely cold state rather than resuming warm. Lets the daemon emit different startup telemetry and skip cache-warm assumptions. Pairs with the v2.1.116 faster-startup work. |
CLAUDE_PTY_RECORD | Enables PTY session recording for a background agent — captures the raw terminal byte stream as a bit-for-bit replay artifact, not just a transcript. Likely used for enterprise audit logging and for debugging non-interactive session failures where a transcript alone loses context. |
CLAUDE_CODE_SESSION_ID | Stable identifier for the current session, passed into subprocess environments. Lets subprocess tools — hooks, MCP servers, custom scripts — correlate their work back to the originating session without parsing log files. Backs v2.1.122's PR-URL→session lookup feature. |
CLAUDE_CODE_SESSION_KIND | Classifies the session: interactive, SDK/headless, subagent, background, or Remote Control. Hooks can branch on kind — a hook that opens a browser link makes sense in interactive sessions but not in CI headless runs. |
CLAUDE_CODE_SESSION_LOG | Path to the session's transcript file, surfaced to subprocesses. Lets hooks and post-processing scripts find the transcript without traversing ~/.claude/ or parsing CLI flags. |
CLAUDE_CODE_SESSION_NAME | Human-readable session name backing the v2.1.121 terminal tab title feature. Hooks and status-line integrations can read it without querying the CLI. |
CLAUDE_BRIDGE_REATTACH_SEQ | Sequence number for the bridge reconnection protocol. At-least-once delivery semantics: the daemon replays events the bridge missed since this sequence point. Addresses v2.1.122's fix for "Remote Control sessions archived on transient CCR blips." |
CLAUDE_BRIDGE_REATTACH_SESSION | Session identity used during bridge reconnection. Pairs with CLAUDE_BRIDGE_REATTACH_SEQ — the bridge presents both to resume exactly where it disconnected. |
CLAUDE_AGENT | Short-form identifier for the current agent, used in inter-agent messaging and log attribution. |
CLAUDE_CODE_AGENT | Full agent descriptor passed into a spawned agent process — likely the agent's frontmatter (tools, allowed/disallowed lists, system prompt path) so the child can reconstruct its runtime without re-reading disk. |
CLAUDE_AGENTS_SELECT | Selects which agents from a fleet configuration are active for this session or job. Analogous to a feature flag for agents: target a specific agent variant without changing the fleet-wide configuration. |
CLAUDE_AGENTS_AUTO_RELAUNCHED_AT | Timestamp set when the agent fleet was automatically relaunched after a crash. Downstream consumers can detect state that predates the relaunch and invalidate stale caches accordingly. |
CLAUDE_CODE_DISABLE_AGENTS_FLEET | Kill switch for the entire agent fleet subsystem — no selection, no auto-relaunch, no fleet coordination. Its existence implies the fleet is on by default for some plan tiers. |
CLAUDE_CODE_FORK_SUBAGENT | Changelog-confirmed[1]: set to 1 to run subagents as forked processes (v2.1.117 on external builds, v2.1.121 extended to non-interactive SDK/-p sessions). Forked subagents get true process isolation and independent resource limits instead of in-process coroutines. |
CLAUDE_COWORK_MEMORY_GUIDELINES | Policy document for the CoWork shared memory system — a new abstraction distinct from user memory (~/.claude/) and project memory (CLAUDE.md). Multiple agents in a fleet read the same guidelines when deciding how to write to shared memory, preventing agent writes from polluting user-visible context. |
CLAUDE_COWORK_MEMORY_INDEX_CONTENT | Content of the CoWork memory index. Where guidelines set policy, this carries structured summaries agents use to find relevant prior work without replaying full transcripts — the retrieval side of a lightweight inter-agent RAG layer. |
CLAUDE_CODE_HTTP_PROXY | Claude-namespaced HTTP proxy URL. Claude-namespacing avoids collisions with system HTTP_PROXY for other tools in the shell that should use a different proxy. Completes the proxy surface started in v2.1.104 (OS CA trust) and v2.1.114 (proxy auth helper). |
CLAUDE_CODE_HTTPS_PROXY | Claude-namespaced HTTPS proxy URL. See CLAUDE_CODE_HTTP_PROXY above. |
CLAUDE_CODE_SUBSCRIPTION_TYPE | Current subscription plan identifier. Lets the process branch on tier without an API call — used by v2.1.118's unified /usage to render plan-specific limits and by v2.1.117's default-effort change that applies only to Pro/Max subscribers. |
CLAUDE_CODE_RATE_LIMIT_TIER | Rate-limit bucket for the current session, independent of subscription type. Enterprise customers may have custom limits that differ from their plan defaults — this lets the /usage display render accurate numbers instead of guessing from plan name alone. |
CLAUDE_CODE_RETRY_WATCHDOG | Tunes the retry watchdog that detects API calls silently looping without progress. v2.1.123 fixed an OAuth 401 retry loop when CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 — this variable configures the watchdog's timeout and backoff. |
CLAUDE_CODE_VERIFY_PROMPT | Enables client-side prompt verification before sending to the API — likely a content-policy pre-screen that checks against policy rules before the request leaves the client. Distinct from server-side filtering. |
CLAUDE_CODE_CLASSIFIER_SUMMARY | Carries the output of a prompt classifier as a structured summary. Where CLAUDE_CODE_VERIFY_PROMPT triggers classification, this variable holds the result so downstream hooks and audit logs can read it without re-running the classifier. |
CLAUDE_CODE_INVESTIGATE_FIRST | Instructs the agent to read and investigate before acting — enforcing "read before write." Converts an agent that might immediately start editing into one that first gathers context. Likely injected as a meta-instruction into the system prompt. |
CLAUDE_INTERNAL_FC_OVERRIDES | Internal overrides for function-call (tool-use) behavior. Injects overrides that bypass normal routing — for testing new tool schemas or shadowing production tool behavior in staging. |
CLAUDE_CODE_HIDE_CWD | Changelog-confirmed[1] (v2.1.119): hides the working directory display in the startup logo. Useful for shared terminals, screen shares, or documentation screenshots where the cwd reveals sensitive path structure. |
What These Tell Us#
The background daemon is now fully specified. The v2.1.114 analysis saw CLAUDE_BG_BACKEND=daemon in isolation. This release fills in the complete contract: rendezvous socket, process isolation boundary, job attribution, job directory, cold-start telemetry, PTY recording, and a sequence-numbered reconnection protocol for bridge clients. The architecture is a local persistent agent runtime — not a cloud service, not a subprocess, a long-lived process that accepts connections from any Claude Code surface and survives terminal closes. Expect user-facing documentation to appear once the feature ships publicly; the env vars are ahead of the docs as usual.
Sessions are now first-class addressable objects. SESSION_ID, SESSION_KIND, SESSION_LOG, and SESSION_NAME expose session metadata to every subprocess, hook, and MCP server in the environment. Combined with bridge reattach sequencing and v2.1.122's PR-URL→session lookup, sessions can be referenced, resumed, and correlated across tool boundaries without parsing internal files. This is the plumbing behind "find the session that created this PR" — and it is the same plumbing that will make background agents resumable from mobile.
An agent fleet is taking shape and it has a kill switch. DISABLE_AGENTS_FLEET + AGENTS_SELECT + AGENTS_AUTO_RELAUNCHED_AT + FORK_SUBAGENT describe a fleet management layer with selection, auto-recovery, and a global disable. A kill switch implies the fleet is already on by default for some tiers. CoWork memory is the first coordination primitive that only makes sense in a multi-agent context: a shared RAG layer with policy guidelines where multiple agents write structured summaries that others retrieve without replaying full transcripts.
Sources#
- Claude Code Official Changelog — v2.1.119 through v2.1.123 release notes
This analysis is conducted for independent security research and interoperability purposes under fair use principles. All trademarks belong to their respective owners. The information presented here documents publicly observable behavior of installed software and is not intended to circumvent any technological protection measures, infringe on intellectual property rights, or encourage unauthorized use. Use these findings at your own discretion.
Related Versions#
- Claude Code v2.1.118 — Forked subagents ship, subscription tiering takes shape
- Claude Code v2.1.114 — Native binary launcher,
/fewer-permission-prompts, Agent Teams - Claude Code v2.1.107 — Worktrees, away mode, stream resilience
- Claude Code v2.1.104 — Enterprise TLS and SDK OAuth
- Claude Code v2.1.100 — Context token limits, Perforce VCS, script caps
Related: Context Window Management Guide | Claude Code Productivity Tips | The Agentic Engineering Playbook