{"record":{"id":"49d68100c9f28ae9","repo":"facebook/relay","slug":"expected-to-have-a-fragment-name","errorCode":null,"errorMessage":"Expected to have a fragment name.","messagePattern":"Expected to have a fragment name\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"compiler/crates/relay-transforms/src/relay_resolvers/spread_transform.rs","lineNumber":164,"sourceCode":"                import_path: field_metadata.import_path,\n                import_name: field_metadata.import_name,\n                field_alias: field.alias().map(|field_alias| field_alias.item),\n                field_path: field_metadata.field_path,\n                field_id: field.definition().item,\n                field_arguments,\n                fragment_arguments: fragment_arguments.clone(),\n                live: field_metadata.live,\n                output_type_info: field_metadata.output_type_info.clone(),\n                fragment_data_injection_mode: field_metadata\n                    .fragment_data_injection_mode\n                    .as_ref()\n                    .map(|injection_mode| {\n                        (\n                            self.program\n                                .fragment(\n                                    field_metadata\n                                        .fragment_name\n                                        .expect(\"Expected to have a fragment name.\"),\n                                )\n                                .expect(\"Expect to have a fragment node.\")\n                                .name,\n                            *injection_mode,\n                        )\n                    }),\n                type_confirmed: field_metadata.type_confirmed,\n                resolver_type: field_metadata.resolver_type,\n                return_fragment: field_metadata.return_fragment,\n            };\n\n            let mut new_directives: Vec<Directive> = vec![resolver_metadata.into()];\n\n            for directive in field.directives() {\n                if directive.name.item != RelayResolverFieldMetadata::directive_name() {\n                    new_directives.push(directive.clone())\n                }\n            }","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/facebook/relay/blob/668b1b85e06261aa3b58dabfc51f8b5524a70955/compiler/crates/relay-transforms/src/relay_resolvers/spread_transform.rs#L146-L182","documentation":"The Relay compiler's spread transform builds client-edge resolver metadata and expects every resolver field's fragment_name (from @returnFragment / @rootFragment lowering) to be Some by the time RelayResolverMetadata runs. It calls .expect(\"Expected to have a fragment name.\") on field_metadata.fragment_name, so a None panics. Per the surrounding code conventions this indicates a compiler invariant violation, not a user-authored GraphQL error.","triggerScenarios":"A field with resolver metadata (client-edge / @returnFragment flow) reaches this transform without fragment_name populated; typically a RelayResolverMetadata transform running on a program where the earlier pass that assigns fragment names was skipped or ran in the wrong order.","commonSituations":"Custom compiler builds with a modified transform pipeline, running the spread transform out of order, or internal Relay compiler bugs after upgrading relay crates.","solutions":["Ensure the full standard Relay transform pipeline (including the pass that populates fragment_name on resolver field metadata) runs before the spread transform.","Check field_metadata construction in relay_resolvers for a path that creates FieldMetadata without fragment_name.","Reproduce with a minimal fragment/operation and file a bug against relay compiler relay_resolvers.","Pin/upgrade to a relay compiler version where the ordering bug is fixed."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if field_metadata.fragment_name.is_none() {\n    panic!(\"resolver field `{}` reached spread transform without fragment_name; transform pipeline misconfigured\", field_metadata.name);\n}","typeGuard":"fn has_fragment_name(m: &FieldMetadata) -> bool { m.fragment_name.is_some() }","tryCatchPattern":"let Some(fragment_name) = field_metadata.fragment_name else {\n    return Err(Diagnostic::error(\"resolver metadata missing fragment_name\"));\n};","preventionTips":["Run the standard Relay transform pipeline in the documented order.","Add debug asserts for resolver metadata invariants between transforms.","Pin relay compiler crate versions across your build."],"tags":["relay-compiler","internal-invariant","rust-panic"],"backgroundTag":"relay-compiler-internal-invariant","analyzedSha":"668b1b85e06261aa3b58dabfc51f8b5524a70955","analyzedAt":"2026-09-02T19:57:20.783Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}