{"record":{"id":"08a8667a8ec7d0a3","repo":"dagger/dagger","slug":"unknown-field-s","errorCode":null,"errorMessage":"unknown field: %s","messagePattern":"unknown field: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/sdk/dang/v1/helpers.go","lineNumber":215,"sourceCode":"\t\t\treturn nil, fmt.Errorf(\"convert arg %s: %w\", arg.Key, err)\n\t\t}\n\t\targMap[arg.Key] = dangVal\n\t\targs = append(args, dang.Keyed[dang.Node]{\n\t\t\tKey:   arg.Key,\n\t\t\tValue: &dang.ValueNode{Val: dangVal},\n\t\t})\n\t}\n\n\tif fnCall.Name == \"\" {\n\t\treturn parentConstructor.Call(ctx, env, argMap)\n\t}\n\n\tparentModEnv := dang.NewObject(parentModType)\n\n\tfor name, value := range parentState {\n\t\tscheme, found := parentModType.SchemeOf(name)\n\t\tif !found {\n\t\t\treturn nil, fmt.Errorf(\"unknown field: %s\", name)\n\t\t}\n\t\tfieldType, isMono := scheme.Type()\n\t\tif !isMono {\n\t\t\treturn nil, fmt.Errorf(\"non-monotype field %s\", name)\n\t\t}\n\t\tdangVal, err := anyToDang(ctx, parentClosure, value, fieldType)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"convert field %s: %w\", name, err)\n\t\t}\n\t\tparentModEnv.Bind(name, dangVal, dang.PrivateVisibility)\n\t}\n\n\tbodyEnv := dang.CreateOverlayValueScope(parentModEnv, parentClosure)\n\tbodyEnv.EnterSelf(parentModEnv)\n\t_, err = dang.EvaluateFormsWithPhases(ctx, parentConstructor.ObjectBodyForms, bodyEnv)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"evaluating class body for %s: %w\", parentConstructor.ObjectName, err)\n\t}","sourceCodeStart":197,"sourceCodeEnd":233,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/core/sdk/dang/v1/helpers.go#L197-L233","documentation":"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.","triggerScenarios":"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.","commonSituations":"Stale serialized state after a class field rename; SDK version skew (older payloads, newer class); hand-edited serialized state.","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"],"exampleFix":"// before: parent state {\"greeting\":\"hi\"} but the class field was renamed\n// after: {\"message\":\"hi\"} matching the class field","handlingStrategy":"validation","validationCode":"// Go: filter parentState keys the class no longer declares before rehydrating\nfor name := range parentState {\n    if _, found := parentModType.SchemeOf(name); !found {\n        return fmt.Errorf(\"state field %q not declared by the class; regenerate state\", name)\n    }\n}","typeGuard":"func fieldKnown(t *dang.Type, name string) bool {\n    _, ok := t.SchemeOf(name)\n    return ok\n}","tryCatchPattern":null,"preventionTips":["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"],"tags":["dang","rehydration","schema-drift","sdk-runtime"],"backgroundTag":"unknown-field","analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}