effortLevel in settings.json silently discards "max" and "ultracode"
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 labelsmax"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
- Set
"effortLevel": "max"in~/.claude/settings.json. - 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:
- 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 whethermaxbecomes persistable. - Resolve the persistence gap. Extend the persisted enum to accept
max(andultracode) so it can be set as a launch default, or, ifmaxis intentionally session-only, document thateffortLeveldoes not accept it and point users to/effortorCLAUDE_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.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗