Summary
On Claude Code 2.1.214 (native install, Windows 11, interactive CLI in Windows Terminal), the task tools (TaskCreate/TaskUpdate/TaskList/TaskGet) AND the TodoWrite fallback are both unavailable in interactive sessions when running on the newest models (observed on claude-fable-5). Neither appears in the main tool list, the deferred-tools list, nor via ToolSearch. The same binary in headless mode (claude -p) exposes TaskCreate normally.
Root cause appears to be the server-side experiment tengu_vellum_ash, evaluated live from Statsig at session startup, which hides both task-tracking tool families simultaneously.
Environment
- Claude Code 2.1.214 (also observed on 2.1.211/2.1.212), native install (
~/.local/bin/claude.exe)
- Windows 11 Pro 10.0.26200, Windows Terminal (interactive TTY, not VSCode)
- Model:
claude-fable-5
CLAUDE_CODE_ENABLE_TASKS unset, todoFeatureEnabled: true
Analysis (from the 2.1.214 binary)
The gating functions:
// task tools enabled-check
function VR(){if(Z.CLAUDE_CODE_ENABLE_TASKS===!1)return!1;return!0}
// experiment gate
function XJ(){try{let e=et("tengu_vellum_ash",[]);if(!Array.isArray(e)||e.length===0)return!1;
let t=_i();return e.some((r)=>r.length>0&&t.includes(r))}catch{return!1}}
Tool registrations:
TaskCreate (and siblings): isEnabled(){return VR()&&!XJ()}
TodoWrite: isEnabled(){return !VR()&&!XJ()}
When XJ() returns true (current model matches an entry in the experiment value), both families are disabled, leaving the session with no task/todo tracking tool at all. This seems unintended: whatever the experiment is meant to A/B, the fallback should presumably survive.
Evidence
- Interactive session on
claude-fable-5: no TaskCreate family, no TodoWrite, not even deferred (ToolSearch returns no match).
- Headless probe from the same machine/binary/model:
claude -p "list your Task/Todo tools" returns TaskCreate, TaskGet, TaskList, TaskOutput, TaskStop, TaskUpdate. Headless does not perform the live Statsig fetch, so it falls back to the local cache.
- Clearing the cached experiment values in
~/.claude.json (cachedGrowthBookFeatures.tengu_vellum_ash and cachedExperimentData.tengu_vellum_ash.value set to []) does NOT restore the tools in interactive sessions: the live fetch at startup overrides the cache.
- Setting
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 (with the cache cleared) restores the task tools immediately, config hot-reload included, no restart needed.
Workaround
// ~/.claude/settings.json
{ "env": { "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1" } }
plus clearing the cached tengu_vellum_ash values in ~/.claude.json. Downside: this also disables update checks and telemetry, which is a heavy hammer for getting a documented core feature back.
Expected behavior
Either of:
- The experiment should never disable both
TaskCreate family and TodoWrite at once (keep the fallback), or
CLAUDE_CODE_ENABLE_TASKS=1 should override the experiment gate (currently XJ() wins regardless of the env var).
Related
Summary
On Claude Code 2.1.214 (native install, Windows 11, interactive CLI in Windows Terminal), the task tools (
TaskCreate/TaskUpdate/TaskList/TaskGet) AND theTodoWritefallback are both unavailable in interactive sessions when running on the newest models (observed onclaude-fable-5). Neither appears in the main tool list, the deferred-tools list, nor viaToolSearch. The same binary in headless mode (claude -p) exposesTaskCreatenormally.Root cause appears to be the server-side experiment
tengu_vellum_ash, evaluated live from Statsig at session startup, which hides both task-tracking tool families simultaneously.Environment
~/.local/bin/claude.exe)claude-fable-5CLAUDE_CODE_ENABLE_TASKSunset,todoFeatureEnabled: trueAnalysis (from the 2.1.214 binary)
The gating functions:
Tool registrations:
TaskCreate(and siblings):isEnabled(){return VR()&&!XJ()}TodoWrite:isEnabled(){return !VR()&&!XJ()}When
XJ()returns true (current model matches an entry in the experiment value), both families are disabled, leaving the session with no task/todo tracking tool at all. This seems unintended: whatever the experiment is meant to A/B, the fallback should presumably survive.Evidence
claude-fable-5: noTaskCreatefamily, noTodoWrite, not even deferred (ToolSearchreturns no match).claude -p "list your Task/Todo tools"returnsTaskCreate, TaskGet, TaskList, TaskOutput, TaskStop, TaskUpdate. Headless does not perform the live Statsig fetch, so it falls back to the local cache.~/.claude.json(cachedGrowthBookFeatures.tengu_vellum_ashandcachedExperimentData.tengu_vellum_ash.valueset to[]) does NOT restore the tools in interactive sessions: the live fetch at startup overrides the cache.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1(with the cache cleared) restores the task tools immediately, config hot-reload included, no restart needed.Workaround
plus clearing the cached
tengu_vellum_ashvalues in~/.claude.json. Downside: this also disables update checks and telemetry, which is a heavy hammer for getting a documented core feature back.Expected behavior
Either of:
TaskCreatefamily andTodoWriteat once (keep the fallback), orCLAUDE_CODE_ENABLE_TASKS=1should override the experiment gate (currentlyXJ()wins regardless of the env var).Related