{"record":{"id":"9501cf8701293a7b","repo":"apache/beam","slug":"builddescriptor-failed-to-handle-coder-on-stage-v-for","errorCode":null,"errorMessage":"buildDescriptor: failed to handle coder on stage %v for primary input, pcol %q %v:\n%w\n%v","messagePattern":"buildDescriptor: failed to handle coder on stage (.+?) for primary input, pcol %q (.+?):\n%w\n(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/runners/prism/internal/stage.go","lineNumber":620,"sourceCode":"\t\t}\n\t\tprepareSides = append(prepareSides, prepSide)\n\t}\n\n\t// Finally, the parallel input, which is it's own special snowflake, that needs a datasource.\n\t// This id is directly used for the source, but this also copies\n\t// coders used by side inputs to the coders map for the bundle, so\n\t// needs to be run for every ID.\n\n\tcol := clonePColToBundle(stg.primaryInput)\n\tif newCID, err := lpUnknownCoders(col.GetCoderId(), coders, comps.GetCoders()); err == nil && col.GetCoderId() != newCID {\n\t\tcol.CoderId = newCID\n\t} else if err != nil {\n\t\treturn fmt.Errorf(\"buildDescriptor: couldn't rewrite coder %q for primary input pcollection %q: %w\", col.GetCoderId(), stg.primaryInput, err)\n\t}\n\n\twInCid, err := makeWindowedValueCoder(stg.primaryInput, comps, coders)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"buildDescriptor: failed to handle coder on stage %v for primary input, pcol %q %v:\\n%w\\n%v\", stg.ID, stg.primaryInput, prototext.Format(col), err, stg.transforms)\n\t}\n\ted := collectionPullDecoder(col.GetCoderId(), coders, comps)\n\twinCoder, wDec, wEnc := getWindowValueCoders(comps, col, coders)\n\n\tvar kd func(io.Reader) []byte\n\tif kcid, ok := extractKVCoderID(col.GetCoderId(), coders); ok {\n\t\tkd = collectionPullDecoder(kcid, coders, comps)\n\t}\n\n\tinputInfo := engine.PColInfo{\n\t\tGlobalID:    stg.primaryInput,\n\t\tWindowCoder: winCoder,\n\t\tWDec:        wDec,\n\t\tWEnc:        wEnc,\n\t\tEDec:        ed,\n\t\tKeyDec:      kd,\n\t}\n","sourceCodeStart":602,"sourceCodeEnd":638,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/runners/prism/internal/stage.go#L602-L638","documentation":"After primary-input coder rewriting, buildDescriptor constructs the windowed value coder for the primary input via makeWindowedValueCoder. Failure means the input's coder plus window coder cannot be composed into a WindowedValue coder, so the stage cannot decode incoming elements. The error includes the stage, PCollection proto, wrapped cause, and the stage's transforms for diagnosis.","triggerScenarios":"makeWindowedValueCoder(stg.primaryInput, comps, coders) errors — unknown coder IDs, missing component coders, or unsupported windowing strategies on the input PCollection.","commonSituations":"Non-standard windowing (custom window fns) not implemented by prism; malformed coder component chains; cross-language inputs.","solutions":["Read the wrapped %w cause for the exact failing coder","Verify the PCollection's coder and windowing strategy are standard/registered","Simplify windowing (e.g. global windows) to isolate the issue","Upgrade to a prism runner version supporting the windowing/coder in question"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Confirm windowing strategy is standard (fixed/global) before submit\nws := comps.GetWindowingStrategies()[pcol.GetWindowingStrategyId()]\nif ws == nil || unsupportedWindowURN(ws) {\n    return fmt.Errorf(\"unsupported windowing for input %q\", pcolID)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use standard windowing strategies with prism","Check prism release notes for supported window coders","Test windowed pipelines incrementally"],"tags":["beam","prism","coder","windowing"],"backgroundTag":"unsupported-operation","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"}