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
- Re-serialize the parent state from the current class definition so keys match SchemeOf
- Remove or rename the stale key named in the error
- 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
- Version class definitions together with serialized parent state
- Ignore or log unknown state keys at boundaries instead of failing blindly later
- Never hand-edit serialized parent state
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
- non-monotype argument %s
- unmarshal arg %s: %w
- convert arg %s: %w
- non-monotype field %s
- convert field %s: %w
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/08a8667a8ec7d0a3.
Report an issue: GitHub.