effortLevel in settings.json silently discards "max" and "ultracode"

Status Open
Maintainer reply None cached
Activity 1 comment · opened Jul 22, 2026

Setting "effortLevel": "max" in settings.json is silently discarded, and the session starts at the default high with no warning that the value was rejected.

The effortLevel key is validated against enum(["low","medium","high","xhigh"]).optional().catch(void 0). Because of .catch(void 0), any value outside that enum is not a validation error: it produces no message and is coerced to undefined. But max is a real, selectable runtime effort tier. The full tier set is low, medium, high, xhigh, max, plus an ultracode tier (xhigh + workflows). So the persisted enum is a strict subset of the runtime tiers, excluding max and ultracode, and there is no supported way to persist max (or ultracode) as a launch default through settings.json.

For contrast, max is reachable at runtime two other ways, both session-only:

  • /effort (its own help text labels max "this session only").
  • CLAUDE_CODE_EFFORT_LEVEL=max (a per-session override that saves nothing).

Both were confirmed to produce genuine max effort. Only the persisted effortLevel path drops it.

Steps to reproduce

  1. Set "effortLevel": "max" in ~/.claude/settings.json.
  2. Start a new session.

Expected

Either the session launches at max, or a visible diagnostic states that max is not a persistable effortLevel value and is being ignored.

Actual

Effort is high (the default). No warning anywhere that max was rejected.

Suggested fix

Either or both:

  1. Emit a warning on out-of-enum values. .catch(void 0) swallows invalid input silently; a diagnostic ("max" is not a valid effortLevel; ignoring) closes the silent-failure gap regardless of whether max becomes persistable.
  2. Resolve the persistence gap. Extend the persisted enum to accept max (and ultracode) so it can be set as a launch default, or, if max is intentionally session-only, document that effortLevel does not accept it and point users to /effort or CLAUDE_CODE_EFFORT_LEVEL.

Environment

Claude Code v2.1.x

Severity: low. A UX papercut plus a small feature request, not a critical bug. The silent discard is the annoying part, since nothing tells the user their setting was ignored.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗