dagger/dagger · error

unknown field: %s

Error message

unknown field: %s

What it means

During rehydration, callDangFunction binds every key of the serialized parent state (the fnCall.Parent JSON decoded into parentState) by looking the key up on the parent object type. If parentModType.SchemeOf(name) does not find the key, the stored state references a field the class does not declare.

Source

Thrown at core/sdk/dang/v1/helpers.go:215

			return nil, fmt.Errorf("convert arg %s: %w", arg.Key, err)
		}
		argMap[arg.Key] = dangVal
		args = append(args, dang.Keyed[dang.Node]{
			Key:   arg.Key,
			Value: &dang.ValueNode{Val: dangVal},
		})
	}

	if fnCall.Name == "" {
		return parentConstructor.Call(ctx, env, argMap)
	}

	parentModEnv := dang.NewObject(parentModType)

	for name, value := range parentState {
		scheme, found := parentModType.SchemeOf(name)
		if !found {
			return nil, fmt.Errorf("unknown field: %s", name)
		}
		fieldType, isMono := scheme.Type()
		if !isMono {
			return nil, fmt.Errorf("non-monotype field %s", name)
		}
		dangVal, err := anyToDang(ctx, parentClosure, value, fieldType)
		if err != nil {
			return nil, fmt.Errorf("convert field %s: %w", name, err)
		}
		parentModEnv.Bind(name, dangVal, dang.PrivateVisibility)
	}

	bodyEnv := dang.CreateOverlayValueScope(parentModEnv, parentClosure)
	bodyEnv.EnterSelf(parentModEnv)
	_, err = dang.EvaluateFormsWithPhases(ctx, parentConstructor.ObjectBodyForms, bodyEnv)
	if err != nil {
		return nil, fmt.Errorf("evaluating class body for %s: %w", parentConstructor.ObjectName, err)
	}

View on GitHub (pinned to 82ba2681db)

Solutions

  1. Re-serialize the parent state from the current class definition so keys match SchemeOf
  2. Remove or rename the stale key named in the error
  3. Align SDK/class versions so the class at rehydration is the one that produced the state

Example fix

// before: parent state {"greeting":"hi"} but the class field was renamed
// after: {"message":"hi"} matching the class field
Defensive patterns

Strategy: validation

Validate before calling

// Go: filter parentState keys the class no longer declares before rehydrating
for name := range parentState {
    if _, found := parentModType.SchemeOf(name); !found {
        return fmt.Errorf("state field %q not declared by the class; regenerate state", name)
    }
}

Type guard

func fieldKnown(t *dang.Type, name string) bool {
    _, ok := t.SchemeOf(name)
    return ok
}

Prevention

When it happens

Trigger: fnCall.Parent JSON contains a key that was removed or renamed from the class definition, or the class definition was swapped between state serialization and rehydration.

Common situations: Stale serialized state after a class field rename; SDK version skew (older payloads, newer class); hand-edited serialized state.

Related errors


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