@@ -910,6 +910,28 @@ def test_has_ref_with_schema_keywords_extras_with_metadata_only_keys() -> None:
910910 assert obj .has_ref_with_schema_keywords is False
911911
912912
913+ def test_has_ref_with_schema_keywords_extras_with_extension_keys () -> None :
914+ """Test has_ref_with_schema_keywords when extras contains only x-* extension keys.
915+
916+ OpenAPI/JSON Schema extension fields (x-*) should be treated as metadata
917+ and not trigger schema merging, which prevents infinite recursion with
918+ self-referencing schemas.
919+ """
920+ # x-* extensions are vendor extensions, should not trigger merge
921+ obj = JsonSchemaObject .parse_obj ({
922+ "$ref" : "#/$defs/Base" ,
923+ "deprecated" : False , # metadata-only field
924+ "x-internalAPI" : False , # extension field
925+ "x-custom-field" : "value" , # another extension field
926+ })
927+ # Verify extras contains extension keys
928+ assert obj .extras
929+ assert "x-internalAPI" in obj .extras
930+ assert "x-custom-field" in obj .extras
931+ # Extension fields should NOT trigger schema merge
932+ assert obj .has_ref_with_schema_keywords is False
933+
934+
913935def test_has_ref_with_schema_keywords_no_extras () -> None :
914936 """Test has_ref_with_schema_keywords when extras is empty."""
915937 # Only $ref and a schema-affecting field, no extras
0 commit comments