[Microsoft.PlanetaryComputer][2025-04-30-preview] SDK review and emitter-driven breaking changes #36381
Merged
[Microsoft.PlanetaryComputer][2025-04-30-preview] SDK review and emitter-driven breaking changes #36381
Conversation
Next Steps to MergeNext steps that must be taken to merge this PR:
|
|
PR validation pipeline restarted successfully. If there is ApiView generated, it will be updated in this comment. |
API Change CheckAPIView identified API level changes in this PR and created the following API reviews
|
karthick-rn
approved these changes
Feb 19, 2026
mandarinamdar
approved these changes
Feb 19, 2026
zman-ms
pushed a commit
to zman-ms/azure-rest-api-specs
that referenced
this pull request
Feb 24, 2026
…ter-driven breaking changes (Azure#36381) Changes are grouped by OAD (OpenAPI diff) rule code, with explanations of why each category of change was necessary. Context: This is a preview API version. These breaking changes were introduced during the SDK generation and review process, none affect a GA API surface. Root Causes All breaking changes fall into three root-cause categories: SDK Review Feedback (~60%): Model renames, enum renames, operation ID changes, parameter renames, and numeric type right-sizing were requested by SDK review boards for .NET, Java, JavaScript, and Python to ensure generated SDKs follow Azure SDK guidelines for naming, clarity, and ergonomics. TypeSpec OpenAPI 2.0 Emitter Limitations (~25%): The TypeSpec compiler's OpenAPI 2.0 emitter could not properly represent certain constructs (union types, discriminated polymorphism, XML/binary responses). This produced empty definitions, missing discriminators, or incorrect types in the generated OpenAPI spec. These issues were silent in validation but caused real serialization/deserialization failures in SDK clients. Specification Accuracy (~15%): Testing SDKs against the live service revealed mismatches between the spec and actual service behavior - missing response properties, incorrect parameter names (camelCase vs snake_case), wrong numeric formats, enum typos, and incorrect response codes.
nibooy
pushed a commit
that referenced
this pull request
Feb 24, 2026
…ter-driven breaking changes (#36381) Changes are grouped by OAD (OpenAPI diff) rule code, with explanations of why each category of change was necessary. Context: This is a preview API version. These breaking changes were introduced during the SDK generation and review process, none affect a GA API surface. Root Causes All breaking changes fall into three root-cause categories: SDK Review Feedback (~60%): Model renames, enum renames, operation ID changes, parameter renames, and numeric type right-sizing were requested by SDK review boards for .NET, Java, JavaScript, and Python to ensure generated SDKs follow Azure SDK guidelines for naming, clarity, and ergonomics. TypeSpec OpenAPI 2.0 Emitter Limitations (~25%): The TypeSpec compiler's OpenAPI 2.0 emitter could not properly represent certain constructs (union types, discriminated polymorphism, XML/binary responses). This produced empty definitions, missing discriminators, or incorrect types in the generated OpenAPI spec. These issues were silent in validation but caused real serialization/deserialization failures in SDK clients. Specification Accuracy (~15%): Testing SDKs against the live service revealed mismatches between the spec and actual service behavior - missing response properties, incorrect parameter names (camelCase vs snake_case), wrong numeric formats, enum typos, and incorrect response codes.
nibooy
pushed a commit
that referenced
this pull request
Feb 24, 2026
…ter-driven breaking changes (#36381) Changes are grouped by OAD (OpenAPI diff) rule code, with explanations of why each category of change was necessary. Context: This is a preview API version. These breaking changes were introduced during the SDK generation and review process, none affect a GA API surface. Root Causes All breaking changes fall into three root-cause categories: SDK Review Feedback (~60%): Model renames, enum renames, operation ID changes, parameter renames, and numeric type right-sizing were requested by SDK review boards for .NET, Java, JavaScript, and Python to ensure generated SDKs follow Azure SDK guidelines for naming, clarity, and ergonomics. TypeSpec OpenAPI 2.0 Emitter Limitations (~25%): The TypeSpec compiler's OpenAPI 2.0 emitter could not properly represent certain constructs (union types, discriminated polymorphism, XML/binary responses). This produced empty definitions, missing discriminators, or incorrect types in the generated OpenAPI spec. These issues were silent in validation but caused real serialization/deserialization failures in SDK clients. Specification Accuracy (~15%): Testing SDKs against the live service revealed mismatches between the spec and actual service behavior - missing response properties, incorrect parameter names (camelCase vs snake_case), wrong numeric formats, enum typos, and incorrect response codes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Breaking Changes - Microsoft Planetary Computer SDK
This is a AI-generated summary of all breaking changes detected in the
2025-04-30-previewOpenAPI specification forMicrosoft.PlanetaryComputer. Changes are grouped by OAD (OpenAPI diff) rule code, with explanations of why each category of change was necessary.Root Causes
All breaking changes fall into three root-cause categories:
SDK Review Feedback (~60%): Model renames, enum renames, operation ID changes, parameter renames, and numeric type right-sizing were requested by SDK review boards for .NET, Java, JavaScript, and Python to ensure generated SDKs follow Azure SDK guidelines for naming, clarity, and ergonomics.
TypeSpec OpenAPI 2.0 Emitter Limitations (~25%): The TypeSpec compiler's OpenAPI 2.0 emitter could not properly represent certain constructs (union types, discriminated polymorphism, XML/binary responses). This produced empty definitions, missing discriminators, or incorrect types in the generated OpenAPI spec. These issues were silent in validation but caused real serialization/deserialization failures in SDK clients.
Specification Accuracy (~15%): Testing SDKs against the live service revealed mismatches between the spec and actual service behavior - missing response properties, incorrect parameter names (camelCase vs snake_case), wrong numeric formats, enum typos, and incorrect response codes.
1017 - ReferenceRedirection (217 occurrences)
What: The
$refproperty points to different model definitions in the new version compared to the old.Affected models (old → new):
ImageRequestImageParametersImageResponseImageResponse(restructured)TileJsonResponseTileJsonMetadataBoundsResponseStacItemBoundsExtentStacExtensionExtentSpatialExtentStacExtensionSpatialExtentFeatureCollectionsStacCatalogCollectionsLandingPageStacLandingPageAssetStacAssetMetadataMosaicMetadataPgStacSearchTilerStacSearchDefinitionTitilerPgstacModelInfoTilerStacSearchRegistrationSasTokenSharedAccessSignatureTokenFeaturePolygonDictStrRioTilerModelsInfoTilerInfoGeoJsonFeatureGeoJsonStatisticsItemCollectionResponseStacItemStatisticsGeoJsonWhy necessary: SDK reviewers flagged that many auto-generated model names were non-idiomatic, too verbose, or leaked internal implementation details (e.g.
PgStacSearch,TitilerPgstacModelInfo,FeaturePolygonDictStrRioTilerModelsInfo). Models were renamed to follow Azure SDK naming conventions using clear, domain-specific prefixes (e.g.Stac*,Tiler*,Mosaic*). Additionally, some models ending inCollectionwere renamed to avoid collision with SDK client name conventions (e.g.FeatureCollections→StacCatalogCollections). In several cases, the TypeSpec OpenAPI 2.0 emitter produced empty definitions for union types which could not be properly deserialized by SDK clients - forcing use of discriminated types which changed the$reftargets.1042 - ChangedParameterOrder (109 occurrences)
What: The order of parameters in operations changed between versions.
Affected operations: Tiler tile endpoints (
tilejson.json,WMTSCapabilities.xml, tile gets), mosaic endpoints, and statistics endpoints. Path parameters (e.g.collectionId,itemId) moved to different positions relative to query parameters.Why necessary: The TypeSpec specification was refactored to use common parameter models and the
@query/@pathdecorator ordering was standardized. Query parameters were grouped logically (rendering parameters first, then path parameters). This is a cosmetic change in the OpenAPI spec - the wire protocol is unchanged since parameter names and locations (pathvsquery) remain the same. SDK generators had issues with excessively long operation signatures, and parameters were reordered for better ergonomics.1043 - AddingOptionalParameter (102 occurrences)
What: New optional parameters were added to existing operations.
Key addition:
asset_bidxparameter added across all tiler, WMTS, and statistics endpoints.Why necessary: The
assetBidxparameter (camelCase) was renamed toasset_bidx(snake_case) to match the wire-format the service actually expects. The old camelCase name was a serialization artifact from the TypeSpec emitter. Since the parameter name changed, OAD reports it as a removal ofassetBidxand addition ofasset_bidx. This was required to fix actual SDK serialization failures when calling the service.1047 - XmsEnumChanged (82 occurrences)
What: The
x-ms-enumname on enum types changed between versions.Key renames:
TileJsonSchemeTileAddressingSchemeImageTypeTilerImageFormatImageRequestFormatTilerImageExportFormatSignTypeAssetUrlSigningModeSortDirectionsStacQueryResultsSortingDirectionAlgorithmTerrainAlgorithmJsonSchemaStacQueryableJsonSchemaWhy necessary: SDK reviewers required that enum type names be descriptive and unambiguous. Generic names like
ImageType,SignType, andAlgorithmcaused naming collisions in generated SDKs and did not convey their purpose. Renaming to domain-qualified names (e.g.TilerImageFormat,AssetUrlSigningMode) resolved these issues and satisfied SDK review guidelines.1034 - AddedRequiredProperty (48 occurrences)
What: New properties were marked as required that were not required before.
Key additions:
type- added as required onGeometry(discriminator property for GeoJSON types)url- added as required onImageResponsebbox- added as required on bounding box modelsgeometry,collection,assets- added as required on STAC item modelsWhy necessary: The original TypeSpec used union types for GeoJSON geometry which emitted as empty definitions in OpenAPI 2.0. These empty definitions silently passed model validation but caused deserialization failures in actual SDK usage - the SDK could not determine which concrete type to instantiate. Switching to discriminated types with
typeas the required discriminator property fixed serialization/deserialization in all language SDKs. Required properties likeurlonImageResponsewere added because the previousfileresponse type could not be properly handled by SDK emitters, requiring a structured response model instead.1023 - TypeFormatChanged (46 occurrences)
What: Property format changed (e.g.
double→float,int64→int32, addeddate-timeorint32formats).Key changes:
double→floaton bounding box coordinates, statistics valuesint64→int32on zoom levels, tile coordinates, dimensionsint32/date-timeformats where none existed beforeWhy necessary: The original spec used
float64andint64TypeSpec types which are unnecessarily wide for geospatial data (tile zoom levels are 0–24, coordinates fit in float32). Using 64-bit types caused AOT trim warnings in .NET and unnecessary memory overhead. SDK reviewers requested right-sized numeric types. Additionally, some properties lacked explicit format annotations, causing SDK generators to use default types that didn't match the actual data.1026 - TypeChanged (45 occurrences)
What: Properties or response schemas changed their JSON type.
Key changes:
file→objecton static image export response (structuredImageResponsemodel)string→fileon WMTS XML capabilities response (actual XML document)'' (empty)→objecton geometry properties (discriminated union)object→'' (empty)orarray→'' (empty)on models restructured from union typesWhy necessary: The TypeSpec OpenAPI 2.0 emitter could not represent union types properly, producing empty type definitions or incorrect type annotations. For example, XML responses were typed as
stringwhen they should befile(binary stream), and image export responses werefilewhen they needed to be a structuredImageResponsecontaining a URL. These changes fixed SDK generation failures where the emitter could not handle the response types, and fixed runtime deserialization errors discovered during SDK testing against the live service.1046 - RemovedOptionalParameter (43 occurrences)
What: Optional parameters were removed from operations.
Key removal:
assetBidxwas removed across all tiler and statistics endpoints.Why necessary: This is the counterpart of the
asset_bidxaddition (code 1043). The camelCaseassetBidxparameter name was a serialization artifact that did not match the wire-format the service expects (asset_bidx). Renaming the parameter fixed SDK requests that were silently failing or being ignored by the service. See code 1043 above.1033 - RemovedProperty (37 occurrences)
What: Properties found in the old version are missing in the new version.
Key removals:
filter-lang,filter,sortbyCqlImageParametersand flattenedformat,maskImageRequest→ImageParametersformatbecame a query parameter;maskwas not used by the servicedataAssetStatisticsResponseadditionalPropertiesmap for dynamic per-band statisticsbbox,features,links,contextstac_version,stac_extensionsmsft:_created,msft:_updated,msft:short_descriptionLandingPage→StacLandingPageWhy necessary: SDK testing against the live service revealed that the original model structure produced empty/incorrect JSON during serialization. Properties like
dataonAssetStatisticsResponsedidn't match the actual service response shape (which returns a dynamic map of band names to statistics). CQL filter properties were restructured after SDK review feedback to provide a cleaner API surface. Some "removed" properties appear as removals because the containing model was renamed entirely.1012 - RemovedResponseCode (29 occurrences)
What: The
204 No Contentresponse code was removed from multiple operations.Affected operations: Static image export status, WMTS capabilities, asset listing, and other operations that previously returned 204.
Why necessary: The JavaScript SDK emitter could not handle
voidresult types for async operations that returned 204. The LRO (long-running operation) pattern was reworked to always return a result body. Additionally, 204 responses on GET operations (WMTS, assets) were incorrect - these operations always return content when the resource exists and should return 404 when it doesn't.1025 - ModifiedOperationId (26 occurrences)
What: Operation IDs changed, which directly impacts generated SDK method names.
Key renames:
StacCollectionOperations_GetAllStacCollections_GetAllTilerPoints_GetLonLatTilerPoints_GetPointMosaicsAssetsForPoints_GetLonLatAssetsMosaicsAssetsForPoints_GetPointAssetsMapsClassmapLegends_GetMapsClassMapLegends_GetMapsIntervalLegends_GetByClassmapNameMapsIntervalLegends_GetByClassMapNameTilerGeoJsonStatistics_GetAllTilerGeoJsonStatistics_Get*_GetZxyScalexFormat*_GetZxyScaleByFormat*_CropWidthxHeightFormat*_CropWidthByHeightFormat*_GetMinxMinyMaxxMaxyFormat*_GetCroppedToBoundingBoxWhy necessary: SDK reviewers required operation names to be clear and self-documenting. Names using
xas a separator (e.g.ScalexFormat) were ambiguous - isxa multiplication sign or a separator? These were changed toScaleByFormat. Abbreviations likeLonLatwere expanded toPointfor clarity. Internal implementation details in operation groups (e.g.StacCollectionOperations) were simplified toStacCollections. Casing fixes (Classmap→ClassMap) were required for PascalCase consistency.1035 - AddingRequiredParameter (12 occurrences)
What: New required parameters were added to existing operations.
Key additions:
collection,colorMapName,latitude,longitudeWhy necessary: These are the renamed counterparts of removed parameters (code 1039).
lat/lonwere renamed tolatitude/longitudefor clarity per SDK review.cmapNamewas renamed tocolorMapName. Thecollectionparameter was added to mosaic asset endpoints that previously inferred it.1021 - AddedAdditionalProperties (11 occurrences)
What:
additionalPropertieswas added to model definitions.Affected models:
ImageParameters.cql,AssetStatisticsResponse, and others.Why necessary: The CQL filter object and statistics response contain dynamic keys that cannot be modeled with fixed property names. The original spec attempted to model these as concrete types, but this caused SDK serialization to fail because the actual JSON payloads from the service contain arbitrary property names (e.g. band names in statistics, CQL filter expressions). Using
additionalProperties(mapped toRecord<unknown>in TypeSpec) correctly models these dynamic payloads and enables proper deserialization in Java and C# SDKs.1032 - RemovedEnumValue (10 occurrences)
What: Enum values were removed from enum types.
Key removals:
FeatureCollectionremoved (replaced byFeatureon response type discriminator)lastbandhightremoved (typo corrected tolastbandhigh)Why necessary:
FeatureCollectionwas incorrectly placed on a single-feature response discriminator - the correct value isFeature. Thelastbandhightvalue was a typo in the original spec that was corrected tolastbandhigh.1031 - AddedEnumValue (10 occurrences)
What: New enum values were added.
Key additions:
Featureadded (correct discriminator value)lastbandhighadded (corrected spelling)Why necessary: Counterparts to the removed enum values above. These are bug fixes to the spec.
1039 - RemovedRequiredParameter (10 occurrences)
What: Required parameters were removed from operations.
Key removals:
cmapName,lat,lonWhy necessary: These parameters were renamed for clarity per SDK review feedback.
lat/lon→latitude/longitude,cmapName→colorMapName. See code 1035 above.1027 - AddedPropertyInResponse (8 occurrences)
What: New properties appeared in response models.
Key additions:
bbox,collection,crs,propertieson various STAC item and GeoJSON response models.Why necessary: The original TypeSpec spec used empty/underspecified models for GeoJSON responses. When the SDK hit the live service, the response JSON contained properties (
bbox,collection,crs,properties) that were not in the spec, causing deserialization warnings or lost data. These properties were added to match the actual service response shape.1030 - DifferentDiscriminator (7 occurrences)
What: The discriminator property changed on polymorphic models.
Affected models:
Geometry(GeoJSON geometry types), tiler response types.Why necessary: The original spec used TypeSpec union types for GeoJSON geometry, which the OpenAPI 2.0 emitter rendered without discriminators (or with empty base types). This made it impossible for SDKs to deserialize polymorphic geometry - the SDK could not determine whether a geometry was a
Point,Polygon,MultiPolygon, etc. Switching to discriminated types withtypeas the discriminator property is the standard GeoJSON approach and enabled proper polymorphic deserialization across all SDKs.1028 - ArrayCollectionFormatChanged (6 occurrences)
What: The
collectionFormatfor array-type query parameters changed.Affected parameters:
assets,asset_bidxon statistics and tiler endpoints.Why necessary: The default
collectionFormatemitted by TypeSpec did not match what the service expects. The service requires multi-valued query parameters in a specific format. This was discovered during SDK testing when array parameters were not being serialized correctly.1036 - ConstraintChanged (2 occurrences)
What: Validation constraints (
pattern) changed on parameters.Why necessary: UUID patterns and other string validation constraints were updated to use consistent, standard regex patterns across the spec. The previous patterns were either too permissive or inconsistent with Azure SDK conventions for resource identifiers.
Summary