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

  1. Use exactly one of the enum's allowed values — check with `dagger query` introspection or `dagger functions` docs
  2. Fix casing/spelling of the value (enum members are case-sensitive)
  3. Regenerate the client SDK so its enum constants match the current schema
  4. 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

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


AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05). Data as JSON: /api/errors/c37800340ad530db. Report an issue: GitHub.