Claude Code v2.1.290: WebFetch paging, scheduled tasks survive resume, web-search refill control#
Published by Alex Sorokoletov
Part of the Claude Code Version Tracker series. | Official Env Vars | Official Changelog
Claude Code v2.1.290 fixes WebFetch silently dropping page text past 100,000 characters: it now reports how much went unread and takes an offset to keep reading from there. Scheduled tasks set with /loop or reminders survive resume, compaction, and a move to the background, and a new CLAUDE_CODE_WEB_SEARCH_REFILLS_PER_HOUR sets how fast the web-search budget refills. It follows v2.1.289.
Large inputs stop breaking a turn#
WebFetch used to drop everything past 100,000 characters of a page without saying so.[1] It now states how much it left unread and accepts an offset, a character position in the page text, so a long page can be read in parts. Three other long-input failures are fixed in the same release: sessions with hundreds of images no longer get stuck on "Request rejected as unprocessable by the model", a response that nests lists or quotes thousands of levels deep no longer crashes with "Maximum call stack size exceeded", and conversation compaction no longer fails intermittently with a "null is not an object" error. When the API's output content filter stops a reply while Claude is still thinking, the request is retried once before the error is shown.
Scheduled tasks and session handles#
Scheduled tasks, meaning /loop with an interval and reminders, had two ways to go missing.[1] They stopped coming back on resume once the conversation had been compacted (the fix covers compactions made from this version on), and ones set in the foreground never fired after a ← or /background hand-off while recurring ones fired an extra run on every resume, respawn, or fork. Both are fixed. /rewind now lists a prompt that was sent while Claude was still working. claude attach <name> and claude logs <name> accept part of a session name in place of its id, and the sign-in approval page gains a Deny button that ends the pending sign-in so the waiting terminal stops within seconds.
New environment variables#
| Variable | What It Does |
|---|---|
CLAUDE_CODE_WEB_SEARCH_REFILLS_PER_HOUR | Sets how many web-search budget refills accrue per hour, overriding the value the feature gate serves. It accepts 0 to 3600 and defaults to 100 when unset; the per-session budget it refills defaults to 200 (CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION). Added in v2.1.290. |
CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS | Sets the minimum conversation size, in tokens, before idle compaction runs. The value is floored at 100,000 and defaults to 200,000 when unset. Idle compaction itself is controlled by a feature gate with off, log, and compact modes and fires at 90% of the threshold by default. Added in v2.1.290. |
CLAUDE_CODE_DISABLE_PROACTIVITY | Turns off the proactivity selector, a behavior gated by tengu_proactivity_selector and on by default. When set, the value is carried into relaunched and background sessions so they start with it off too. Added in v2.1.290. |
Permissions and plugin hooks#
A plugin's tool.check hook can now read a ceiling, the approval an organization requires for a tool, and an agentId that tells a subagent's permission check apart from the main session's; turn.step hooks gain serverToolUses, the tool calls the API ran itself.[1] claude plugin validate lists each hook registered at a gating site and whether it has a .catch (gatingHooks under --json). /status and doctor now warn when managed settings ignore user-configured sandbox allowRead paths or allowed domains, and when a managed settings file is a link to a file outside the managed folder. Several fixes close read paths that bypassed approval: an image read on macOS and Windows could return a file outside what was approved through a link swapped in mid-read, Read deny rules did not apply to image paths pasted or dragged into the prompt, and a deny or ask rule could miss a command or path whose name came from a variable set as a prefix on declare, typeset, export, or readonly.
What These Tell Us#
Much of this release hardens behavior on large inputs. WebFetch paging, image-heavy sessions, deeply nested replies, and compaction all previously failed in ways that ended or stalled a turn, and each now retries or degrades. Scheduled tasks became durable across the two transitions that dropped them, resume after compaction and a foreground-to-background hand-off.
The permission surface grew an organization-level ceiling on tool approval and new warnings when managed settings override a user's sandbox paths, alongside several fixes for reads that reached files outside what a rule approved.
Two of the build's new environment variables are absent from the release notes: CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS and CLAUDE_CODE_DISABLE_PROACTIVITY. New connection-status copy for cloud sessions working in a local folder also appears without a matching changelog line.
Sources#
- Claude Code Official Changelog, v2.1.290 release notes
This analysis is conducted for educational and research purposes under fair use principles. All trademarks and software referenced belong to their respective owners.
Related Versions#
- Claude Code v2.1.286: model-refusal fallback, permission-prompt counts, safer credential logs
- Claude Code v2.1.285: WebFetch off switch, provider allowlists, plugin configure
- Claude Code v2.1.284: Sonnet 5.5 and auto mode as the default
- Claude Code v2.1.283: exact model allowlists, model deny rules, and grouped gateway requests
- Claude Code v2.1.269: plugin eval reports and Bash command diffs
Previous Claude Code analysis: v2.1.289 (October 3, 2026)
All 64 Claude Code analyses: Claude Code Version Tracker · Official Claude Code changelog