{"record":{"id":"612beca47008ccc4","repo":"facebook/relay","slug":"unexpected-relayresolvermetadata-on-inline-fragmen","errorCode":null,"errorMessage":"Unexpected RelayResolverMetadata on inline fragment while generating Reader AST","messagePattern":"Unexpected RelayResolverMetadata on inline fragment while generating Reader AST","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"compiler/crates/relay-codegen/src/build_ast.rs","lineNumber":894,"sourceCode":"                    InlineDirectiveMetadata::find(&inline_fragment.directives)\n                {\n                    // If inline fragment has @__inline directive (created by inline_data_fragment transform)\n                    // we will return selection wrapped with InlineDataFragmentSpread\n                    vec![self.build_inline_data_fragment_spread(\n                        context,\n                        inline_fragment,\n                        inline_data_directive,\n                    )]\n                } else if let Some(module_metadata) =\n                    ModuleMetadata::find(&inline_fragment.directives)\n                {\n                    self.build_module_import_selections(module_metadata, inline_fragment)\n                } else if let Some(resolver_metadata) =\n                    RelayResolverMetadata::find(&inline_fragment.directives)\n                {\n                    match self.variant {\n                        CodegenVariant::Reader => {\n                            panic!(\n                                \"Unexpected RelayResolverMetadata on inline fragment while generating Reader AST\"\n                            )\n                        }\n                        CodegenVariant::Normalization => {\n                            let fragment_primitive =\n                                self.build_inline_fragment(context, inline_fragment);\n\n                            vec![self.build_normalization_relay_resolver(\n                                context,\n                                resolver_metadata,\n                                Some(fragment_primitive),\n                            )]\n                        }\n                    }\n                } else {\n                    vec![self.build_inline_fragment(context, inline_fragment)]\n                }\n            }","sourceCodeStart":876,"sourceCodeEnd":912,"githubUrl":"https://github.com/facebook/relay/blob/668b1b85e06261aa3b58dabfc51f8b5524a70955/compiler/crates/relay-codegen/src/build_ast.rs#L876-L912","documentation":"RelayResolverMetadata attached to an inline fragment is only meaningful when generating Normalization ASTs. During Reader AST generation, build_selections_from_selection panics if it finds resolver metadata on an inline fragment, since the reader pipeline has no representation for it.","triggerScenarios":"A client-edge/resolver inline fragment (e.g. from @refetchable or a @relay_resolver marker) is compiled while CodegenVariant::Reader is active and the inline fragment carries RelayResolverMetadata directives.","commonSituations":"Compiling a document with resolver-bearing inline fragments through a code path meant only for reader generation; using a custom build script that invokes build_selections with the wrong variant; version mismatch where a newer schema/fragment shape is fed to an older reader codegen.","solutions":["Run the document through the full relay compiler pipeline (which generates both Reader and Normalization variants) instead of invoking reader-only codegen on resolver fragments.","Remove or fix the stray @relay_resolver / resolver metadata on the inline fragment if it isn't an actual resolver.","Check custom codegen entry points to pass CodegenVariant::Normalization for fragments with resolver metadata.","Upgrade the compiler so reader handling of resolver inline fragments matches your document's shape."],"exampleFix":"// before (custom codegen)\nbuild_selections(ctx, selections, CodegenVariant::Reader); // fragment has resolver metadata\n// after\nbuild_selections(ctx, selections, CodegenVariant::Normalization); // or use full relay compile\n","handlingStrategy":"validation","validationCode":"fn inline_fragment_is_reader_safe(frag: &InlineFragment) -> bool {\n    RelayResolverMetadata::find(&frag.directives).is_none()\n}\n","typeGuard":"fn has_resolver_metadata(directives: &[Directive]) -> bool {\n    RelayResolverMetadata::find(directives).is_some()\n}\n","tryCatchPattern":"let result = std::panic::catch_unwind(|| build_selections_reader(...));\nif result.is_err() { report(\"resolver metadata found on inline fragment in reader codegen\"); }\n","preventionTips":["Compile resolver-bearing documents through the full relay compiler, not reader-only codegen.","Use CodegenVariant::Normalization for fragments containing resolver metadata.","Keep relay compiler versions aligned with the document shapes you compile."],"tags":["graphql","codegen","resolver","inline-fragment"],"backgroundTag":"unexpected-resolver-metadata","analyzedSha":"668b1b85e06261aa3b58dabfc51f8b5524a70955","analyzedAt":"2026-09-02T19:57:20.783Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}