{"record":{"id":"02826f2f30dc7a79","repo":"apache/beam","slug":"unexpected-transform-urn-v","errorCode":null,"errorMessage":"Unexpected transform URN: %v","messagePattern":"Unexpected transform URN: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/core/runtime/exec/translate.go","lineNumber":834,"sourceCode":"\t\t\treturn nil, err\n\t\t}\n\n\t\tsink := &DataSink{UID: b.idgen.New()}\n\t\tsink.SID = StreamID{PtransformID: id.to, Port: port}\n\t\tsink.Coder, err = b.coders.Coder(cid) // Expected to be windowed coder\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif !coder.IsW(sink.Coder) {\n\t\t\treturn nil, errors.Errorf(\"unwindowed coder %v on DataSink %v: %v\", cid, id, sink.Coder)\n\t\t}\n\t\tu = sink\n\n\tcase graphx.URNToString:\n\t\tu = &ToString{UID: b.idgen.New(), Out: out[0]}\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Unexpected transform URN: %v\", urn))\n\t}\n\n\tb.links[id] = u\n\tb.units = append(b.units, u)\n\treturn u, nil\n}\n\nfunc unmarshalReshuffleCoders(mainID string, payloads map[string][]byte) (*coder.Coder, error) {\n\tm := map[string]*pipepb.Coder{}\n\tfor id, v := range payloads {\n\t\tpc := &pipepb.Coder{}\n\t\tif err := proto.Unmarshal(v, pc); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tm[id] = pc\n\t}\n\tum := graphx.NewCoderUnmarshaller(m)\n\treturn um.Coder(mainID)","sourceCodeStart":816,"sourceCodeEnd":852,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/core/runtime/exec/translate.go#L816-L852","documentation":"makeLink translates graph transform URNs into executable units and handles a fixed set of known URNs (ParDo, Combine, sinks, ToString, etc.). A URN outside that set hits the default case and panics with 'Unexpected transform URN'. This guards against pipelines containing transforms the Go exec translator cannot lower.","triggerScenarios":"A pipeline graph containing an unknown/exotic URN (e.g. a cross-language transform not materialized before execution, or a newer SDK URN unknown to the worker); hand-edited or corrupted graph JSON; version skew where the submitting SDK emits URNs the worker's translator predates.","commonSituations":"Cross-language (Python/Java → Go) pipelines where expansion didn't fully resolve URNs; newer Beam features used with an older Go worker container; custom transforms registered under a custom URN executed with the direct Go runner path.","solutions":["Upgrade the Go SDK/worker container to match (or exceed) the SDK that produced the pipeline","Ensure cross-language transforms are fully expanded before Go execution (check expansion service logs)","Search the pipeline graph dump for the offending URN and replace the transform with a supported equivalent (e.g. use ParDo with a DoFn)","If it's a legitimately supported transform failing to translate, file a Beam issue with the URN and pipeline"],"exampleFix":"// before (pipeline uses URN the worker can't lower)\nbeam.CrossLanguage(p, \"my:custom:urn\", ...)\n// after\n// expand cross-language transform before Go execution, or implement with a Go ParDo:\nbeam.ParDo(p, &myGoDoFn{}, input)","handlingStrategy":"validation","validationCode":"known := map[string]bool{graphx.URNParDoTransform: true, graphx.URNToString: true /* ... */}\nif !known[urn] {\n    return fmt.Errorf(\"transform URN %q is not supported by this Go SDK version\", urn)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep the Go worker image at least as new as the submitting SDK","Fully expand cross-language transforms before Go execution","Avoid custom URNs unless you control the translation path","Check expansion logs when mixing Python/Java with Go runners"],"tags":["go","apache-beam","translation","urn"],"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"}