Skip to content

[Fusion] Add InterfaceObject support - #10079

Merged
michaelstaib merged 25 commits into
mainfrom
mst/fes-6
Jul 10, 2026
Merged

michaelstaib merged 25 commits into
mainfrom
mst/fes-6

Conversation

@michaelstaib

@michaelstaib michaelstaib commented Jul 9, 2026 •

Copy link
Copy Markdown
Member

Copilot AI review requested due to automatic review settings July 9, 2026 21:27
# Conflicts:
#	src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Nodes/Selection.cs

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds end-to-end Composite Schemas Spec @interfaceObject support to Fusion (composition, planning, execution, and plan caching), including Apollo Federation compatibility for non-resolvable interface-object keys and extensive validation + integration tests.

Changes:

  • Introduces @interfaceObject / @implement directive surface area (names, directive types) and composition rules to validate & merge stand-ins/defaults.
  • Updates planning/execution to treat stand-in-produced interface values as opaque, recovering identity via covering lookups, and preserving this behavior through operation-plan JSON round-trips.
  • Adds Apollo Federation compatibility option (AllowNonResolvableInterfaceObjects) and wires it through settings, Aspire, and in-memory connector composition.

Reviewed changes

Copilot reviewed 139 out of 141 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/HotChocolate/Primitives/src/Primitives/Types/DirectiveNames.cs Adds directive name constants
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Types/FusionSchemaDefinitionConnectorKindTests.cs Tests SourceSchemaInfo compatibility
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Serialization/JsonOperationPlanSerializationTests.cs Tests plan round-trip opacity
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/ApolloEntityInterfaceLookupPlanningTests.cs Tests Apollo entity lookup routing
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/snapshots/InterfaceObjectPlanningTests.Plan_Should_Skip_Covering_Lookup_When_Only_InterfaceFields_Selected.yaml New planning snapshot
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/snapshots/InterfaceObjectPlanningTests.Plan_Should_Route_TypeName_To_Covering_Lookup.yaml New planning snapshot
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/snapshots/InterfaceObjectPlanningTests.Plan_Should_Route_Fragment_Narrowing_To_Covering_Lookup.yaml New planning snapshot
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/snapshots/InterfaceObjectPlanningTests.Plan_Should_Route_ConcreteFragment_TypeNameOnly_To_Covering_Lookup.yaml New planning snapshot
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/snapshots/InterfaceObjectPlanningTests.Plan_Should_Route_ConcreteFragment_StandInField_Through_StandIn.yaml New planning snapshot
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/snapshots/InterfaceObjectPlanningTests.Plan_Should_Route_ConcreteFragment_StandInField_From_NonOpaque_Root.yaml New planning snapshot
src/HotChocolate/Fusion/test/Fusion.Execution.Tests/snapshots/InterfaceObjectPlanningTests.Plan_Should_Prefer_CoveringAbstractLookup_Over_ConcreteFanOut.yaml New planning snapshot
src/HotChocolate/Fusion/test/Fusion.Connectors.InMemory.Tests/InMemoryConnectorTests.cs Tests in-memory composition options
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/NonResolvableInterfaceObject/NonResolvableInterfaceObjectTests.cs Compliance: non-resolvable stand-ins
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/NonResolvableInterfaceObject/B/ProductInterfaceType.cs Adds reference resolver for interface
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/NonResolvableInterfaceObject/B/Bread.cs Introduces shared interface type
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/NonResolvableInterfaceObject/A/QueryType.cs Adjusts resolver payload shape
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/InterfaceObjectWithRequires/A/User.cs Implements shared interface contract
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/InterfaceObjectWithRequires/A/NodeWithNameType.cs Adds interface reference resolver
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/InterfaceObjectWithRequires/A/INodeWithName.cs New interface for test types
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/InterfaceObjectIndirectExtension/A/MediaInterfaceType.cs Adds interface reference resolver
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/CorruptedSupergraphNodeId/CorruptedSupergraphNodeIdTests.cs Fixes expectedData for errors
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/CorruptedSupergraphNodeId/B/AccountType.cs Marks key field external
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Suites/CorruptedSupergraphNodeId/A/ChatType.cs Marks key field external
src/HotChocolate/Fusion/test/Fusion.Connectors.ApolloFederation.Compliance.Tests/Infrastructure/FusionGatewayBuilder.cs Wires allowNonResolvable option
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/SourceSchemaValidationRules/InterfaceObjectKeyMissingRuleTests.cs Tests stand-in key requirement
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/SourceSchemaMerger.InterfaceObjectProjection.Tests.cs Tests projection/override behavior
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/SourceSchemaMerger.InterfaceImplementations.Tests.cs Tests interface implementation union
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/SatisfiabilityValidatorInterfaceObjectTests.cs Tests satisfiability w/ stand-ins
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/PreMergeValidationRules/TypeKindMismatchRuleTests.cs Tests kind mismatch exceptions
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/PreMergeValidationRules/InterfaceObjectNoInterfaceRuleTests.cs Tests missing interface detection
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/PreMergeValidationRules/InterfaceObjectKeyMismatchRuleTests.cs Tests key mismatch validation
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/PreMergeValidationRules/FieldWithMissingRequiredArgumentRuleTests.cs Extends arg rule for stand-ins
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/PostMergeValidationRules/InvalidProjectedFieldSharingRuleTests.cs Tests projected sharing validation
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/PostMergeValidationRules/ImplementWithoutDefaultRuleTests.cs Tests @implement without default
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/CompositionSettingsTests.cs Tests settings round-trip/merge
src/HotChocolate/Fusion/test/Fusion.Composition.Tests/snapshots/SourceSchemaMergerTests.Merge_FourNamedSchemas_AddsFusionDefinitions.graphql Updates fusion definitions snapshot
src/HotChocolate/Fusion/test/Fusion.Composition.ApolloFederation.Tests/InterfaceObjectImplementSynthesisTests.cs Tests Apollo implement synthesis
src/HotChocolate/Fusion/test/Fusion.Composition.ApolloFederation.Tests/FederationSchemaTransformerTests.cs Preserves interfaceObject transform
src/HotChocolate/Fusion/test/Fusion.Composition.ApolloFederation.Tests/EntityInterfaceKeyShareableTests.cs Fixes shareable stamping behavior
src/HotChocolate/Fusion/test/Fusion.Composition.ApolloFederation.Tests/ApolloFederationCompatibilityTests.cs Tests compatibility gating
src/HotChocolate/Fusion/test/Fusion.Composition.ApolloFederation.Tests/snapshots/FederationSchemaTransformerTests.Transform_InterfaceObject_Should_Preserve.md New transformer snapshot
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/InterfaceObjectRequiresTests.cs Native integration: requires + stand-in
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/InterfaceObjectNestedTests.cs Native integration: nested stand-in
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs Adds assert+snapshot helper
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/FusionTestBase.CreateSourceSchema.cs Registers composite directive types
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/snapshots/InterfaceObjectTests.Opaque_TypeName_Is_Recovered_Through_Covering_Lookup.yaml New integration snapshot
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/snapshots/InterfaceObjectTests.Id_Only_Selection_Is_A_Single_Fetch.yaml New integration snapshot
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/snapshots/InterfaceObjectTests.Fragment_Narrowing_Resolves_ConcreteOwned_Field_From_Opaque_Root.yaml New integration snapshot
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/snapshots/InterfaceObjectTests.Default_Field_Inheritance_Resolves_From_StandIn_Only.yaml New integration snapshot
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/snapshots/InterfaceObjectRequiresTests.AnotherUsers_SelectsUserAge.yaml New integration snapshot
src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/snapshots/InterfaceObjectNestedTests.Playlist_Media_ResolvesConcreteFieldThroughInterfaceObject.yaml New integration snapshot
src/HotChocolate/Fusion/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs Adds opaque-to-concrete upgrade
src/HotChocolate/Fusion/src/Fusion.Execution/Properties/FusionExecutionResources.resx Adds execution error resource
src/HotChocolate/Fusion/src/Fusion.Execution/Properties/FusionExecutionResources.Designer.cs Adds resource accessor
src/HotChocolate/Fusion/src/Fusion.Execution/Planning/PlanQueue.cs Adjusts lookup planning logic
src/HotChocolate/Fusion/src/Fusion.Execution/Planning/Partitioners/SelectionSetPartitioner.cs Spills typename/conditions for opacity
src/HotChocolate/Fusion/src/Fusion.Execution/Planning/OperationPlanner.cs Candidate schemas for identity recovery
src/HotChocolate/Fusion/src/Fusion.Execution/Planning/OperationDefinitionBuilder.cs Avoids sending concrete conditions to stand-ins
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/ThrowHelper.cs Adds structured invalid-kind exception
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Results/ValueCompletion.cs Completes opaque interface values safely
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Results/FetchResultStore.cs Improves errors; exposes result paths
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/OperationPlanContext.cs Exposes result-path helper
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanParser.cs Restores opacity on plan parse
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Nodes/SelectionSet.cs Tracks declaring selection for upgrades
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Nodes/Selection.cs Selection-set lookup via complex context
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Nodes/ResultSelectionSet.cs Marks “ProducesOpaqueElements”
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Nodes/OperationCompiler.cs Propagates declaring selection metadata
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Nodes/Operation.cs Supports selection sets for complex contexts
src/HotChocolate/Fusion/src/Fusion.Execution/Execution/ApolloFederation/LookupEntityQueryRewriter.cs Flattens conditions for stand-in schemas
src/HotChocolate/Fusion/src/Fusion.Execution.Types/PlannerTopologyCache.cs Allows transitions into stand-in schemas
src/HotChocolate/Fusion/src/Fusion.Execution.Types/Metadata/SourceSchemaInfo.cs Adds compatibility flag metadata
src/HotChocolate/Fusion/src/Fusion.Execution.Types/Metadata/SourceInterfaceType.cs Tracks isInterfaceObject per schema
src/HotChocolate/Fusion/src/Fusion.Execution.Types/FusionBuiltIns.cs Adds fusion__interfaceObject constant
src/HotChocolate/Fusion/src/Fusion.Execution.Types/Directives/InterfaceObjectDirectiveParser.cs Parses fusion__interfaceObject directives
src/HotChocolate/Fusion/src/Fusion.Execution.Types/Directives/FieldDirectiveParser.cs Minor formatting refactor
src/HotChocolate/Fusion/src/Fusion.Execution.Types/Completion/CompositeSchemaBuilder.cs Reads compatibility from schema metadata
src/HotChocolate/Fusion/src/Fusion.Execution.Types/Completion/CompletionTools.cs Plumbs interfaceObject metadata into sources
src/HotChocolate/Fusion/src/Fusion.Connectors.InMemory/InMemoryConfigurationProvider.cs Allows composition options injection
src/HotChocolate/Fusion/src/Fusion.Connectors.InMemory/DependencyInjection/InMemoryFusionGatewayBuilderExtensions.cs Adds in-memory composition option hook
src/HotChocolate/Fusion/src/Fusion.Composition/WellKnownDirectiveNames.cs Adds interfaceObject/implement names
src/HotChocolate/Fusion/src/Fusion.Composition/WellKnownArgumentNames.cs Adds compatibility argument name
src/HotChocolate/Fusion/src/Fusion.Composition/SourceSchemaValidationRules/InterfaceObjectKeyMissingRule.cs Validates stand-ins declare @key
src/HotChocolate/Fusion/src/Fusion.Composition/SourceSchemaPreprocessor.cs Adds Apollo implement synthesis pass
src/HotChocolate/Fusion/src/Fusion.Composition/SourceSchemaEnricher.cs Tracks interfaceObject/implement presence
src/HotChocolate/Fusion/src/Fusion.Composition/Settings/SettingsJsonSerializerContext.cs Adds JSON metadata for settings
src/HotChocolate/Fusion/src/Fusion.Composition/Settings/SettingsExtensions.cs Merges + maps compatibility settings
src/HotChocolate/Fusion/src/Fusion.Composition/Settings/CompositionSettings.cs Adds compatibility settings section
src/HotChocolate/Fusion/src/Fusion.Composition/SchemaComposer.cs Wires rules + satisfiability options
src/HotChocolate/Fusion/src/Fusion.Composition/SatisfiabilityValidator.cs Adds interfaceObject satisfiability logic
src/HotChocolate/Fusion/src/Fusion.Composition/Satisfiability/FusionLookupDirectiveCache.cs Allows stand-in lookup reachability
src/HotChocolate/Fusion/src/Fusion.Composition/Properties/CompositionResources.resx Adds new rule/error messages
src/HotChocolate/Fusion/src/Fusion.Composition/PreMergeValidationRules/TypeKindMismatchRule.cs Exempts stand-ins from kind mismatch
src/HotChocolate/Fusion/src/Fusion.Composition/PreMergeValidationRules/InterfaceObjectNoInterfaceRule.cs Validates stand-in binding target
src/HotChocolate/Fusion/src/Fusion.Composition/PreMergeValidationRules/InterfaceObjectKeyMismatchRule.cs Validates key alignment with interface
src/HotChocolate/Fusion/src/Fusion.Composition/PostMergeValidationRules/InvalidProjectedFieldSharingRule.cs Validates default-sharing collisions
src/HotChocolate/Fusion/src/Fusion.Composition/PostMergeValidationRules/InterfaceObjectFieldRequiresImplementRule.cs Enforces @implement on replacements
src/HotChocolate/Fusion/src/Fusion.Composition/PostMergeValidationRules/ImplementWithoutDefaultRule.cs Rejects stray @implement markers
src/HotChocolate/Fusion/src/Fusion.Composition/Options/SchemaComposerOptions.cs Adds Apollo compatibility options
src/HotChocolate/Fusion/src/Fusion.Composition/Options/ApolloFederationCompatibilityOptions.cs New compatibility options type
src/HotChocolate/Fusion/src/Fusion.Composition/Logging/LogEntryHelper.cs Adds new log entries
src/HotChocolate/Fusion/src/Fusion.Composition/Logging/LogEntryCodes.cs Adds new error codes
src/HotChocolate/Fusion/src/Fusion.Composition/InterfaceObjectMetadata.cs Shared stand-in/default helpers
src/HotChocolate/Fusion/src/Fusion.Composition/FusionBuiltIns.cs Registers new directive definitions
src/HotChocolate/Fusion/src/Fusion.Composition/Features/SourceOutputFieldMetadata.cs Adds implement flag
src/HotChocolate/Fusion/src/Fusion.Composition/Features/SourceObjectTypeMetadata.cs Adds interfaceObject flag
src/HotChocolate/Fusion/src/Fusion.Composition/Extensions/OutputFieldDefinitionExtensions.cs Exposes implement metadata
src/HotChocolate/Fusion/src/Fusion.Composition/Extensions/ObjectTypeDefinitionExtensions.cs Exposes interfaceObject metadata
src/HotChocolate/Fusion/src/Fusion.Composition/Extensions/MutableSchemaDefinitionExtensions.cs Adds stand-in lookup reachability
src/HotChocolate/Fusion/src/Fusion.Composition/Extensions/MutableOutputFieldDefinitionExtensions.cs Adds ApplyImplementDirective helper
src/HotChocolate/Fusion/src/Fusion.Composition/Definitions/InterfaceObjectMutableDirectiveDefinition.cs Defines @interfaceObject directive
src/HotChocolate/Fusion/src/Fusion.Composition/Definitions/ImplementMutableDirectiveDefinition.cs Defines @implement directive
src/HotChocolate/Fusion/src/Fusion.Composition/Definitions/FusionTypeMutableDirectiveDefinition.cs Minor formatting adjustment
src/HotChocolate/Fusion/src/Fusion.Composition/Definitions/FusionSchemaMutableEnumTypeDefinition.cs Adds compatibility metadata arg
src/HotChocolate/Fusion/src/Fusion.Composition/Definitions/FusionSchemaMetadataMutableDirectiveDefinition.cs Adds allowNonResolvable argument
src/HotChocolate/Fusion/src/Fusion.Composition/Definitions/FusionInterfaceObjectMutableDirectiveDefinition.cs Defines @fusion__interfaceObject
src/HotChocolate/Fusion/src/Fusion.Composition/CompositionHelper.cs Wires compatibility settings into composer
src/HotChocolate/Fusion/src/Fusion.Composition/ApolloFederation/SynthesizeImplementDirectives.cs Synthesizes @implement for Apollo
src/HotChocolate/Fusion/src/Fusion.Composition/ApolloFederation/RemoveFederationInfrastructure.cs Keeps interfaceObject directive
src/HotChocolate/Fusion/src/Fusion.Composition/ApolloFederation/MarkKeyFieldsShareable.cs Avoids shareable on interfaces
src/HotChocolate/Fusion/src/Fusion.Composition/ApolloFederation/FederationSchemaAnalyzer.cs No longer flags interfaceObject as unsupported
src/HotChocolate/Fusion/src/Fusion.Composition/ApolloFederation/ApolloFederationCompatibilityMetadata.cs Tracks compat during composition
src/HotChocolate/Fusion/src/Fusion.Aspire/GraphQLCompositionSettings.cs Adds compat setting surface
src/HotChocolate/Fusion/src/Fusion.Aspire/AspireCompositionHelper.cs Wires compat setting into composition
src/HotChocolate/Core/src/Types/Types/Composite/Directives/InterfaceObject.cs Adds composite @interfaceObject directive type
src/HotChocolate/Core/src/Types/Types/Composite/Directives/Implement.cs Adds composite @implement directive type
src/HotChocolate/Core/src/Types/Types/Composite/Directives/External.cs Adds composite @external directive type
Files not reviewed (2)
  • src/HotChocolate/Fusion/src/Fusion.Composition/Properties/CompositionResources.Designer.cs: Generated file
  • src/HotChocolate/Fusion/src/Fusion.Execution/Properties/FusionExecutionResources.Designer.cs: Generated file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@github-actions github-actions Bot added the 📚 documentation This issue is about working on our documentation. label Jul 10, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 197 out of 199 changed files in this pull request and generated 2 comments.

Files not reviewed (2)
  • src/HotChocolate/Fusion/src/Fusion.Composition/Properties/CompositionResources.Designer.cs: Generated file
  • src/HotChocolate/Fusion/src/Fusion.Execution/Properties/FusionExecutionResources.Designer.cs: Generated file

Comment on lines +60 to +66
/// This is an object type for a fully resolved (concrete) selection set. It can be an
/// interface type while an element produced by an <c>@interfaceObject</c> stand-in still
/// awaits identity recovery through its covering lookup.
/// </remarks>
public IComplexTypeDefinition Type { get; }

IObjectTypeDefinition ISelectionSet.Type => (IObjectTypeDefinition)Type;
Comment on lines +70 to +74
var nodeResolutionOption = Opt<NodeResolutionOption>.Instance;
var nodeResolution = parseResult.Tokens.Any(
static token => token.Value == NodeResolutionOption.OptionName)
? parseResult.GetValue(nodeResolutionOption)
: null;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📚 documentation This issue is about working on our documentation. 🌶️ hot chocolate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants