All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog. This project adheres to Semantic Versioning rules, but omits the patch level in the spec version number.
For a roadmap including expected timeline, please refer to ROADMAP.md
- Added
@Consumption.aiHintannotation for AI consumption hints- Provides a free-text hint for AI consumers (e.g., LLMs or AI agents) on how to use or interpret an Entity, Type, or Service — kept separate from human-readable
@EndUserTextdescriptions - For JSON-based metadata formats, the corresponding property is
x-sap-ai-hint
- Provides a free-text hint for AI consumers (e.g., LLMs or AI agents) on how to use or interpret an Entity, Type, or Service — kept separate from human-readable
- Fixed JSON Schema
minItems: 1constraint to the mandatory arrays in the@EntityRelationshipvocabulary, so an empty array no longer passes validation for a required list. Affects@EntityRelationship.EntityId.propertyTypes, ,@EntityRelationship.TemporalId.propertyTypes,@EntityRelationship.TemporalReference.referencedPropertyTypes, and@EntityRelationship.ReferenceTargetWithConstantId.referencedPropertyTypes.minItems: 2constraint to@EntityRelationship.CompositeReference.referencedPropertyTypes. This is a correction of the schema to follow the specification, having no items, semantically violates the specification.
- Added
@PersonalData.relatedDataCategoryIDannotation - Added
IS_BLOCKED_INDICATORas enum value to@PersonalData.fieldSemantics - Added
DATA_CATEGORY_IDas enum value to@PersonalData.fieldSemantics - Added
@API.element.successorand@API.element.decommissioningPlannedForYearMonthas individual full-path annotations. They mirror the corresponding sub-properties of the existing grouped@API.elementannotation and are non-breaking additions to enable consumers to migrate to the flattened notation. The grouped@API.elementform remains supported. - Added
@Consumption.hiddenannotation
- Extending the x-extension-targets of
@PersonalData.isPotentialSensitivebyEntity
- Added new
@APIannotation vocabulary for release state definition of APIs parts (e.g. elements or associations)
- Added new
@DataIntegrationannotation vocabulary for data integration scenarios@DataIntegration.dataUnavailable: Specifies that the data of the element or entity is unavailable although it is part of the output structure
- Made
selectionDatePropertyin@EntityRelationship.TemporalReferenceoptional; when omitted, the consumer determines the selection date/time based on context (e.g., current date/time, start of a fiscal quarter, or another use-case-specific point in time)
- Fixed
csnInteropEffectiveenum to include"1.1"and"1.2"as valid values (previously only"1.0"was allowed) - Updated all examples and documentation to use
csnInteropEffective: "1.2"
-
BREAKING: Changed string enum notation to object notation
{ "#": "value" }for consistency across all vocabularies@EntityRelationship.temporalIntervalTypenow uses object notation (e.g.,{ "#": "CLOSED_CLOSED" })@EntityRelationship.temporalTypenow uses object notation (e.g.,{ "#": "DATE" })@EntityRelationship.categorynow uses object notation (e.g.,{ "#": "TEMPORAL_DATE" })- Note: We are not aware of consumers already using these features. These annotations may also rely on another missing feature: supporting range comparisons in join conditions.
-
BREAKING: Changed string enum notation to object notation
{ "#": "value" }for consistency across all vocabularies@PersonalData.entitySemanticsnow uses object notation (e.g.,{ "#": "DATA_SUBJECT" })@PersonalData.fieldSemanticsnow uses object notation (e.g.,{ "#": "PURPOSE_ID" })- enum values in the object notation change from
CapitalCamelCasetoUPPER_CASE_SNAKE_CASE. - Note: We are not aware of consumers already using these features.
-
BREAKING:
cds.Stringtype now has an explicit maximum length constraint of 5000 characters (default: 5000)- Previously, the length constraint was not enforced in the schema
- In practice,
cds.Stringwas always length-limited, which is whycds.LargeStringexists for unlimited/large strings cds.LargeStringandcds.LargeBinaryremain unlimited (no maximum constraint)- This change makes the schema consistent with actual CDS semantics
- Added new
cds.Int16type (signed integer with 16 bit) - Added new
cds.UInt8type (unsigned integer with 8 bit) - feat: extended the
oncondition for association and composition types to support operators>,>=,<, and<=
- Added
cds.Binaryandcds.LargeBinarytypes - Added new
@Semanticsannotations:@Semantics.mimeType@Semantics.largeObject.acceptableMimeTypes@Semantics.largeObject.mimeType@Semantics.largeObject.fileName
- Added
meta.document.nameto give the overall document a machine-readable name - Added
meta.document.namespaceto give the overall document a globally unique namespace - Allow
cds.Decimalto be used as a key, indicated viakeyboolean
- Added
@ObjectModel.customannotation
- typescript type
SpecJsonSchemaRootis missing in the packed NpmJS artefact
- BREAKING: TypeScript interface
CSNInteropRootrenamed toCSNInteropEffectiveDocument
- Added missing property
$idto annotation extension schemas - Added clarification that
key: truealso impliesnotNull: true - Added clarification that
precisionandscaleare RECOMMENDED to be added and MUST be added if own default assumptions diverge from the specified default. - Added explicit regexp pattern to
@EntityRelationshipEntity Type and Property Type IDs- Added the ID constraints from ORD page more explicitly back to CSN Interop page and fixed links
- Added explicit regexp pattern to
@ODMEntity IDs
- Fixed scope of
@ObjectModel.semanticKeyto be valid on Entity, not Type level.
- Added
@ObjectModel.tenantWideUniqueNameannotation
- Fixed the "scope" of annotations that belong to type, that they also apply to type definitions
- Added relevant annotations (extensions) explicitly to enum value object
- Added JSON Schema based constraints for element references used in
onconditions, element references array must have at least 1 item and most 2 items - Added JSON Schema based constraints for
onused in association and and composition,onarray must have min array items 3
- BREAKING: TypeScript interface
ValueObjectrenamed toEnumDictionaryEntryfor more clarity
- Fixed wrong enum notation for
@ObjectModel.usageType.sizeCategory- Correct use:
"@ObjectModel.usageType.sizeCategory": { "#": "XL" }
- Correct use:
- Added
@Semantics.valueRangeannotation - Added
UI_PROVIDER_PROJECTION_SOURCEas enum value toObjectModel.supportedCapabilities - Added
@ObjectModel.usageType.sizeCategoryannotation
- Changed
cardinalityfrom mandatory to recommended property.- All its values have defaults, so if it is missing
{ "min": 0, "max": 1}is assumed.
- All its values have defaults, so if it is missing
- BREAKING: deleted schema
csnInteropEffectiveSchemaWithAnnotations, for consumers usecsnInteropEffectiveSchemaequivalent instead - BREAKING: spec-toolkit no longer part of the csn-interop-specification package exports
- ADDED: Clear statement that
ElementRefreferenced element MUST exist locally in the same entity. - ADDED:
meta.document.titleto give the overall document a human-readable title
- BREAKING: wrong @Semantics.amountCurrencyCode annotation, should be @Semantics.amount.currencyCode
- BREAKING: wrong @Semantics.quantityUnitOfMeasure annotation, should be @Semantics.quantity.unitOfMeasure
- BREAKING: For custom types, we should not set
keyproperty - as this is decided on entity element level. - FIXED: JSON Schema export $ref from annotation extensions back to core spec (
ElementReference) was missing.
- BREAKING: Removing
csnInterop:0.1as we'll only release and support version1.0with the GA release. - BREAKING: JSON Schema / TS Interface renamed from
DerivedTypetoCustomType
- BREAKING:
$versionis now mandatory, as announced earlier - Added
docto add human-readable documentation (MAY be markdown) to CDS definitions and elements. - Improve schema validation messages and typescript types for element entry.
- fix(core): spec-toolkit exports
- fix: type of exported schema csnInteropEffectiveSchemaWithAnnotations
- fix(core): explicit typings for x-extension-targets and x-extension-point
-
Breaking: Not all properties are allowed for all CDS Types anymore
- Now all CDS Types have their own interfaces and define which properties (like
scale) are applicable - Providing properties that do not belong to the CDS types will now be a schema violation (e.g.
scaleforcds.String)
- Now all CDS Types have their own interfaces and define which properties (like
-
Breaking: done multiple renaming in the specification that affect the typescript types and JSON Schema names
ElementtoCdsTypeCustomElementtoDerivedType- all typescript ".cds" types (from e.g.
BooleanTypetoBooleanCdsType)
-
Added
@ObjectModel.compositionRootannotation -
Added
@AnalyticsDetails.measureTypeannotation -
Other:
- typescript added types specific default values
- Added soon to be mandatory
$versionto ensure compatibility with CDS CSN in general- Goal: CSN Interop is a valid subset of CSN
- Allowed values are
2.0.
- Added
DefinitionEntryvalidation schema based on if/then condition on discriminator propertykind: context | entity | service | type
- Added
meta.features- Added documentation of CSN feature dimensions of the CSN Interop Effective format.
- Added
completefeature dimension to be set by the document creator.
- Marked
@PersonalDataextension as stable (has been approved) - Added
@Consumption.valueHelpDefinition.additionalBinding.usage - Added
@Consumption.valueHelpDefinition.distinctValues - Added
@Consumption.valueHelpDefinition.association
- Renamed
cds.Uuidtype tocds.UUID(as provided by CAP)