dagger/dagger · error
invalid enum member %q for %s
Error message
invalid enum member %q for %s
What it means
ModuleEnum.Lookup iterated every member of the enum and none matched the provided value string, so it reports the value and the enum type name. This is the standard 'value is not a member of this enum' user-facing error, surfaced through DecodeInput when GraphQL/SDK inputs or results carry an unknown enum name.
Source
Thrown at core/enum.go:231
if len(e.TypeDef.Members) == 0 {
// this is a fairly good indication that something wrong has happened internally
return nil, fmt.Errorf("enum %s has no members", e.TypeName())
}
for _, possible := range e.TypeDef.Members {
member := possible.Self()
name := member.Name
if e.Local && member.OriginalName != "" {
name = member.OriginalName
}
if val == name {
return &ModuleEnum{
TypeDef: e.TypeDef,
Name: member.Name,
}, nil
}
}
return nil, fmt.Errorf("invalid enum member %q for %s", val, e.TypeName())
}
func (e *ModuleEnum) memberTypedef() *EnumMemberTypeDef {
for _, possible := range e.TypeDef.Members {
if possible.Self().Name == e.Name {
return possible.Self()
}
}
return nil
}
func (e *ModuleEnum) MarshalJSON() ([]byte, error) {
return json.Marshal(e.Name)
}
View on GitHub (pinned to 82ba2681db)
Solutions
- Use exactly one of the enum's allowed values — check with `dagger query` introspection or `dagger functions` docs
- Fix casing/spelling of the value (enum members are case-sensitive)
- Regenerate the client SDK so its enum constants match the current schema
- If a member was renamed, update call sites to the new name
Example fix
# before
query { alpineEnv { build(mode: "RELEAS") { ... } } }
# after
query { alpineEnv { build(mode: "RELEASE") { ... } } } Defensive patterns
Strategy: validation
Validate before calling
// GraphQL / client-side pre-check against introspected members
const MODES = ["FAST", "SLOW"]
if (!MODES.includes(mode)) {
throw new Error(`${mode} is not a member of Mode; valid: ${MODES.join(", ")}`)
} Type guard
function isValidMode(v: string): v is "FAST" | "SLOW" {
return v === "FAST" || v === "SLOW"
} Try / catch
try {
await query(mode)
} catch (e) {
if (/invalid enum member/.test(String(e))) {
console.error(`Bad enum value; introspect the schema for allowed members of ${enumName}`)
}
throw e
} Prevention
- Copy enum literals from introspection or generated constants, never by hand
- Regenerate client SDKs after enum member renames
- Enum members are case-sensitive — match exactly
- Check `dagger query` introspection for the authoritative member list
When it happens
Trigger: A query passes an enum literal (or an SDK result returns a string) that matches no member Name — and, for local enums, no member OriginalName either.
Common situations: Typo or wrong casing in the GraphQL query enum literal; SDK code using a stale member name after a rename; a client from a different SDK version enumerating members that no longer exist; using a dependency's enum value against a module that re-exported it with different names.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- %T.ConvertFromSDKResult: invalid enum value %q for %q: %w
- enum types must be named
- failed to find decl for object %s: %w
- failed to find decl for named type %s: %w
- unknown enum value %v
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/c37800340ad530db.
Report an issue: GitHub.