Task tools AND TodoWrite both hidden in interactive sessions by live tengu_vellum_ash experiment (newest models); env override ineffective
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_TASKSunset,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: noTaskCreatefamily, noTodoWrite, not even deferred (ToolSearchreturns no match). - Headless probe from the same machine/binary/model:
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. - Clearing the cached experiment values in
~/.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. - 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
TaskCreatefamily andTodoWriteat once (keep the fallback), or CLAUDE_CODE_ENABLE_TASKS=1should override the experiment gate (currentlyXJ()wins regardless of the env var).
Related
- #23816 (task tools referenced but absent at runtime)
- #23874 (task tools disabled in VSCode via isTTY)
This issue has 7 comments on GitHub. Read the full discussion on GitHub ↗