[BUG] TaskCreate and TodoWrite both disabled on Opus 4.8 / Sonnet 5 / Fable 5 by a server-side model gate — no fallback, no local override
Summary
On Claude Code v2.1.218 in the terminal CLI, TaskCreate / TaskGet / TaskList / TaskUpdate and TodoWrite are all unavailable — not in the main session, not to spawned agents, and not discoverable via ToolSearch.
The cause is a server-side remote-config gate keyed on the model id. tengu_vellum_ash currently holds ["claude-opus-4-8", "claude-sonnet-5", "claude-fable-5"], and the match is a substring test, so every session on the three newest models loses task tracking entirely.
This is distinct from #23816 and #23874 (both closed, v2.1.34, VSCode, isTTY). The isTTY branch those reported is gone from the current gate; this is a different and additional mechanism, and unlike the old one it disables the TodoWrite fallback too.
Reproduction
- Run the terminal CLI (a real TTY — this is not the VSCode/pipe case) on v2.1.218.
- Select any of
claude-opus-4-8,claude-sonnet-5,claude-fable-5. - Ask the model to create a task list, or have it call
ToolSearchwithselect:TaskCreate,TaskUpdate.
Observed:
ToolSearch("select:TaskCreate,TaskUpdate") -> No matching deferred tools found
ToolSearch("select:TodoWrite") -> No matching deferred tools found
Expected: the task tools are registered with shouldDefer: true, so ToolSearch should resolve them.
Root cause
Both tools are registered with an isEnabled predicate sharing one clause:
// TaskCreate
isEnabled(){ return KL() && !qee() }
// TodoWrite
isEnabled(){ return !KL() && !qee() }
KL() selects which subsystem is active (Task tools vs legacy TodoWrite):
function KL(){ if (env.CLAUDE_CODE_ENABLE_TASKS === false) return false; return true }
qee() disables both:
function qee(){
try {
let e = Xe("tengu_vellum_ash", []); // server-side remote config
if (!Array.isArray(e) || e.length === 0) return false;
let t = Ni(); // current model id
return e.some(r => r.length > 0 && t.includes(r)); // substring match
} catch { return false }
}
Observed live value (from the local config cache, 2026-07-23):
"tengu_vellum_ash": ["claude-opus-4-8", "claude-sonnet-5", "claude-fable-5"]
Because the test is t.includes(r), context variants match too — claude-opus-4-8[1m] matches claude-opus-4-8.
Why this is worth reporting
- No fallback.
KL()only chooses between two subsystems;qee()takes out both. Progress-list tracking is not degraded to the legacy path — it is absent. That is a capability regression, not a migration. - No local override.
CLAUDE_CODE_ENABLE_TASKSis one-way: it can only forceKL()false. Nothing can overrideqee(). Users cannot restore the feature except by moving to an older model. - Silent and undocumented. No changelog entry through v2.1.218 mentions it — the changelog still lists improvements to
TaskCreate. The Todo Lists docs present the Task tools as the default since v2.1.142 with no model-availability caveat. - It breaks published guidance. The
TeamCreate/agent-teams workflow and the SDK migration guide both instruct callers to useTaskCreate/TaskUpdate. Any prompt, skill, or SDK integration that mandates a task list now fails on the default models, with no diagnostic — the tool is simply not in the list. - Remote config means it can change with no release. The
tengu_vellum_ashgate is present in every build I have back to v2.1.207, so a version diff does not explain when or why the behavior changed. That makes it very hard to self-diagnose — the tools worked recently on this same machine.
Environment
- Claude Code 2.1.218 (native install,
~/.local/share/claude/versions/2.1.218) - Terminal CLI, real TTY — not the VSCode extension
- Linux 6.17.0-35-generic
- Model:
claude-opus-4-8[1m] CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1CLAUDE_CODE_ENABLE_TASKSunset- No
disabledTools/deny rules for these tools in user, project, or local settings
Verified the names are unchanged and present in every installed build (2.1.207 → 2.1.218), so this is not a rename or removal:
| Version | TaskCreate | TaskUpdate | TodoWrite |
|---|---|---|---|
| 2.1.207 | 33 | 24 | 13 |
| 2.1.211 | 34 | 24 | 13 |
| 2.1.215 | 31 | 24 | 13 |
| 2.1.216 | 30 | 24 | 13 |
| 2.1.217 | 30 | 24 | 13 |
| 2.1.218 | 30 | 24 | 13 |
(occurrence counts of each literal in the bundle)
Questions
- Is the model gate intentional, and if so what is the criterion for a model landing on
tengu_vellum_ash? - If it is a mitigation for malformed
TaskCreatecalls on newer models, could it fall through toTodoWriterather than disabling tracking outright? The!qee()clause onTodoWritelooks like it may be unintended — dropping it would preserve a working fallback. - Could this surface to the user? A one-line notice, a
/statusentry, or a/doctorwarning would turn a silent capability loss into a diagnosable one. - Could the documentation note that task tooling is model-dependent, so SDK integrations know to handle its absence?
3 Comments
I see multiple people reporting this issue how. Great. It came out of nowhere. They need to fix this.
@rufinus @thehikers Acknowledged in https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#21233.
I believe you can close this issue.
Fixed in 2.1.233 — changelog: "Todo/task-tracking tools (TaskCreate/Get/Update/List, TodoWrite) are no longer available on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models; set
CLAUDE_CODE_ENABLE_TODO_TOOLS=1to bring them back" (https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md). Closing — reply to reopen if it still happens on the latest version.🤖 Generated with Claude Code