{"record":{"id":"6130f34be1a19ba9","repo":"apache/beam","slug":"unknown-coder-id-during-reconciliation-v","errorCode":null,"errorMessage":"unknown coder id during reconciliation: %v","messagePattern":"unknown coder id during reconciliation: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/runners/prism/internal/coders.go","lineNumber":274,"sourceCode":"// the base pipeline components.\nfunc reconcileCoders(bundle, base map[string]*pipepb.Coder) {\n\tfor {\n\t\tvar comps []string\n\t\tfor _, c := range bundle {\n\t\t\tfor _, ccid := range c.GetComponentCoderIds() {\n\t\t\t\tif _, ok := bundle[ccid]; !ok {\n\t\t\t\t\t// We don't have the coder yet, so in we go.\n\t\t\t\t\tcomps = append(comps, ccid)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif len(comps) == 0 {\n\t\t\treturn\n\t\t}\n\t\tfor _, ccid := range comps {\n\t\t\tc, ok := base[ccid]\n\t\t\tif !ok {\n\t\t\t\tpanic(fmt.Sprintf(\"unknown coder id during reconciliation: %v\", ccid))\n\t\t\t}\n\t\t\tbundle[ccid] = c\n\t\t}\n\t}\n}\n\n// pullDecoder return a function that will extract the bytes\n// for the associated coder. Uses a buffer and a TeeReader to extract the original\n// bytes from when decoding elements.\nfunc pullDecoder(c *pipepb.Coder, coders map[string]*pipepb.Coder) func(io.Reader) []byte {\n\tdec := pullDecoderNoAlloc(c, coders)\n\treturn func(r io.Reader) []byte {\n\t\tvar buf bytes.Buffer\n\t\ttr := io.TeeReader(r, &buf)\n\t\tdec(tr)\n\t\treturn buf.Bytes()\n\t}\n}","sourceCodeStart":256,"sourceCodeEnd":292,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/runners/prism/internal/coders.go#L256-L292","documentation":"During coder reconciliation prism builds a bundle-scoped coder map from the base pipeline coders. If a component coder ID referenced by a composite coder is absent from the base map, the invariants of the pipeline proto are violated and it panics.","triggerScenarios":"A pipeline whose components reference a coder ID never registered in the components list — typically a graph serialization bug or a hand-edited/stale model pipeline sent to prism.","commonSituations":"Runner/SDK version mismatches where the SDK emits coder references the submitted components don't contain, or custom pipeline transform builders producing dangling coder IDs.","solutions":["Verify the pipeline proto contains all referenced coder components (dump the model pipeline)","Upgrade/downgrade the Beam SDK and prism runner to matching versions","Check custom transform/coder registration so every composite coder's component IDs are registered","File a Beam bug with the pipeline if this occurs from standard SDK output"],"exampleFix":"// before\n// coder 'c5' referenced but missing from components\n// after\n// ensure every GetComponentCoderIds entry exists: add coder c5 to pipeline.Components before submit","handlingStrategy":"validation","validationCode":"for _, c := range pipeline.GetComponents().GetCoders() {\n    for _, id := range c.GetComponentCoderIds() {\n        if !coderIDs[id] { return fmt.Errorf(\"dangling coder reference %q\", id) }\n    }\n}","typeGuard":null,"tryCatchPattern":"defer func() {\n    if r := recover(); r != nil && strings.Contains(fmt.Sprint(r), \"unknown coder id during reconciliation\") {\n        err = fmt.Errorf(\"pipeline proto has unreferenced coder: %v\", r)\n    }\n}()","preventionTips":["Keep SDK and prism runner versions in sync","Never hand-edit model pipeline protos","Validate pipeline components before submission in custom builders","Report dangling-coder bugs with the dumped pipeline"],"tags":["prism","coders","serialization"],"backgroundTag":"record-not-found","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}