# Changelog 2026

:::info Open Source Changelogs
For repositories and plugins that are open source, please check out the respective changelogs in the [cap-js organization](https://github.com/cap-js) and the [CAP Community](https://github.com/cap-js-community).
:::

<style scoped >
  em { font-style:normal; font-weight: 500 }
  em:after { content:" —" }
  li { margin: 5px 0; }
</style>

## September 2026

### Added {#sep-26-added}

- _[cds-dk@10.1.0]_ `cds add hana-serverless` sets up SAP HANA Cloud serverless as the database, provisioning one HDI container per tenant through the serverless Tenant API.
- _[cds-dk@10.1.0]_ `cds add ai` now supports a `--plan` option to set the AI Core service plan in `mta.yaml` (default: `standard`).
- _[cds-dk@10.1.0]_ `cds add data` now supports a `--keys-only` option that, together with `--records`, fills only key columns in the generated CSV files and leaves all other columns empty.
- _[cds-dk@10.1.0]_ `cds add data` now generates values for `Binary`/`LargeBinary` (base64) and `Vector` (JSON array) elements instead of leaving them empty.
- _[cds-dk@10.1.0]_ `cds add data` now supports a `--composition-records` option to control how many records are generated per to-many composition (default 2).
- _[cds-dk@10.1.0]_ `cds add` now accepts space-separated features in addition to comma-separated, e.g. `cds add xsuaa hana nodejs`.
- _[cds-dk@10.1.0]_ `cds add extensibility` now adds an `ExtensionDeveloper` role collection to `mta.yaml` (suffixed `${org}-${space}`) and `chart/values.yaml` (suffixed with the Kyma namespace), so it can be assigned immediately after deployment.
- _[cds-dk@10.1.0]_ `cds version` now also shows the npm version and executable path.
- _[vscode-cds@10.1.0]_ Formatting: new option `maxAlignmentWhitespace` to disable an alignment that would leave more than the configured number of blanks before any of its members, counting the mandatory separating blank
- _[vscode-cds@10.1.0]_ User setting to compile as many model files as possible in one compilation. To enable set `cds.workspace.compileFilesSeparately` to `false`.
  This will **boost performance** for many larger models. In case `duplicate definition` diagnostics appear check
  the files involved, and in case some files should not be picked up, add the glob patterns to `cds.workspace.additionalIgnorePatterns`
  (as _workspace_ setting).
- _[cds.java@5.1.0]_ `$user.<attr>` references in `@restrict` annotations now also resolve attributes from `UserInfo.getAdditionalAttributes()` (e.g. JWT claims like `email`, `givenName`). Regular attributes take precedence over additional attributes.
- _[cds.java@5.1.0]_ Propagation of the XSUAA subdomain (based on the attribute `subDomain` from the `UserInfo`) is now configurable, as it's not required by CloudSDK, anymore. Set `cds.cloudsdk.propagateXsuaaSubdomain` to `false` to omit propagation. Default value is `true` to keep the previous behavior.
- _[cds.java@5.1.0]_ The `watch` goal of the `cds-maven-plugin` provides a new fast mode which can be enabled with property `-Dfast`.
- _[cds.java@5.1.0]_ The SPII integration (ie. `cds-feature-ucl`) now also supports updates of SPII integrations.
- _[cds.java@5.1.0]_ In development mode, OpenTelemetry request traces originating from CAP are logged as indented timing trees to the console with elapsed times, showcasing the same information published to Cloud Logging in production. The feature can be explicity disabled by setting `cds.telemetry.dev-output.enabled: false`.
- _[cds.java@5.1.0]_ Setting the logger group `com.sap.cds.telemetry` to `DEBUG` now enables all of CAP's OpenTelemetry spans.
- _[cds.java@5.1.0]_ Option `generateClasses` of the `generate` goal of `cds-maven-plugin` generates static implementations for event contexts and their inner interfaces.
- _[cds.java@5.1.0]_ Serveral goals of the `cds-maven-plugin` are thread-safe and can be executed in parallel, e.g. with Maven Daemon.
- _[cds.java@5.1.0]_ The query tool of the `cds-adapter-mcp` supports distinct in selects.
- _[cds.java@5.1.0]_ HCQL V2: Adapter and remote HCQL client support `$count` in the response.
- _[cds.java@5.1.0]_ Support OData v4.01 Json format for [Batch Requests and Responses](https://docs.oasis-open.org/odata/odata-json-format/v4.01/odata-json-format-v4.01.html#sec_BatchResponse)
- _[cds.java@5.1.0]_ Implicit sorting: search request without an explicit `orderby` are now automatically sorted by relevance.
- _[cds.java@5.1.0]_ Type handling in multitenant database credentials is now more robust.
- _[cds4j@5.1.0]_ The `CqnContainmentTest` now supports the new mode `LIKE` to filter values using an SQL LIKE pattern.
- _[cds4j@5.1.0]_ Method `Expand.excluding(...)` to exclude elements from an expand.
- _[cds4j@5.1.0]_ `UserContext` now supports a unified `Map<String, Object>` attribute map via `attributes(Map)` / `attribute(String)`, enabling custom user attributes (e.g. from JWT claims) to be resolved in managed aspects (`$user.<attr>`).
- _[cds4j@5.1.0]_ Added `$score` ref to get the score value of a fuzzy search result on the select list and in orderBy. (beta)
- _[cds4j@5.1.0]_ The default sort order of a hierarchy view is defined by `@cds.default.order`. If no annotation is present, the `order by` of the projection is used instead.
- _[cds@10.1.0]_ New `sqlite:memory` preset for `cds.requires.db` runs an in-memory SQLite database, now also in production
- _[cds@10.1.0]_ New `hana-serverless` kind for `cds.requires.db` connects to a HANA Cloud serverless instance (Beta)
- _[cds@10.1.0]_ Node.js-native `fetch` client now resolves named destinations through the SAP BTP Destination service for `NoAuthentication`, `BasicAuthentication`, and `OAuth2ClientCredentials` (proxy type `Internet` only) (beta)
- _[cds-mtxs@4.1.0]_ `cds.env.features.native_hdi_deploy` can now enable native HANA tenant deployment with delta uploads, bulk HDI inputs, and streaming for large artifacts.

### Changed {#sep-26-changed}

- _[cds-dk@10.1.0]_ `cds watch` now ignores the `.cds` folder by default, alongside the existing defaults like `node_modules` and `gen`. `.cds` model files and `.cdsrc.json` are unaffected.
- _[cds-dk@10.1.0]_ `cds compile -2 asyncapi` and `cds import --asyncapi` are now provided by `@cap-js/asyncapi` as a CDS plugin. The plugin is currently still bundled with `@sap/cds-dk`. Add it explicitly to your `devDependencies` as it will be removed in a future version.
- _[cds-dk@10.1.0]_ `cds build` now packages npm workspace dependencies as tarballs by default, use `--no-ws-pack` to disable.
- _[cds-dk@10.1.0]_ `cds completion` now comes with pre-calculated shell scripts for faster tab-completion.  Also, it no longer disturbs shell completion in VS Code debug terminals.
- _[cds-dk@10.1.0]_ `cds add approuter` now uses `@sap/approuter@^23.0.0` instead of `@sap/approuter@^22.0.0`.
- _[vscode-cds@10.1.0]_ Minimum VSCode version is now 1.123.0
- _[cds.java@5.1.0]_ Don't read elements `DraftAdministrativeData_DraftUUID`, `HasActiveEntity`  and `HasDraftEntity` during edit-draft action.
- _[cds.java@5.1.0]_ `cds-feature-ord` has moved to Open Source and is now versioned independently from CDS Services.
- _[cds4j@5.1.0]_ Reduced the memory footprint of bulk update/upsert element determination by avoiding intermediate `Stream` allocations when collecting the affected element paths.
- _[cds4j@5.1.0]_ Removed support for Mongo DB (internal, unreleased)
- _[cds4j@5.1.0]_ The `CQL.toUpper` and `.toLower` methods now accept a `CqnValue`.
- _[cds4j@5.1.0]_ Deprecated `UserContext.setAttributes(Map<String, List<String>>)`, `getAttribute(String)`, and `getAttributes()` in favor of the new unified API.
- _[cds@10.1.0]_ `cds.spawn` uses dedicated, short-lived transaction for fetching extended models
- _[cds@10.1.0]_ Messaging webhook endpoints are no longer registered anonymously in production when neither `cds.requires.auth` nor `cds.requires.messaging.xsuaa` is configured.
- _[cds@10.1.0]_ UCL tenant mapping notification handlers will be scheduled as `tenant: receiverTenant` instead of anonymously

### Fixed {#sep-26-fixed}

- _[cds-dk@10.1.2]_ `cds` no longer crashes with an `ENOENT` (`uv_cwd`) stack trace when the shell's current directory has been deleted, for example, during tab-completion.
- _[cds-dk@10.1.2]_ `cds build --for java` no longer writes Node.js runtime messages.
- _[cds-dk@10.1.2]_ `cds build` preserves line breaks in merged `messages.properties` bundles.
- _[cds-dk@10.1.2]_ `cds add xsuaa` no longer generates an invalid `mta.yaml` when added after `workzone`.
- _[cds-dk@10.1.2]_ `cds add cloud-logging` now binds existing approuter and multitenancy modules when `mta` is added later.
- _[cds-dk@10.1.2]_ `cds add enterprise-messaging` and `cds add event-mesh` now contribute to an MTA descriptor added later.
- _[cds-dk@10.1.2]_ `cds add destination` now binds existing approuter and multitenancy modules when `mta` is added later.
- _[cds-dk@8.9.13]_ CVE-2025-15284: update `express` to fix vulnerability with `qs` <6.14.1
- _[cds-dk@10.1.0]_ `cds up` now forwards `BP_DEPENDENCY_MIRROR_*` variables to Paketo buildpacks.
- _[cds-dk@10.1.0]_ `cds add data` now generates values across the full `@assert.range` when the range lies outside the default `[0,100]`, instead of emitting the lower bound for every record (integers) or exceeding the upper bound (decimals).
- _[cds-dk@10.1.0]_ `cds add data` now generates varying `Time` values instead of the same fixed `22:59:53` for every record.
- _[cds-dk@10.1.0]_ `cds add data` now honors `@assert.range` on `Double` elements instead of generating values across the default `[0,100]` regardless of the annotation.
- _[cds-dk@10.1.0]_ `cds add data` now generates whole numbers for `Integer` elements whose `@assert.range` uses fractional bounds, instead of emitting fractional values.
- _[cds-dk@10.1.0]_ `cds add data` now generates varied values for `Decimal` elements whose scale equals their precision (such as `Decimal(2,2)`), instead of emitting `0` for every record.
- _[cds-dk@10.1.0]_ `cds add data` now honors `@assert.range` on `Timestamp` elements instead of always generating dates in the default `2000-2024` window.
- _[cds-dk@10.1.0]_ `cds add data` no longer crashes with `Invalid time value` when a `Date` element has a single-day `@assert.range`.
- _[cds-dk@10.1.0]_ `cds add data` now generates varied dates within `@assert.range` bounds on `Date`, `DateTime` and `Timestamp` elements when the range lies entirely outside the default `2000-2024` window, instead of emitting the same out-of-range value for every record.
- _[cds-dk@10.1.0]_ `cds add data` now honors open-interval and infinity `@assert.range` bounds (such as `[(0),_]` or `[(5),(10)]`) on numeric and date elements, instead of ignoring them and generating values across the default range.
- _[cds-dk@10.1.0]_ `cds add data` no longer includes excluded bounds when generating scaled decimals for open `@assert.range` intervals.
- _[cds-dk@10.1.0]_ `cds add data` now generates the exact day for `Date` elements regardless of the local timezone, instead of occasionally emitting the day before the intended date.
- _[cds-dk@10.1.0]_ `cds add data` now generates multiple distinct rows for link entities whose key consists of two or more associations, instead of collapsing them to a single row.
- _[cds-dk@10.1.0]_ `cds add data` now writes the foreign-key column for to-one compositions into the parent CSV, instead of leaving the parent unlinked to its generated child.
- _[cds-dk@10.1.0]_ `cds add data` now honors an `@assert.range` on an `array of` scalar element, so the generated array elements stay within the annotated bounds.
- _[cds-dk@10.1.0]_ `cds add data` now generates the requested number of distinct rows for a standalone link entity whose key associations point to entities created on demand, instead of collapsing them to a single row.
- _[cds-dk@10.1.0]_ `cds add data` now pairs two distinct target rows in a self-referential link entity (two key associations to the same entity), instead of pointing both foreign keys at the same row.
- _[cds-dk@10.1.0]_ `cds build --ws-pack` now also packs the workspace root package into a module's `gen/srv` when the module depends on it via a `file:` spec, so monorepos whose root package is itself a dependency no longer need to pack it by hand.
- _[cds-dk@10.1.0]_ `cds bind --to-app-services` no longer classifies a machine-to-machine `identity` binding that consumes another service (carrying `consumed-services`) as the application's user authentication, so it no longer overwrites the real `xsuaa` auth binding.
- _[cds-dk@10.1.0]_ `cds build` now copies the workspace root `package-lock.json` into a module's `gen/srv` when the module has none, so npm workspaces monorepo deployments get frozen dependencies instead of freshly resolved ranges.
- _[cds-dk@10.1.0]_ `cds build` now copies `.cdsrc.yaml` into the deployment output folder alongside `.cdsrc.json`, so YAML-based CDS configuration works correctly when deployed to Cloud Foundry.
- _[cds-dk@10.1.0]_ `cds import --from asyncapi` now correctly imports types referenced via `$ref` in AsyncAPI schemas, including `allOf` composition, and no longer loses types from earlier events when a service has multiple events.
- _[cds-dk@10.1.0]_ `cds build` now correctly resolves `manifest.json` for UI5 CLI v5 component projects, which use a `src/` folder instead of `webapp/`.
- _[cds-dk@10.1.0]_ `cds build --for fiori` now honors custom `resources.configuration.paths` mappings in `ui5.yaml` when locating a UI module's `manifest.json`.
- _[cds-dk@10.1.0]_ `cds add html5-repo`, `cds add workzone`, and `cds add portal` no longer emit an HTML5 application content deployer module into `mta.yaml` when the project has no UI apps, avoiding the `could not find the ".../gen/app" path` build failure.
- _[cds-dk@10.1.0]_ `cds up` now pushes buildpack images directly to the registry via `pack build --publish`, avoiding the `manifest invalid` error on containerd-backed Docker daemons.
- _[cds-dk@10.1.0]_ `cds add app-front` avoids duplicates for `srv-api` in `xs-app.json` if entries pre-exist.
- _[cds-dk@10.1.0]_ `cds add ias` (and `cds add ams`) with an approuter no longer leaves a stray `properties.name: srv-api` on the approuter's `srv-api` destination in `mta.yaml`, which uses certificate-based forwarding instead.
- _[cds-dk@10.1.0]_ `cds add sample` fixes cds files such that `const { Books } = cds.entities` works, i.e. the default namespace is set.
- _[cds-dk@8.9.13]_ CVE-2025-15284: update `express` to fix vulnerability with `qs` <6.14.1
- _[vscode-cds@10.1.0]_ Syntax highlighting for CQL strings now also works when there are spaces between `cds.ql` and the opening string. Having a newline between `cds.ql` and the opening backtick is still not supported.
- _[vscode-cds@10.1.0]_ Syntax highlighting: delimited and quoted identifiers in `using`, `namespace`, `context` and `extend`
- _[vscode-cds@10.1.0]_ Syntax highlighting: multiple `;`-separated elements or enum values on a single line
- _[vscode-cds@10.1.0]_ Syntax highlighting: first segment of a qualified type path (`Foo:bar`)
- _[cds-compiler@7.1.1]_ **effective:**
  + Fix dump in flattening for actions with entity parameters.
  + Ensure consistent handling of reference-like annotation expressions during flattening.
- _[cds-compiler@7.1.1]_ **sql:**
  + Add missing `@hierarchy` columns to localized convenience views.
  + Avoid crash on mixin backlink with renamed target element.
  + The generated SQL for a reference `assoc.elem` where `assoc` is an association defined with duplicate backlink comparisons with `$self` is now more likely
    to be correct. Usually, there is an error for the definition of such an `assoc`, but the corresponding message can be downgraded to a warning.
- _[cds-compiler@6.9.5]_ **effective:**
  + Fix dump in flattening for actions with entity parameters.
  + Ensure consistent handling of reference-like annotation expressions during flattening.
- _[cds-compiler@6.9.5]_ **sql:** Add missing `@hierarchy` columns to localized convenience views.
- _[cds.java@5.1.1]_ Avoid CDS4j version with broken `cds4j-cql` artifact.
- _[cds.java@5.1.0]_ Fixed `ClassCastException` in `DraftScenarioAnalyzer` when a `WHERE` clause contains an `IN`-subquery predicate (e.g. `value.in(Select.from(...))`).
- _[cds.java@5.1.0]_ Fixed a bug in OData V4 returning 404 instead of 204, when following a valid navigation property that has a null value.
- _[cds.java@5.1.0]_ Code generated by the `generate` goal of the `cds-maven-plugin` with `generateClasses` set to `true` no longer triggers Java compiler warnings.
- _[cds.java@5.1.0]_ Fixed a bug causing a `DestinationAccessException´ when reading Service Manager bindings that were created with `X509_ATTESTED` (ie. zero trust).
- _[cds.java@5.1.0]_ Fixed a bug, causing unexpected removal of a tenant's DataSource from the cache, if HDI container deletion is skipped during unsubscribe.
- _[cds.java@5.1.0]_ Fixed a bug, causing missing draft messages, in case `cds.drafts.persistence` is set to `split`.
- _[cds.java@5.1.0]_ Fixed several bugs in the `generate` goal of the `cds-maven-plugin` when `interfacesForAspects` is enabled: builder interfaces used wrong types for aspect-derived entities, reverse associations targeting aspect members used wrong generated types, and inner interfaces of aspect-structured entities were generated incorrectly.
- _[cds.java@5.1.0]_ Fixed a bug causing a `NullPointerException` in OData v4 for the requests with `@bind:null` (v4.01) and `@odata.bind:null` (v4.0) (remove link to an association).
- _[cds.java@5.1.0]_ Fixed a bug causing OData v4 request with `$apply=filter()/...` to be rejected by filter restrictions check.
- _[cds.java@5.1.0]_ Fixed a bug causing OData v4 request with `GET /Entity(<requiredFilteredElement>=val,...)` to be rejected by filter restrictions check.
- _[cds.java@5.1.0]_ Fixed a bug, causing HTTP status `500` (`Cannot find type with name: <Service>.cds_Map`) for OData JSON `$metadata` requests, if the CDS Model exposes dynamic `Map` elements.
- _[cds.java@5.1.0]_ Fixed a bug, causing HTTP status `400` for OData v4 bound action requests on entity set with no namespace on action: `POST /com.sap.Service/com.sap.Entity/boundAction`
- _[cds.java@5.1.0]_ Fixed a bug in xsuaa scope prefix validation
- _[cds.java@5.1.0]_ Requests rejected by Spring Security's `StrictHttpFirewall` (e.g. URLs with matrix parameters such as telemetry requests with UI5 > 1.148) no longer produce `401 WWW-Authenticate: Basic` responses triggering repeated browser Basic-Auth popups.
- _[cds.java@5.1.0]_ Fixed a bug causing incorrect statements when writing draft messages on entities with instance-based authorizations.
- _[cds.java@5.1.0]_ Fixed a bug in OData v4 producing an incorrect decimal values in serialized payload for requests with `$apply` and HTTP header `IEEE754compatible=true`.
- _[cds4j@5.1.0]_ In CQN, the `count`, `startswith`, `endswith`, `matchespattern` and `countdistinct` functions are now represented in lower case, for compatibility with HCQL.
- _[cds4j@5.1.0]_ Fixed a bug where type casts on refs to a `cds.Map` starting with a to-one association were ignored.
- _[cds4j@5.1.0]_ Fixed a statement execution order induced deadlock on concurrent deep updates/upserts on the same target entity.
- _[cds4j@5.1.0]_ Preserve update hints during statement normalization.
- _[cds4j@5.1.0]_ Fixed `CdsElementNotFoundException` with `cds.sql.toOnePath.mode: optimize` on refs using break-outs like `$self`.
- _[cds4j@5.1.0]_ Fixed loss of inline count of expand during projection resolution.
- _[cds4j@5.1.0]_ Fixed a deep update silently setting a composition child's non-key backlink foreign key to `null` when the child carried a nested association whose ON condition shares that backlink FK element and was `null` in the payload.
- _[cds4j@5.1.0]_ Fixed expressions in function arguments being constructed as generic xpr when being parsed.
- _[cds@10.1.1]_ Messaging consumers (Event Mesh AMQP, Kafka, Redis) no longer crash with `TypeError: Cannot use 'in' operator to search for 'data' in null` when a message with a `null` payload is received
- _[cds@10.1.1]_ `cds.env` now correctly replaces an array default with an object project override instead of assigning object properties onto the array
- _[cds@10.1.1]_ SQLite now uses its default pool config (single, non-evicting connection) even when `@cap-js/sqlite` is installed globally rather than as a local dependency
- _[cds@10.1.1]_ Stripping of `IsActiveEntity` in programmatic deep updates to draft instances
- _[cds@10.1.1]_ Server crash when string keys contain control characters in OData `Location` response header
- _[cds@10.1.1]_ Binary keys in OData `Location` response header are now formatted as binary literals (`binary'...'`)
- _[cds@10.1.1]_ Skip periodic message processing when no provider tenant is configured
- _[cds@10.1.1]_ The parent-readable check during CREATE/navigation no longer swallows system errors (for example, database failures); such errors are now propagated instead of being masked as a `404`
- _[cds@10.1.1]_ Support X.509 in `enterprise-messaging`'s deploy task
- _[cds@10.1.1]_ Incompatibility of global config `cds.sql.lock_acquire_timeout` and event-queue implementation
- _[cds@10.1.1]_ Outbox messages written before `appid` was introduced are now processed after an upgrade instead of being skipped
- _[cds@10.1.1]_ A queued outbox message whose target service can't be resolved is now dead-lettered instead of crashing the application
- _[cds@10.1.1]_ Recurring scheduled tasks (`.every()`) are no longer resurrected when unscheduled while running, and re-submitting one while it runs no longer discards the updated schedule and payload
- _[cds@10.1.0]_ `@assert` messages using `{i18n>...}` placeholders are no longer mistaken for structured `error(...)` results
- _[cds@10.1.0]_ JSON `$batch` requests now reject invalid `atomicityGroup` identifiers
- _[cds@10.1.0]_ Scheduling a task via `srv.schedule(...).after(<delay>)` or `.every(<interval>)` with a delay above Node's 32-bit `setTimeout` limit (~24.8 days, e.g. `.after('30d')`) no longer emits a `TimeoutOverflowWarning` or fires almost immediately. Such delays are now armed as chained timers, so the task still fires at its exact scheduled time.
- _[cds@10.1.0]_ OData requests with unknown key names in the key predicate (e.g. `Books(ID=1,sad=2)`) are now rejected with `400 Bad Request` instead of causing a `500` error
- _[cds@10.1.0]_ `cds-rc.js` schema now has a `$id` so `jsonschema` 1.5 resolves internal `$ref`s correctly
- _[cds@10.1.0]_ REST `HEAD` responses now report byte-accurate `Content-Length` headers for Unicode JSON payloads
- _[cds@10.1.0]_ Query properties like `limit` and `recurse` are no longer lost when forwarded to remote services
- _[cds@10.1.0]_ `cds.requires.<name>.service = <name>` (a required service naming itself) no longer fails with a spurious `conflicts with` error on server start
- _[cds@10.1.0]_ `UPDATE` and `DELETE` remote-service-queries, that use `.where` instead of a key to specify their subject, will throw
- _[cds@10.1.0]_ Navigating to or creating under a parent protected by an instance-based `@restrict.where` now returns `404` when the parent is not readable
- _[cds@10.1.0]_ A static `@restrict.where` on a collection-bound action is now enforced, rejecting callers who do not satisfy the condition — previously it was silently ignored
- _[cds-mtxs@4.1.0]_ `SmsProvisioningService` certificate check is now better aligned with the Java implementation.
- _[cds-mtxs@4.1.0]_ Extension validation checks have been refined.
- _[cds-mtxs@4.1.0]_ `POST /-/cds/model-provider/getEdmx` now checks the requested service name more exactly.
- _[cds-mtxs@4.1.0]_ Callback url for Saas Registry and Subscription Manager is now determined in a more robust way.

### Removed {#sep-26-removed}

- _[cds@10.1.0]_ UCL GraphQL interface adapter as dead code after UCL deprecated the GraphQL on-boarding flow



## August 2026

### Added {#aug-26-added}

- _[cds-compiler@7.1.0]_ **compiler:**
  + It is now possible to extend a view/projection with a `where` or `having` clause, even if it already had one.
    Extensions are joined with `and` if such a clause already exists.
  + Publishing an association with an empty filter is now supported. For a managed association, this turns it
    into an unmanaged one. For an unmanaged association, it has no effect.
  + `select one` is now supported in `parse.cql` and `parse.expr`.
  + Compiler adds helper property `$backlink` to CSN. It enables compiler backends and other CSN consumers
    to better handle backlink comparisons with `$self`. This property may vanish in future releases.
- _[cds-compiler@7.1.0]_ **odata:**
  + Update OData vocabularies: Common and UI.
- _[cds-compiler@7.1.0]_ **sql:**
  + Wrap predicate columns in `CASE ... WHEN` for SAP HANA.
  + Support common `cds.Vector` functions on SAP HANA and Postgres.
- _[cds.java@4.9.3]_ `TenantProviderService` now supports the SaaS Registry/Subscription Manager API v2 for "Get All Subscriptions" endpoint. Use the property `cds.multiTenancy.useSaaSApiV2` to control the API version to use. Default is `false` to use existing v1 of the API.
- _[cds-mtxs@4.0.3]_ `cds-mtx subscribe`, `unsubscribe`, and `upgrade` now take more than one tenant at once, e.g. `cds-mtx upgrade t1 t2` or `cds-mtx upgrade t1,t2`.

### Changed {#aug-26-changed}

- _[cds-dk@10.0.8]_ `cds login` now uses the renamed login endpoints `/-/cds/login/grant` and `/-/cds/login/grant-metadata` with a legacy fallback, and updates saved legacy token URLs.
- _[cds-dk@10.0.7]_ `cds init --nodejs` creates a cleaned-up .gitignore file
- _[cds-dk@9.9.5]_ `cds login` now uses the renamed login endpoints `/-/cds/login/grant` and `/-/cds/login/grant-metadata` with a legacy fallback, and updates saved legacy token URLs.
- _[cds-compiler@7.1.0]_ **compiler:**
  + Issue a warning that a type with an unmanaged association can only be used as an include.
  + Omit empty extend for `extend … with definitions` from parsed CSN.
- _[cds-mtxs@4.0.3]_ Login endpoints renamed to `/-/cds/login/grant` and `/-/cds/login/grant-metadata` with redirects from former paths.
- _[cds-mtxs@4.0.2]_ When updating from `@sap/cds-mtxs@<3.6.0`, you now need to upgrade your tenant database before you can add new extensions.

### Fixed {#aug-26-fixed}

- _[cds-dk@10.0.7]_ Bundle `@sap/cds-mtxs` 4 again, instead of 3.
- _[cds-dk@10.0.7]_ `cds import --from asyncapi` now correctly imports types referenced via `$ref` in AsyncAPI schemas, including `allOf` composition, and no longer loses types from earlier events when a service has multiple events.
- _[cds-dk@10.0.7]_ `cds add html5-repo`, `cds add workzone`, and `cds add portal` no longer emit an HTML5 application content deployer module into `mta.yaml` when the project has no UI apps, avoiding the `could not find the ".../gen/app" path` build failure.
- _[cds-dk@10.0.7]_ `cds init --nodejs` creates the ESLint and VS Code config files again
- _[cds-compiler@7.1.0]_ **compiler:**
  + Properly render structures with property `...` in CDL.
  + Extending a `where`, `having` or `group by` clause from unrelated layers no longer results in an error.
    A warning is emitted when extending an `order by` clause from unrelated layers.
- _[cds-compiler@7.1.0]_ **effective:**
  + Correctly rewrite references in annotation expressions inside arrays.
  + Add option to replace annotation expressions by strings to evade error situations.
- _[cds-compiler@7.1.0]_ **sql:**
  + Don't dump while reporting an error for `$self` in a filter of a `from` reference.
  + Correctly handle renamed target elements in backlink comparisons.
- _[cds.java@5.0.2]_ Fixed a bug causing a `NullPointerException` in case Service Manager bindings (for hdi containers) do not contain a field `database_id`.
- _[cds.java@4.9.4]_ Fixed a bug in xsuaa scope prefix validation
- _[cds.java@4.9.3]_ Fixed a bug causing a `NullPointerException` in OData v4 for the requests with `@bind:null` (v4.01) and `@odata.bind:null` (v4.0) (remove link to an association).
- _[cds@10.0.6]_ `$apply=filter(...)/groupby(...)/aggregate($count)` with non-UTC `DateTimeOffset` filter values now returns correct results on HANA
- _[cds@10.0.6]_ Generated index page now uses relative hrefs, fixing links when served behind an approuter with a path prefix
- _[cds@10.0.6]_ `$batch` sub-requests returned an empty body and headers when `@opentelemetry/instrumentation-express` (or any instrumentation that wraps Express handlers to arity 2) was active
- _[cds@10.0.6]_ `cds.xt.ModelProviderService` can be served in mtx sidecar
- _[cds@10.0.6]_ Modeled service events were not properly ignored in OData adapter
- _[cds@10.0.6]_ Generic handler for draft-specific actions not correctly being bound to the transaction context
- _[cds-mtxs@4.0.4]_ Version bump
- _[cds-mtxs@4.0.3]_ HANA credential health-check now detects the available driver via `require.resolve()` instead of reading `package.json`, fixing `MODULE_NOT_FOUND` for apps that follow the "Plug & Play" guidance and don't declare `hdb` or `@sap/hana-client` directly.
- _[cds-mtxs@4.0.3]_ Tenant upgrade now reports a clear per-tenant `422` error when a stored extension is incompatible with the changed base model, instead of aborting with an uncaught compilation error.
- _[cds-mtxs@4.0.3]_ `cds-mtx-migrate` now runs more robust with uncommon model configurations.
- _[cds-mtxs@4.0.2]_ `PUT /-/cds/extensibility/Extensions/<id>` with a status that is not active (0 or 1), now returns the correct entry.
- _[cds-mtxs@4.0.2]_ Extensions table is now resolved properly again when `cds.sql.names = quoted` is set.
- _[cds-mtxs@3.9.6]_ Parallel single-tenant upgrades no longer fail with `tar: Cannot open: File exists` when extensibility is disabled.
- _[cds-mtxs@3.9.6]_ Deployment to tenant containers is more stable with a large number of service bindings provided via `VCAP_SERVICES_FILE_PATH`.
- _[cds-mtxs@3.9.6]_ More robust error handling for HDI deployment logs on read-only file system on Kyma.
- _[cds-mtxs@3.9.6]_ Configuration `cds.requires.multitenancy.retries` is now effective.
- _[cds-mtxs@3.9.6]_ Reading tenants no longer logs a spurious `Failed to parse metadata to JSON` error for tenants without metadata.
- _[cds-mtxs@3.9.6]_ A tenant's HANA connection pool now reliably recovers once valid credentials are restored, as cache-bypassing Service Manager lookups no longer overwrite the shared bindings cache with transiently invalid credentials.
- _[cds-mtxs@3.9.6]_ More robust handling of Service Manager errors.



## July 2026

### Added {#jul-26-added}

- _[cds-dk@10.0.6]_ `cds add xsuaa` now generates namespace-suffixed XSUAA `role-collections` for Kyma.
- _[vscode-cds@10.0.2]_ Syntax highlighting for CQL strings within the tagged template string following `cds.ql`.
- _[cds.java@5.0.1]_ `TenantProviderService` now supports the SaaS Registry/Subscription Manager API v2 for "Get All Subscriptions" endpoint. Use the property `cds.multiTenancy.useSaaSApiV2` to control the API version to use. Default is `false` to use existing v1 of the API.

### Changed {#jul-26-changed}

- _[cds-dk@10.0.6]_ `cds init` and `cds add` now detect app folders by the UI framework in their `package.json` (`@ui5/cli`, `react`, `vue`, `svelte`, `@angular/core`, `vite`) or a `webapp/manifest.json`, instead of matching against well-known folder names.
- _[cds-dk@10.0.6]_ `cds add approuter` now generates the approuter into `.deploy/app-router` by default instead of `app/router`, still respecting an existing `app/router` folder.
- _[cds-dk@10.0.6]_ `cds add html5-repo`, `cds add app-frontend`, and `cds add portal` now place the HTML5 application content deployer in `.deploy/html5-deployer` by default instead of `app/html5-deployer`, still respecting an existing `app/html5-deployer` folder.
- _[cds-dk@9.9.4]_ `cds init` uses Maven Java archetype version 4.9.1 for creating Java projects.
- _[cds-dk@9.9.4]_ Other dependency updates
- _[vscode-cds@10.0.2]_ Project Explorer now shows all configuration files including defaults.
- _[cds-mtxs@3.9.5]_ Calling endpoint `POST /-/cds/sms-provisioning/upgrade` now checks the correct permissions.

### Fixed {#jul-26-fixed}

- _[cds-dk@10.0.6]_ `cds add http` now respects capability restrictions, emitting only supported requests for `@Capabilities.*Restrictions: false`, `@odata.singleton`, and `@insertonly` entities.
- _[cds-dk@10.0.6]_ `cds add http` now generates requests for bound actions and functions on an instance, including draft-enabled entities (e.g. `POST .../E(ID=…,IsActiveEntity=true)/S.approve`), and `GET` requests for OData functions.
- _[cds-dk@10.0.6]_ `cds add http` now omits readonly, computed and managed fields (`@readonly`, `@Core.Computed`, `@cds.on.insert`/`@cds.on.update`) from `POST`/`PATCH` bodies, since clients cannot set them.
- _[cds-dk@10.0.6]_ `cds add http` now slugs `# @name` handles and suffixes collisions, so delimited names (`![a.b]`) and entities that slug alike (`A.sub` vs. `Asub`) yield valid, unique handles.
- _[cds-dk@10.0.6]_ `cds add http` now flattens nested composition entity-set names to underscores in URLs (e.g. `E_addr` instead of the unroutable `E.addr`).
- _[cds-dk@10.0.6]_ `cds add http` now includes all keys in composite-key draft requests instead of only the first, and single-quotes single string keys (e.g. `Books/'abc'`), matching composite string keys.
- _[cds-dk@10.0.6]_ `cds add http` now addresses parameterized entities as `Entity(p=…)/Set`, omitting the invalid `POST`/`PATCH`/`DELETE` requests it previously generated for them.
- _[cds-dk@10.0.6]_ `cds add http` no longer emits `PATCH`/`DELETE` requests with `undefined` or `[object Object]` in the URL for keys without a sample value, structured keys, or entities without a scalar key.
- _[cds-dk@10.0.6]_ `cds add http` no longer produces a double slash in request URLs for a service mounted at the root path (`@path: '/'`).
- _[cds-dk@10.0.6]_ `cds add http` and `cds add data` no longer crash with `Cannot convert undefined or null to object` for a keyless entity whose composition's `on` condition references `$self`.
- _[cds-dk@10.0.6]_ `cds add http` no longer throws `MULTIPLE_DOCS` when `application.yaml` uses `---` separators (Spring Boot multi-profile format).
- _[cds-dk@10.0.6]_ `cds export --data` now reads seed data via in-memory SQLite instead of the configured db driver, so it no longer fails in projects with `requires.db: hana` (e.g. CAP Java).
- _[cds-dk@10.0.6]_ `cds init --java --add mta` now writes `path: srv` for the Java `srv` module in `mta.yaml` instead of `gen/srv`, so `mbt build` no longer fails with `the "gen/srv" path of the "<app>-srv" module does not exist`.
- _[cds-dk@10.0.6]_ `cds build --for nodejs --production` now also bundles _messages.properties_ files from plugins found via neighborhood resolution. `cds build --for java` retains the previous behaviour and does not use neighborhood resolution for plugin message files.
- _[cds-dk@10.0.6]_ `cds version` no longer reports dependency problems if no dependencies are installed at all. It prints an info message instead.
- _[cds-dk@10.0.6]_ `cds add test` creates tests that are green by default. Sample data is provided as commented code.
- _[cds-dk@10.0.5]_ `cds build --for hana` now declares the plugin for native HANA artifacts placed in the build output (e.g. a `.hdbprojectionview` from `db/src`) in the generated `.hdiconfig`.
- _[cds-dk@10.0.5]_ `cds add typer` now generates a `jsconfig.json` file that works with VS Code.
- _[cds-dk@10.0.5]_ `cds debug <app> --force` on Kyma now preserves existing `NODE_OPTIONS` flags (e.g. `--max-old-space-size`) instead of overwriting them when enabling the inspector.
- _[cds-dk@10.0.5]_ `cds add sample` now selects `stock` in the Books list and object pages, so the overstock discount shows up in the UI.
- _[cds-dk@10.0.5]_ `cds add data` now generates correct foreign-key columns for nested compositions of aspects, e.g. `up__up__ID,up__ID,ID,name` instead of a broken `up__up_` header.
- _[cds-dk@10.0.5]_ `cds build` no longer fails with `npm ls -ws: unknown option` on npm 12, which dropped the short `-ws` flag.
- _[cds-dk@10.0.5]_ `cds build` now packages transitive npm workspace dependencies again on npm 12, which changed `npm pack --json` to emit an object keyed by package name instead of an array.
- _[cds-dk@10.0.5]_ `cds up` uses `helm --rollback-on-failure` instead of the deprecated `--atomic`.
- _[cds-dk@10.0.5]_ `cds add portal` on Java + IAS disables JWT proof-of-possession on `srv` (`SAP_SPRING_SECURITY_IDENTITY_PROOFTOKEN=false`) so Portal-proxied tile OData works.
- _[cds-dk@10.0.5]_ `cds add ias` forwards client certificates from the approuter to `srv-api` (`backendDestinations.srv-api.forwardAuthCertificates`).
- _[cds-dk@10.0.5]_ `cds add ias` always enables `xsuaa-cross-consumption` in the identity service parameters.
- _[cds-dk@10.0.5]_ `cds add ias` no longer sets an mTLS `expose.host` on the approuter, restoring a plain approuter host for the browser flow.
- _[cds-dk@10.0.5]_ `cds add portal` on Java multitenant now binds the Portal service instance to `srv` so CAP Java's `getDependencies` reports Portal to the SaaS Registry.
- _[cds-dk@10.0.5]_ `cds add kyma` uses a tenant-agnostic (tcpSocket) startup probe for the multitenant approuter, avoiding 400s from `TENANT_HOST_PATTERN` on kubelet probes.
- _[cds-dk@10.0.5]_ `cds add kyma` no longer emits the dead `Authentication: OAuth2UserTokenExchange` key on `backendDestinations.srv-api`.
- _[cds-dk@10.0.5]_ `cds add github-actions` uses updated versions.
- _[cds-dk@10.0.5]_ `cds watch` now works in ESM scenarios where only a global `cds-dk` is installed, where it would formerly fail with `ERR_MODULE_NOT_FOUND` for `@sap/cds`.
- _[cds-dk@10.0.5]_ `cds watch`no longer shows a `'server.hmr.protocol/host/port/path/clientPort/timeout/server' is deprecated` warning when running a Vite application.
- _[cds-dk@10.0.4]_ `cds watch` now starts apps with a SQLite database again in cases where they don't have a `@cap-js/sqlite` dependency or a `package.json`.
- _[cds-dk@10.0.3]_ `cds import` now wraps arrays-of-arrays in a `{ value: [...] }` struct when importing OpenAPI/Swagger specs, avoiding the OData `chained-array-of` compiler error.
- _[cds-dk@10.0.3]_ `cds version` now also prints versions of secondary packages likes `@sap/cds-compiler` and `@cap-js/db-service`.
- _[cds-dk@10.0.3]_ `cds build --production` no longer overrides collected message bundles with empty default bundles.
- _[eslint-plugin-cds@4.2.5]_ Fixed `TypeError: scopeManager.addGlobals is not a function`, preventing compatibility with ESLint 10.
- _[cds-compiler@7.0.3]_ **compiler:** When a backlink target is at least distantly related to the entity
  embedding an association with a backlink comparison, the compiler issues a
  warning ref-deprecated-backlink instead of reporting an error ref-invalid-backlink;
  this is now also the case if the target entity is auto-exposed.
- _[cds-compiler@7.0.3]_ **sql:** Avoid dump in to.sql.migration with complex models.
- _[cds-compiler@7.0.2]_ **compiler:**
  + Avoid dump for a new association in a projection with backlink comparison while reporting a missing backlink target element.
  + Soften incompatibility concerning backlink comparisons: missing target elements which are referred to in the foreign keys or ON-condition of the backlink
    association now only lead to a warning, not an error.
  + Soften incompatibility concerning structure values for annotations: a structure property like `list` won't be rejected; we avoid an ambiguity with an
    _expression_ `(1, 2, 3)` by putting `'=': true` next to `list: …` in the CSN, like in compiler v6.
    A `xpr` expression and an `#` enum symbol are rendered without a sibling `=`, though.
- _[cds-compiler@6.9.4]_ **effective:**
  + Correctly rewrite references in annotation expressions inside arrays.
  + Add option to replace annotation expressions by strings to evade error situations.
- _[cds4j@5.0.1]_ Fixed a bug in `ProjectionResolver` that caused an empty (`null` values) payload in expanded association, when using filter with path expressions.
- _[cds4j@5.0.1]_ The `count` is now represented in CQN in lower case, which allows for better compatibility with HCQL.
- _[cds4j@5.0.1]_ The inline count of an expand is now represented as `count: true` instead of `inlineCount: true`.
- _[cds@10.0.5]_ Messaging management requests to SAP Event Mesh or Event Mesh in SAP Integration Suite (EMIS) now always send a (possibly empty) body for `PUT`/`POST` requests, as required by EMIS (and compatible with SAP Event Mesh)
- _[cds@10.0.5]_ Only convert `@Common.Text` to `@cds.search` for service entities
- _[cds@10.0.4]_ Default language fallbacks for incomplete `i18n` bundles in Java projects
- _[cds@10.0.4]_ `srv.on/before('READ',...)` handlers registered with a cds-typer singular entity proxy were erroneously rewritten to event `each`
- _[cds@10.0.4]_ Asynchronous plugins (exporting a Promise) were not awaited in ESM projects
- _[cds@10.0.4]_ Fixed context propagation for local app and remote service calls
- _[cds@10.0.3]_ Suppress "connect to" log for internal scheduling service
- _[cds@9.9.3]_ Fixed context propagation for local app and remote service calls


## June 2026

### Added {#jun-26-added}

- _[cds-dk@10.0.1]_ `cds add event-mesh` and `cds add event-mesh-shared` set up configuration and deployment descriptors for Event Mesh of SAP Integration Suite.
- _[cds-dk@10.0.1]_ `cds upgrade` now detects Java/Spring Boot migration issues and integrates OpenRewrite for automated fixes via `--fix`.
- _[cds-dk@10.0.1]_ `cds upgrade --report` writes `report.md` and `report.yaml` to `.cds-upgrade/` for AI agent and human consumption.
- _[cds-dk@10.0.1]_ `cds upgrade` groups findings by capire section with links to the migration guide.
- _[cds-dk@10.0.0]_ `cds upgrade` analyzes project code and configuration for CDS 10 compatibility issues.
- _[cds-dk@10.0.0]_ `cds add react|vue` without `--into` scaffolds the Vite app directly into `app/`; `cds watch` mounts it at `/`.
- _[cds-dk@10.0.0]_ `cds add portal` uses the `sapse/application-content-deployer-buildpack` for Kyma to simplify HTML5 repo content and SAP BTP Portal service deployment.
- _[cds-dk@10.0.0]_ `cds add ai` adds out-of-the-box AI integration with `@cap-js/ai` via the SAP BTP AI Core service.
- _[cds-dk@10.0.0]_ `cds debug` warns about `http` health checks on Cloud Foundry that would kill the container while paused at a breakpoint.
- _[cds-compiler@7.0.1]_ **compiler:** Special property `$includeAfter` is put into a CSN of flavor `gensrc`/`xtended` to preserve the original
  element order for entities and other structures with `includes` added via an `extend` statement.
- _[cds-compiler@7.0.1]_ **sql:** Default values from structures with a single element are propagated to the flattened leaf element.
- _[cds-compiler@7.0.1]_ **odata:** Default values from structures with a single element are propagated to the flattened leaf element.
- _[cds.java@5.0.0]_ The `add` goal of the `cds-maven-plugin` now generates a `pom.xml` for Maven modules exported via `cds export`.
- _[cds.java@5.0.0]_ The `generate` goal of the `cds-maven-plugin` has a new option `generateClasses` to generate static implementations for accessor interfaces.
- _[cds.java@5.0.0]_ The module `cds-services-code-generator` replaces `cds4j-codegen`.
- _[cds.java@5.0.0]_ Introduced `ContainerDeploymentService` in `cds-feature-mt` as Beta to support additional frameworks for schema evolution in non-sidecar scenarios.
- _[cds.java@5.0.0]_ Support "inline aggregate" expressions in OData v4, e.g. `$apply=aggregate(Sales(amount mul product/taxRate with sum as Tax))`
- _[cds.java@4.9.1]_ Support usage of custom functions in dynamic queries on SQLite with MT.
- _[cds.java@4.9.1]_ Remote OData v4 services now support `$count` in `$expand()`.
- _[cds.java@4.9.1]_ Logs for 401 errors in Remote OData services now include the value of the `www-authenticate` header, if available.
- _[cds.java@4.9.1]_ Support `onBehalfOf` configuration for IAS app-to-app destinations, allowing control over the authentication strategy (`currentUser`, `systemUser`, `systemUserProvider`) when calling remote APIs through destinations with `cloudsdk.ias-dependency-name`.
- _[cds.java@4.9.1]_ Added `cds.sql.search.localized` with option `view` as replacement for deprecated `cds.sql.search.mode`.
- _[cds4j@5.0.0]_ Extend `CQL.vector_embedding` to accept text as String.
- _[cds4j@5.0.0]_ Support type propagation for `cosineSimilarity` and `l2Distance`.
- _[cds4j@5.0.0]_ Support calculation of aggregates for hierarchies.
- _[cds4j@5.0.0]_ Support filters through to-one associations into `cds.Map` elements.
- _[cds4j@5.0.0]_ Method `CdsStructuredType.elements(Predicate filter)` to get a filtered stream of elements.
- _[cds4j@5.0.0]_ Emulate SAP HANA SCORE search-syntax on other databases.
- _[cds4j@5.0.0]_ SAP HANA:
  + improve search of UUIDs and fuzzy search in large strings.
  + allow fuzzy search in hierarchy queries.
- _[cds4j@5.0.0]_ Removed Beta from CdsJsonConverter
- _[cds4j@5.0.0]_ Improved performance of large deep insert statements
- _[cds@10.0.2]_ Event Queues: Support for 6-field cron (with seconds)
- _[cds@10.0.1]_ Support for SAP Integration Suite Event Mesh (EMIS) via messaging kinds `event-mesh` and `event-mesh-shared` (beta)
  + In contrast to SAP Event Mesh, multitenancy is out of scope!
- _[cds@10.0.0]_ New annotation `@cds.minify: false` allows to avoid minification of definitions that would otherwise be removed from the model. For example, that would happen to types which are not used anywhere in the model.
- _[cds@10.0.0]_ UCL: Support for integration update operations (`add`, `remove`, `modify`, `rotate`) for tenant mapping notifications.
- _[cds@10.0.0]_ UCL: Accept mTLS certificate from `x-forwarded-client-cert` (XFCC) header for Kubernetes/Istio/Envoy environments, in addition to the existing Cloud Foundry HAProxy headers.
- _[cds@10.0.0]_ Compatibility flag `cds.env.features.compat_srv_getters` (default: `false`) to opt into the deprecated function-call API for `srv.entities`, `srv.events`, `srv.types`, and `srv.actions`. This flag will be removed with cds^11.
- _[cds@10.0.0]_ Mark all CSN `val`s with `param: false`
- _[cds@10.0.0]_ For `CREATE`, `UPDATE`, `UPSERT`, and `DELETE` requests, the generic CRUD handler now consistently returns arrays carrying an `.affected` property with the number of affected rows (instead of `req.data`, or — for `DELETE` — the affected count itself).
  + Opt-out via `cds.env.features.legacy_srv_results: true`. This flag will be removed with cds^11.
- _[cds@10.0.0]_ `redis-messaging`: Support for credentials in GCP-based regions (adds private CA)
- _[cds-mtxs@3.9.4]_ `getCsn` now sets `meta.extended` to `true` or `false` on the returned CSN, indicating whether tenant extensions were applied. If `meta.extended` is set to `false`, the deployment is using the precompiled HANA artifacts instead of running another HANA build.

### Changed {#jun-26-changed}

- _[cds-dk@10.0.1]_ `@sap/cds-dk` now comes with `bundleDependencies` for reproducible installs.  This is a replacement for the `npm-shrinkwrap.json` that is no longer supported by NPM 12 and higher.
- _[cds-dk@10.0.1]_ `cds init` no longer assumes `--nodejs` when running in SAP Business Application Studio.
- _[cds-dk@10.0.1]_ `cds init` no longer omits the `.vscode` folder when running in SAP Business Application Studio.
- _[cds-dk@10.0.1]_ `cds init/add --nodejs` now creates ESM projects by default.  For CommonJS projects, use `cds init --add cjs`.
- _[cds-dk@10.0.1]_ `cds add data` no longer creates random strings for fields annotated with `@assert.format`.
- _[cds-dk@10.0.1]_ `cds add ias` does not use the `HTML5.` prefix for HTML5 repo settings.
- _[cds-dk@10.0.1]_ `cds add node` now adds a devDependency to `@cap-js/sqlite@^3`
- _[cds-dk@10.0.1]_ `cds upgrade` now produces concise CLI output (count + title per rule) and a structured report with capire-aligned sections.
- _[cds-dk@10.0.0]_ `cds add` and `cds build` create `engines` fields using caret dependencies of LTS Node.js versions, such as `^24`.
- _[cds-dk@10.0.0]_ `cds version` now always prints entries in a new formatting, even in Java projects and when running in BAS. For a stable output that can be parsed by scripts, use `--json`.
- _[cds-dk@10.0.0]_ `cds add hana` does not generate _db/undeploy.json_ any more.
- _[cds-dk@10.0.0]_ `cds build --for hana` generates _gen/db/undeploy.json_, merging an existing _db/undeploy.json_ if present.
- _[cds-compiler@7.0.1]_ **compiler:**
  + Messages reported by compiler backends for non-applied `annotate` statements now mention the original file location if that is unique.
  + The message IDs and texts for undefined references have been consolidated.
- _[cds-compiler@7.0.1]_ **odata:**
  + Non-spec compliant simple identifiers in OData V2 now lead to a warning.
  + Avoid duplicate or incorrect warnings for value help shortcut.
- _[cds-compiler@7.0.1]_ **sql:**
  + Performance of the SQL backend has been improved: wildcard `*` in views and projections is only expanded lazily.
  + No errors are reported anymore for non-persisted entities, as they are irrelevant for database deployment
    (for the message IDs `type-missing-argument`, `type-unexpected-argument`, `ref-unsupported-type`, and `ref-unexpected-args`).
- _[cds.java@5.0.0]_ The minimum required JDK for CAP Java is 21.
- _[cds.java@5.0.0]_ The OpenRewrite recipes in `cds-services-recipes` now use the consolidated package namespace `com.sap.cds.services.migrations` for all recipe names and Java classes (previously mixed between `.recipes` and `.migrations`).
- _[cds.java@5.0.0]_ Renamed `cds.mcp.autoConfig` to `cds.mcp.autoWired`.
- _[cds.java@5.0.0]_ Renamed `cds.taskScheduler.enabled` to `cds.outbox.persistent.scheduler.enabled`.
- _[cds.java@5.0.0]_ Removed deprecated properties `eventContext` and `cqnService` from goal `generate` of the `cds-maven-plugin`.
- _[cds.java@5.0.0]_ The properties `cds.outbox.inMemory.enabled` and `cds.outbox.inMemory.emitDuringChangeSetContext` have been deprecated.
- _[cds.java@5.0.0]_ ~~The default search mode for OData V2 and V4 has been changed to `pass-through`. To restore the old behavior, set `cds.odataV2.search.mode` and `cds.odataV4.search.mode` to `odata-lenient`.~~
- _[cds.java@5.0.0]_ The default value for property `cds.errors.preferServiceException` has been changed from `false` to `true`.
- _[cds.java@5.0.0]_ The default value for property `cds.multiTenancy.serviceManager.cacheRefreshInterval` has been changed from `20` to `60` minutes.
- _[cds.java@5.0.0]_ ~~The number of max requests in a OData V2 batch request has been limited to `10`. To restore the old behavior, set `cds.odataV2.batch.maxRequest` to `-1`.~~
- _[cds.java@5.0.0]_ The default value for property `cds.persistence.changeSet.enforceTransactional` has been changed from `true` to `false`.
- _[cds.java@5.0.0]_ Outboxes for services are now by default unordered. To restore the old behavior, set `cds.outbox.services.<key>.ordered` to `true`.
- _[cds.java@5.0.0]_ The default value for property `cds.query.restrictions.enabled` has been changed from `false` to `true`.
- _[cds.java@5.0.0]_ The default value for property `cds.query.deep-entity-readonly.enabled` has been changed from `false` to `true`.
- _[cds.java@5.0.0]_ The default value for property `cds.sql.toOnePath.mode` has been changed from `always-join` to `optimize`.
- _[cds.java@5.0.0]_ The default value for property `cds.sql.hana.search.fuzzy` has been changed from `false` to `true`.
- _[cds.java@5.0.0]_ The deprecated property `cds.sql.hana.optimizationMode` has been removed.
- _[cds.java@5.0.0]_ Removed deprecated `Exits` classes from `cds-feature-mt`.
- _[cds.java@5.0.0]_ Changed default JDK in `cds-services-archetype` for new CAP Java projects to JDK 25.
- _[cds.java@5.0.0]_ Removed deprecated goal `install-cdsdk` from `cds-maven-plugin`.
- _[cds.java@5.0.0]_ The default authentication mode is now model-relaxed for local development. In production environments, the secure-by-default behavior is preserved by automatically applying model-strict.
- _[cds.java@5.0.0]_ Changed the default Node.js version in the `cds-maven-plugin` to current LTS 24.x.
- _[cds.java@5.0.0]_ Bumped minimum required Maven version of the `cds-maven-plugin` to 3.9.10.
- _[cds.java@5.0.0]_ Removed Maven modules `repackaged/odata-v2-lib` and `repackaged/odata-v4-lib`.
- _[cds.java@5.0.0]_ OData v2: log forbidden char in DEBUG level.
- _[cds.java@5.0.0]_ Removed `cds.odataV2.searchMode` and `cds.odataV4.searchMode` and introduced `cds.sql.search.syntax` with options `HANA` (default) and `ODATA`.
- _[cds.java@5.0.0]_ Removed `cds.sql.search.mode` and introduced `cds.sql.search.localized` with option `view`; `generic` mode is not supported anymore.
- _[cds4j@5.0.0]_ Removed support for SAP HANA JSON Document Store.
- _[cds4j@5.0.0]_ Removed modules `cds4j-codegen` and `cds4j-maven-plugin`.
- _[cds4j@5.0.0]_ Removed support for search via the `CONTAINS` function in HANA legacy mode.
- _[cds4j@5.0.0]_ Values contained in an annotation with expression value are now treated as constants.
- _[cds4j@5.0.0]_ Removed config option `cds.sql.collate`. Collation now always applies to all string elements (previously the `"localized-strings"` value restricted collation to localized elements only).
- _[cds4j@5.0.0]_ Removed deprecated `exists(Select<?> subQuery)` method from `Modifier`.
- _[cds4j@5.0.0]_ Removed deprecated `isAbstract` method in `CdsEntity`.
- _[cds4j@5.0.0]_ Removed deprecated `CqnPassThroughSearchPredicate`, instead use `CqnSearchStringPredicate`.
- _[cds4j@5.0.0]_ Removed higher auto-weighting of key element in fuzzy search.
- _[cds4j@5.0.0]_ Removed `CqnTransformation.getKind()` and the `CqnTransformation.Kind` enum (beta)
- _[cds4j@5.0.0]_ Replaced config option `cds.sql.search.mode: localized-view` with `cds.sql.search.localized: view`; `generic` mode is not supported anymore.
- _[cds@10.0.0]_ Node.js 22 is now the minimum required Node.js version. Version 20 is no longer supported.
- _[cds@10.0.0]_ `cds.features.compat_texts_entities` is changed to _false_ and will be removed in an upcoming version.
- _[cds@10.0.0]_ `cds.features.ieee754compatible` is changed to _true_ to return strings for Decimal/Int64 for all db services.
- _[cds@10.0.0]_ `cds.i18n.fatjson` is changed to _false_ and will be removed in an upcoming version.
- _[cds@10.0.0]_ Advanced Event Queue Scheduling via Scheduling Service on by default (if both `db` and `queue` are available)
- _[cds@10.0.0]_ `cds.fiori.direct_crud` is split into the two feature flags `cds.fiori.bypass_draft` and `cds.fiori.draft_new_action`
  +  `cds.fiori.bypass_draft` allows the modification of active instances. It is now enabled by default
  +  `cds.fiori.draft_new_action` introduces the `draftNew` action to create new drafts. It is still disabled by default (as before)
- _[cds@10.0.0]_ REST adapter: bulk `POST` of multiple entries is now dispatched as a single `INSERT` instead of one dispatch per entry.
  + Set `cds.env.features.bulk_inserts_via_rest: false` to revert to the legacy per-entry dispatch. This flag will be removed with cds^11.
- _[cds@10.0.0]_ `req.query` is deprecated for bound actions/ functions and will be removed in cds^11. Use `req.subject` instead.
- _[cds@10.0.0]_ Generic Handlers: Static `handle_*` methods that registered preflight handlers were replaced by non-static `handle_*` functions that are called before `handle`
  + Fully backwards-compatible: In case of a custom static `handle_*` method that overrides a built-in one, the respective `handle_*` function is not called
- _[cds@10.0.0]_ Updated default configuration for `persistent-queue`:
  + `legacyLocking` default changed from `true` to `false`
  + `maxAttempts` default reduced from `20` to `10`
  + `storeLastError` option removed (now always `true` implicitly)
- _[cds@10.0.0]_ Protocol adapters are now real classes, The `.router` contains now the protocol router (previously it was returned from the constructor itself).
- _[cds@10.0.0]_ `cds.validate` now return the error code in `.code` instead of `.message`.
- _[cds@10.0.0]_ Errors are now logged in default language instead of the plain developer texts.
- _[cds@10.0.0]_ OData parser accepts `/^[0-9a-z-]{1,36}$/i` as UUID
- _[cds@10.0.0]_ Flows: `@from` is checked in parallel to any other before handler
- _[cds@10.0.0]_ RemoteService: Clearing keys from payload (`req.data`) is now done in generic `on` handler instead of an extra `before` handler
- _[cds@10.0.0]_ Undocumented `srv.reject(event, path)` registers a standard `before` handler
- _[cds@10.0.0]_ **[internal]** Refactored core service implementation (`srv-dispatch`, `srv-handlers`, `cds.Service`) for improved code clarity and maintainability
- _[cds-mtxs@4.0.1]_ Migration from `@sap/cds-mtx` has been removed.
- _[cds-mtxs@4.0.1]_ Calling endpoint `POST /-/cds/sms-provisioning/upgrade` now requires more permissions.
- _[cds-mtxs@4.0.1]_ Annotation `@Common.FieldControl` is now also blocked for extensions.
- _[cds-mtxs@4.0.1]_ Annotations `@Capabilities.*` are now also blocked for extensions.
- _[cds-mtxs@4.0.1]_ The MTX sidecar now logs a warning if `cds.sql` is configured differently in both the project root and the sidecar. By setting `cds.env.requires['cds.xt.ModelProviderService']['use-root-sql-config'] === true`,
you can enforce the configuration of the project root.
- _[cds-mtxs@3.9.4]_ In case of multiple instances on Cloud Foundry, the initial creation of the `t0` tenant is only done by instance 0.
- _[cds-mtxs@3.9.4]_ Service Broker errors are logged with more detailed descriptions in the Service Manager client.

### Fixed {#jun-26-fixed}

- _[cds-dk@10.0.1]_ `cds subscribe`, `cds unsubscribe`, and `cds upgrade` default to mock credentials on localhost, removing the need for explicit `-u user:password`.
- _[cds-dk@10.0.1]_ `cds bind` will throw an error when `--to` is specified without providing a path.
- _[cds-dk@10.0.1]_ `cds build --for hana` now correctly relocates generated _.hdbsynonymconfig_ files containing `*.configure` properties (e.g. `schema.configure`).
- _[cds-dk@10.0.1]_ `cds add html5-repo` and `cds add app-frontend` detect UI5 modules per app via each app's `@ui5/cli` devDependency, instead of relying on a project-wide flag.
- _[cds-dk@10.0.1]_ Removed undocumented `dp-cli` data product import method. Use `dp-metadata` repository import or direct JSON file import instead.
- _[cds-dk@10.0.1]_ `cds add html5-repo`, `cds add app-frontend`, and `cds add typescript` now add `ui5-tooling-transpile-task` to existing `ui5.yaml` for TypeScript projects.
- _[cds-dk@10.0.1]_ `cds version` no longer fails if `@sap/cds` < 9.8 is installed.
- _[cds-dk@10.0.1]_ `cds build` no longer fails with `EEXIST` when the MTX sidecar has its own `.npmrc`, and dereferences symlinks during copy so `gen/` is self-contained and portable.
- _[cds-dk@10.0.1]_ `cds upgrade` no longer fails when ast-grep exits with non-zero on certain file patterns.
- _[cds-dk@10.0.1]_ Removed undocumented `dp-cli` data product import method. Use `dp-metadata` repository import or direct JSON file import instead.
- _[cds-dk@10.0.1]_ `cds import` for OData v2 now can import annotations.
- _[cds-dk@10.0.1]_ `cds lint` no longer silently swallows any error.
- _[cds-dk@10.0.0]_ `cds bind` now correctly handles CF org, space, and service instance names containing commas.
- _[cds-dk@10.0.0]_ `cds up` deploys to Kyma with `helm --atomic`, so failed deployments no longer block the next run.
- _[cds-dk@10.0.0]_ `cds add vue` uses correct placeholder values for book and author in `App.vue`.
- _[cds-dk@10.0.0]_ `cds build --production` now also bundles _message.properties_ files from plugins.
- _[cds-dk@10.0.0]_ `cds push` provides support for CAP plugins.
- _[cds-dk@10.0.0]_ `cds add dynatrace` in combination with `nodejs` makes sure the `nodejs` MTA changes are correctly applied.
- _[cds-dk@10.0.0]_ The `NO_COLOR` environment variable also accepts values other than `true`.
- _[cds-dk@9.9.3]_ `cds import` for OData v2 now can import annotations.
- _[cds-dk@9.9.3]_ `cds watch` on Windows no longer restarts the server for read-only file opens (antivirus, Windows Search indexer, TypeScript loaders like tsx). A mtime guard now confirms a file was actually written before emitting a `change` event.
- _[cds-dk@8.9.13]_ CVE-2025-15284: update `express` to fix vulnerability with `qs` <6.14.1
- _[eslint-plugin-cds@4.2.4]_ `auth-valid-restrict-grant` no longer crashes on JOINs with three or more tables.
- _[cds-compiler@7.0.1]_ **sql:**
  + An error is reported for subqueries that select only virtual elements. This avoids late errors during database deployment.
  + Parameter references in nested inlines are now handled correctly.
- _[cds-compiler@6.9.3]_ **api:** New compiler option `noErrorForUnknownAnnotateTarget` downgrades errors to warnings
for `annotate` statements with security-relevant annotations (`@restrict`, `@requires`, `@ams`)
whose target does not exist.
- _[cds.java@5.0.0]_ OData error targets that reference a plain composition name (e.g. `values/amount`) are now automatically rewritten to the service-layer infix-filter alias (e.g. `initialSlice/amount`), so that Fiori clients can correctly resolve the target path for inline error highlighting.
- _[cds.java@5.0.0]_ SELECT from SELECT queries (subqueries in the FROM clause) no longer fail when columns of inner queries are aliased and used in the outer subquery.
- _[cds.java@4.9.1]_ Content-Disposition headers now use RFC 5987 `filename*` encoding for non-ASCII filenames, ensuring correct display in browsers for files with special characters.
- _[cds.java@4.9.1]_ Empty `If-Match` and `If-None-Match` headers are now treated as invalid and rejected with `421` error code.
- _[cds.java@4.9.1]_ Enhanced resiliency to `cds-feature-kafka` when registering a consumer group ID and topic registration.
- _[cds4j@5.0.0]_ Fixed a bug in `groupBy` transformation for `@odata.draft.enabled` entity, causing a `ClassCastException`, when `IsActiveEntity` or `HasActiveEntity` are used as groups.
- _[cds4j@5.0.0]_ Decimal retrieved from SQLite are truncated to adhere to the declared scale.
- _[cds4j@5.0.0]_ Fixed a bug in optimized to-one expands where `null` values in nested rows were not included in results.
- _[cds@10.0.2]_ `cds.env` omits default values from plugins if requested
- _[cds@10.0.2]_ `$filter=<nav> eq/ne/gt/lt/ge/le <value>` on collection-valued navigation properties now returns 400 instead of crashing with 500
- _[cds@10.0.2]_ `$filter=<nav> gt/lt/ge/le <value>` on single-valued navigation properties now returns 400 instead of crashing with 500
- _[cds@10.0.2]_ If `cds.env.query.limit.max` is increased beyond the default of 1000 and no explicit `cds.env.query.limit.default` is set, the default page size now follows `max` instead of staying capped at 1000.
- _[cds@10.0.2]_ Propagate `DraftUUID` et al. to nested children on deep PATCH
- _[cds@10.0.2]_ Missing `username`/`password` on `BasicAuthentication` destinations in the native-fetch remote client now default to empty strings
- _[cds@10.0.1]_ Do not crash for app configurations or tests setting `cds.requires` to a nullish value.
- _[cds@10.0.1]_ A custom `cds.env.protocols.odata-v4.path` is now correctly applied to services using the `odata` protocol shortcut (or no explicit `@protocol` annotation).
- _[cds@10.0.1]_ `$count` is not allowed on service root or single instances
- _[cds@10.0.1]_ `$batch` URLs with sub-sequent segments will now be parsed as usual URLs
- _[cds@10.0.1]_ Gaps in CSRF token handling of native-fetch client
- _[cds@10.0.1]_ `srv.schedule()` always creates singleton tasks
- _[cds@10.0.1]_ Initial timestamp of scheduled task with cron expression
- _[cds@10.0.0]_ The prebuilt edmx were erroneously bypassed and recompiled at runtime in multitenant apps
- _[cds@10.0.0]_ Sending a plain object instead of an array for a `Composition of many` now correctly returns 400
- _[cds@10.0.0]_ Adding clauses on `cds.clone`d queries behaved inconsistently.
  For example:
  ```js
  let q1 = SELECT.from`Books`.where`ID>1`.orderBy`genre.name`
  let q2 = cds.ql.clone(q1).where`stock>9`.orderBy`title`
  ```
  Before, the `where` clause was appended, but `orderBy` was overridden instead of appended.
  With the fix, both `where` and `orderBy` are appended, so that q2 is effectively:
  ```sql
  SELECT from Books where ID>1 and stock>9 order by genre.name, title
  ```
  Set `cds.features.compat_clone_appends = true` to revert to the erroneous former behavior. Note though this will be removed in a future release.
- _[cds@10.0.0]_ `$expand=*` with query options (e.g. `$expand=*($expand=...)`) no longer crashes the server but returns 400
- _[cds@10.0.0]_ `compile.for.nodejs` did not consistently ignore `@Common.Text` annotations with expression values when deriving `@cds.search` fields
- _[cds@10.0.0]_ `cds.utils.inspect` respects custom options again
- _[cds@10.0.0]_ Erroneously prefixed paths being applied to database service handlers during handler registration
- _[cds@10.0.0]_ `.texts` entities incorrectly appearing in `cds.entities` / `srv.entities` when `compat_texts_entities` is not enabled
- _[cds@10.0.0]_ Race condition between async and sync handlers rejecting errors simultaneously under `Promise.all` — sync handlers are now consistently wrapped as async during registration
- _[cds@10.0.0]_ Query options for bound actions/ functions (e.g., `$select`) are validated against the return type of said bound action/ function
- _[cds@9.9.2]_ `srv.model` propagation in extensibility scenarios
- _[cds@9.9.2]_ Restored `err.target:'in'` during draft activation with `cds.fiori.draft_messages=false` to avoid the `MULTIPLE_ERRORS` popup
- _[cds@9.9.2]_ `resolveView` prioritizes the original foreign key `parent_ID` if exposed multiple times, e.g., through `*, parent.ID as parentId`
- _[cds-mtxs@4.0.1]_ Default value 3 for `cds.requires.multitenancy.jobs.clusterSize` is now effective for upgrade. When using HANA TMS v2, the default for `clusterSize` is set to 1.
- _[cds-mtxs@4.0.1]_ Parallel single-tenant upgrades no longer fail with `tar: Cannot open: File exists` when extensibility is disabled.
- _[cds-mtxs@3.9.4]_ Command `cds-mtx upgrade '*'` now also works with setting `cds.requires.multitenancy.jobs.clusterSize` > 1.
- _[cds-mtxs@3.9.4]_ Clients for multiple instances of the Service Manager no longer interfere with each other.
- _[cds-mtxs@3.9.4]_ Retry handling has been improved for the HANA TMS v2 client.

### Removed {#jun-26-removed}

- _[cds-dk@10.0.0]_ `cds extend` is removed as it was only kept for `@sap/cds-mtx` compatibility.
- _[cds-dk@10.0.0]_ `cds migrate` is removed as `@sap/cds-mtx` to `@sap/cds-mtxs` migration is now effectively complete.
- _[cds-dk@10.0.0]_ `cds login`, `cds logout`, `cds pull`, `cds push`: the project-folder argument and the `--directory` (`-d`) option are removed; run these commands from the project directory instead.
- _[cds.java@5.0.0]_ Removed deprecated property `cds.errors.combined`. Error messages are now combined by default.
- _[cds@10.0.0]_ `cds.compile.to.hdbcds()` — use `cds.compile.to.hdbtable()` instead
- _[cds@10.0.0]_ `cds.context.http.req.authInfo` - use `cds.context.user.authInfo` instead
- _[cds@10.0.0]_ Legacy compat option `cds.compile.to.hdbcds()` — use `cds.compile.to.hdbtable()` instead.
- _[cds@10.0.0]_ Legacy compat option `cds.User.tokenInfo` - Use `cds.User.authInfo.token` instead.
- _[cds@10.0.0]_ Legacy compat flag for `ASSERT_NOT_NULL` error code of `@mandatory` validation - use `ASSERT_MANDATORY` ass `code` instead.
- _[cds@10.0.0]_ Legacy compat flag `cds.features.compat_save_drafts` → use `['CREATE', 'UPDATE', 'UPSERT']` instead of the `SAVE` event for `.drafts`
- _[cds@10.0.0]_ Legacy compat flag `cds.features.consistent_params=false` is now finally removed — adapt the implementation instead.
- _[cds@10.0.0]_ Legacy compat flag `cds.features.odata_metadata_compat` is now finally removed — adapt the implementation instead.
- _[cds@10.0.0]_ Legacy compat flag `cds.sql.transitive_localized_views` is now finally removed — no action necessary.
- _[cds@10.0.0]_ Legacy compat flag `async_handler_compat` feature flag and the associated compat wrapping logic from `srv-handlers`; sync handlers are now always wrapped unconditionally.
- _[cds@10.0.0]_ `DISCARD` event as a special-cased branch — it is now mapped to `CANCEL` via the standard events alias table
- _[cds@10.0.0]_ Internal function `getDBTable` used by old cds-dbs versions
- _[cds@10.0.0]_ Internal `_initial` phase
- _[cds@10.0.0]_ Removed support for `async activate()` functions returned from `cds-plugin.js` modules, which was never documented, and deprecated since Oct 2023. If you need to run async code during plugin loading, just return a promise as default export.

## May 2026

### Added {#may-26-added}

- _[cds-mtxs@3.9.3]_ Error on missing extension table if extensibility is enabled and `cds.requires['cds.xt.ExtensibilityService']['error-on-missing-extension-table']` is set.

### Changed {#may-26-changed}

- _[cds-dk@9.9.1]_ `cds add lint` now adds a dependency on `eslint@10`, instead of `eslint@9`.

### Fixed {#may-26-fixed}

- _[cds-dk@9.9.2]_ Dependency updates, e.g. for CVE-2026-8723.
- _[cds-dk@9.9.2]_ `cds build --for mtx-sidecar` warns if `resources.tgz` was not created, hinting to run `npm add -D tar` as a workaround on Windows.
- _[cds-dk@9.9.1]_ `cds add test` now uses version 1 of `@cap-js/cds-test`.
- _[cds-dk@9.9.1]_ `cds add vue` uses correct placeholder values for book and author in `App.vue`.
- _[cds-dk@9.9.1]_ `cds debug` support for latest Chrome versions.
- _[cds-dk@9.9.1]_ `cds watch` runs ESM projects with `tsx` again, so that `.js` import are rewritten to `.ts`. This got broken in 9.9.0, but used to work in 9.8.
- _[cds-dk@9.9.1]_ `cds add` only adds the `event-mesh.json` if a facet requiring the file is run.
- _[eslint-plugin-cds@4.2.3]_ Don't fail if the `tree-sitter` dependency cannot be installed. This might happen in WebContainer environments where native modules cannot be loaded.
- _[eslint-plugin-cds@4.2.2]_ `auth-valid-restrict-grant` now also considers inherited actions.
- _[cds-compiler@6.9.2]_ **api:** when the environment variable `CDSC_TRACE_API` is set,
  the compiler writes a trace for calls of API functions;
  it now has more information, and also traces the exit of the API function.
- _[cds-compiler@6.9.1]_ **compiler:**
  + make an element added via `extend` correctly shadow an element from an include
  + do not issue a warning for a correct use of `$projection`
- _[cds-compiler@6.9.1]_ **odata:**
  + do not generate wrong ReferentialConstraints for unmanaged Composition without a partner
  + render Partner attribute on forward association correctly
- _[cds@9.9.1]_ `cds.features.compat_texts_entities` erroneously influenced the OData service document
- _[cds@9.9.1]_ Newly introduced `EXPAND_MAX_LEVELS_EXCEEDED` errors did not have a default message
- _[cds@9.9.1]_ Incorrect resolving of parameter aliases for OData functions
- _[cds@9.9.1]_ OData Batch: Call error middlewares during error serialization
- _[cds@9.9.1]_ `cds.features.count_as_string` in lean draft
- _[cds-mtxs@3.9.2]_ When reusing HANA tenants with HANA TMS v2, the HANA tenant labels are no longer lost.
- _[cds-mtxs@3.9.2]_ `/-/cds/model-provider/getCsn` for non-existing tenants returns a model again instead of throwing an error.
- _[cds-mtxs@3.9.1]_ More robust behavior of the `cds.xt.serviceManager` API if no Service Manager or HANA TMS credentials are configured.
- _[cds-mtxs@3.9.1]_ Synchronous SMS subscription now returns the application url with the correct JSON format.
- _[cds-mtxs@3.9.1]_ Transient database errors in ETag determination are no longer silently swallowed.
- _[cds-mtxs@3.9.1]_ Undocumented programmatic `cds-mtx` API usage does not serve MTX services multiple times.
- _[cds-mtxs@3.9.1]_ It is now possible to register on the `bootstrap` event in the `cli.js` file to handle that event when running the `cds-mtx` command.
- _[cds-mtxs@3.9.1]_ Parallel calls of the database upgrade API are now more robust against race conditions.
- _[cds-mtxs@3.9.1]_ MTX sidecar no longer crashes when triggering an upgrade and legacy tenant `__META__` still exists.
- _[cds-mtxs@3.9.1]_ Database connection errors with `status` 404 throw without retries.

## April 2026

### Added {#apr-26-added}

- _[cds-dk@9.9.0]_ `cds build` routes `.hdbsynonymconfig` files with `*.configure` properties to the `cfg/` folder for HDI template substitution.
- _[cds-dk@9.9.0]_ `cds deploy` also supports `-b` as a shortcut for `--resolve-bindings`.
- _[cds-dk@9.9.0]_ `cds import` now supports `--resolve-bindings`.
- _[vscode-cds@9.9.0]_ WorkspaceSymbols API: `/x` to get index flags
- _[vscode-cds@9.9.0]_ WorkspaceSymbols: also include models defined in build tasks
- _[cds-compiler@6.9.0]_ **compiler:**
  - add support for extending views/projections with several SQL clauses:
    `where`, `group by`, `having`, `order by`, `limit`
  - allow extending derived enum types/elements by adding enum symbols
  - inside `extend … with enum {…}`, it is now possible to use `extend existingEnumSymbol with @Anno`,
    like it is already possible inside `extend … with {…}`
  - when the new options `v7KeyPropagation` is set, the propagation of the `key` property in queries is simplified,
    and the `key` property is not propagated when including structures into types
- _[cds-compiler@6.9.0]_ **odata:** set `meta.compilerCsnFlavor` in the OData transformed CSN
- _[cds-compiler@6.9.0]_ **seal**: set `meta.compilerCsnFlavor` in the SEAL transformed CSN
- _[cds-compiler@6.9.0]_ **effective:** set `meta.compilerCsnFlavor` in the effective CSN
- _[cds-compiler@6.9.0]_ **sql:**
  - set `meta.compilerCsnFlavor` in SQL transformed CSN
  - allow single-leafed structures within a `list` on the left-hand side of the `IN` operator.
    For example `(author, struct) in (...)` becomes `(author_ID, struct_leaf) in (...)`.
  - support `cds.Vector` on Postgres and H2
- _[cds.java@4.9.0]_ The i18n message key used with `@assert` is now also used as error code on resulting validation errors.
- _[cds.java@4.9.0]_ Support OData v4 [Date and Time](https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_DateandTimeFunctions) functions: `date`, `time`.
- _[cds.java@4.9.0]_ Protocol annotations like `@odata`, `@hcql`, etc. now also support specifying the path for that protocol, e.g. `@odata: 'browse'`.
- _[cds.java@4.9.0]_ The property `cds.protocols.defaults` now lets you specify the list of default protocols each ApplicationService is serving. By default an ApplicationService serves protocols "odata-v2" and "odata-v4". Value "*" adds all available protocols as default.
- _[cds.java@4.9.0]_ Enabled to opt-in for RFC BAPI transaction commit work & wait, instead of commit work that is executed after each RFC call.
- _[cds.java@4.9.0]_ Added new OpenRewrite recipes for deprecated apis that will be removed with CAP 5.0.
- _[cds.java@4.9.0]_ H2/SQLite: Support vector functions in DDL (beta).
- _[cds4j@4.9.0]_ Support functions to extract date and time components from temporal: `date`, `time`.
- _[cds4j@4.9.0]_ Introduce caching for builder proxies.
- _[cds4j@4.9.0]_ Support for the SAP HANA functions `years_between`, `months_between`, `days_between`, `seconds_between`, and `nano100_between`. The functions are emulated on non-SAP HANA databases.
- _[cds4j@4.9.0]_ SAP HANA:
  - support fallback to non-hex SQL on "HEX enforced but cannot be selected" errors on SAP HANA QRC 1/2026.
  - use native JDBC/ngdbc support for `cds.Vector` in `String` and `float[]` format.
- _[cds4j@4.9.0]_ Support `cds.Vector` on H2, SQLite and PostgreSQL.
- _[cds4j@4.9.0]_ Support `CQL.vector_embedding` on SAP HANA, H2 and SQLite.
- _[cds4j@4.9.0]_ Support `CQL.l2Normalize` on SAP HANA, PostgreSQL, H2 and SQLite. (beta)
- _[cds4j@4.9.0]_ Support selects from pseudo table. (beta)
- _[cds@9.9.0]_ Event Queue Scheduling:
  - Support for `srv.schedule.task(event, data)` to create so-called "singleton tasks" that exist only once as well as `srv.unschedule.task(event)` to remove them again
  - Support for cron expressions as argument for `.every()`, e.g., `.every('*/5 * * * 2')` for "Every 5 minutes, only on Tuesday"
  - Support for `cds.appid` for isolating microservices in shared HDI scenarios
    - The experimental option `targetPrefix` is temporarily kept to allow flushing tasks that rely on it, but will be removed soon
  - Streamlined aggregation of `queued` service effective configuration
- _[cds@9.9.0]_ Advanced Event Queue Scheduling via Scheduling Service (Beta; enable via `cds.requires.scheduling = true`)
  - Efficient leftover processing by maintaining a schedule in `t0` (requires `@sap/cds-mtxs^3.9`)
  - Revised event processing (ongoing)
  - Only applicable with queue kind `persistent-queue` (which is the default)
- _[cds@9.9.0]_ In addition to `.csv` files, and `.json` files, initial data can now also be provided via `.yaml` files
  - Limitation: Only supported in Node.js runtimes, so far, not yet by `cds build` for Java, and for production deployments to HANA
- _[cds@9.9.0]_ Support `$select` and `$expand` from draft actions: `draftNew`, `draftPrepare`, `draftActivate`, and `draftEdit`
- _[cds@9.9.0]_ Enable referencing action request responses in `dependsOn` of subsequent requests in the same batch
- _[cds@9.9.0]_ Import files the ESM way in ESM projects, e.g. to support mocking in Vitest
- _[cds@9.9.0]_ Node.js-native `fetch`-based HTTP client for remote service consumption (beta)
  - Used automatically when `@sap-cloud-sdk/http-client` is not installed or forced via `cds.remote.native_fetch = true`
  - Known limitations:
    - Resolving destinations via the BTP Destination Service is not supported
    - Only basic authentication is supported
- _[cds@9.9.0]_ `cds.infer.elements` now also supports SQL-style casts, wildcard overrides and `excluding` clauses
- _[cds@9.9.0]_ Support for restricting the levels of `$expand` (beta)
  - `@Capabilities.ExpandRestrictions.MaxLevels` defines the maximum allowed depth of an `$expand` starting from the annotated entity
  - Additionally, `@Capabilities.ExpandRestrictions.Expandable: false` is interpreted as `@Capabilities.ExpandRestrictions.MaxLevels: 0`
  - Finally, there is global config option `cds.query.restrictions.expand.maxLevels`
- _[cds@9.9.0]_ Kafka: `cds.requires.messaging.config = { ... }` allows custom Kafka client config for development scenarios
- _[cds-mtxs@3.9.0]_ It is now possible to create additional instances of the internal Service Manager Client or HANA TMS v2 client to access alternative services. Instances can be created using `cds.xt.containerManager.newInstance(serviceCredentials)`.
- _[cds-mtxs@3.9.0]_ Environment variables `APPLICATION_ID`, `APPLICATION_VERSION_INFO`, and `DEPLOY_ID` are now forwarded to the HDI deploy environment.
- _[cds-mtxs@3.9.0]_ Database deployment can be individually disabled for `cds.xt.SmsProvisioningService` or `cds.xt.SaasProvisioningService` for hybrid scenarios. It can be confiured by e. g. `cds.requires['cds.xt.SmsProvisioningService'] = { "subscribe": { "skip-db": true } }`. This is only available for synchronous subscription.
- _[cds-mtxs@3.9.0]_ `cds.outbox.Messages` to model of `t0`.
- _[cds-mtxs@3.9.0]_ Subscription payloads may now include a `custom_label` in the `_.hdi.create` options to attach additional labels to HANA containers and, for the service-manager, also to bindings. Example: `_.hdi.create.custom_label = 'my_key=my_value'`.

### Changed {#apr-26-changed}

- _[cds-dk@9.9.0]_ `cds add html5-repo` creates destinations as part of the app deployer module instead of initial destinations in the destination service.
- _[cds-dk@9.9.0]_ `axios` is removed from `dependencies`.
- _[cds-dk@9.9.0]_ `cds init` no longer generates database-specific extensions (`db/hana/`, `db/sqlite/`) and their profile-based configuration in the sample template.
- _[vscode-cds@9.9.0]_ removed `https-proxy-agent` in favour of native VS Code / fetch proxy handling.
- _[vscode-cds@9.9.0]_ `CAP Release Notes` page shows a lightning bolt logo as dimmed background when loading fails.
- _[vscode-cds@9.9.0]_ Zoom direction in Analyze Dependencies was flipped on macOS to have a more natural UX
- _[cds-compiler@6.9.0]_ **compiler:**
  - add `compilerVersion` to CSN meta
  - issue a warning if a structure in an annotation value would have the same CSN representation as an expression
  - issue warnings for extends on built-in types
  - warn on duplicate members from includes via extend
- _[cds-compiler@6.9.0]_ **odata:**
  - update OData vocabularies: Common, Core, UI
  - using `@readonly` with an expression value on entities or aspects is no longer silently accepted and now produces an error
- _[cds.java@4.9.0]_ `cds-feature-bdc` enforces an allow-list for Formation Type Ids (e.g. `cds.bdc.formationTypeIds`) in production profiles from now on.
- _[cds.java@4.9.0]_ The MTX sidecar health check now uses a configurable timeout instead of a hard-coded 1s limit. Set `cds.multitenancy.health-check.timeout` (type: `Duration`, default: `1s`) to adjust the threshold for your environment.
- _[cds.java@4.9.0]_ The switch `cds.draft.post-active` now defaults to `true`. In case it is set to `false` or not set all POST requests to entities with draftNew action will create a new active instance.
- _[cds.java@4.9.0]_ Improved error handling in `cds-adapter-mcp` to prevent stack traces and internal details from leaking in error responses.
- _[cds4j@4.9.0]_ Path segments for to-one associations no longer contain a filter.
- _[cds@9.9.0]_ I18n keys in `@assert` error messages are now used as error codes. The generic `ASSERT` error key is no longer used if the `message` is not an i18n key.

### Fixed {#apr-26-fixed}

- _[cds-dk@9.9.0]_ `cds add xsuaa --plan broker` does not use plan `application` in approuter scenarios.
- _[cds-dk@9.9.0]_ `cds add postgres` for Kyma no longer adds an invalid `values.yaml` entry for `postgres-db-deployer`.
- _[cds-dk@9.9.0]_ `cds init/add esm` now also fills `package.json` with proper content.
- _[cds-dk@9.9.0]_ `cds deploy --to hana --resolve-bindings` no longer overwrites credentials of all hana-tagged `VCAP_SERVICES` entries with the target container's service key when multiple HDI bindings are present.
- _[cds-dk@9.9.0]_ `cds add data` now adds a newline character at the end of csv files to make appending content easier.
- _[cds-dk@9.8.3]_ Dependency updates, e.g. for CVE-2026-33937.
- _[cds-dk@9.8.3]_ `cds add xsuaa --plan broker` does not use plan `application` in approuter scenarios.
- _[cds-dk@8.9.13]_ CVE-2025-15284: update `express` to fix vulnerability with `qs` <6.14.1
- _[vscode-cds@9.9.0]_ Prevent error when scanning for LSP-restart settings in configuration.
- _[vscode-cds@9.9.0]_ support CDS lookup dirs defined in subfolders e.g. pom.xml (resolve cds env per project root instead of workspace root)
- _[vscode-cds@9.9.0]_ WorkspaceSymbols: NodeJS V8 crashed for very large workspaces
- _[vscode-cds@9.9.0]_ WorkspaceSymbols: filter out symbols from ignored files
- _[vscode-cds@9.9.0]_ add quotes around the binary in the default cds-typer command to support paths with non-alphanumeric characters
- _[cds-compiler@6.9.0]_ **compiler:**
  - don't introduce a strange `cast` property in the CSN for a column with an expand on a to-many association
  - while crawling tokens for LSP, allow extensions without name
- _[cds-compiler@6.9.0]_ **effective:** don't absolutify paths in filters in annotations
- _[cds-compiler@6.9.0]_ **sql:** properly resolve references in annotation values and `on` conditions for a column inside an expand without base reference
- _[cds.java@4.9.0]_ HCQL V2: placeholder `$key` is no longer added to the HCQL request.
- _[cds.java@4.9.0]_ Further improved performance of inactive draft delete during save.
- _[cds.java@4.9.0]_ Fixed a bug, causing tenant-related properties (iss, subDomain) not getting propagated to the new `RequestContext` when calling `systemUser()`.
- _[cds.java@4.9.0]_ `cds-feature-change-tracking` performance is improved when large number of entities are inserted.
- _[cds.java@4.9.0]_ Fixed a bug, causing DraftMessages for composition of one to return invalid message targets.
- _[cds.java@4.9.0]_ Fixed a bug, causing `@Core.MediaType` and `@Core.ContentDisposition.Filename` annotations with expression syntax (e.g., `@Core.MediaType: (mimeType)`) to not resolve correctly after type flattening.
- _[cds4j@4.9.0]_ Fixed constant timestamp values in SQL statements. They are now set in UTC independently of the JVM's time zone.
- _[cds4j@4.9.0]_ Fixed broken SQL if a hierarchy view has a sort order specified by order by.
- _[cds4j@4.9.0]_ Fixed SQL error on SAP HANA when using `CASE WHEN` with a constant boolean condition on the select list.
- _[cds@9.9.0]_ Calculation of `nextLink` based on `$skipToken` for requests with `$top` and/or `$skip`
- _[cds@9.9.0]_ Stale entries in `.cds-services.json` are removed reliably, so that `cds mock/watch` no longer try to connect to dead servers
- _[cds@9.9.0]_ Configuration shortcuts like `cds.requires[service] = true` always preserve object configuration from other sources
- _[cds@9.9.0]_ `cds-serve --project <dir> --service <name>` now honors the explicit service instead of defaulting to `all`
- _[cds@9.9.0]_ Handle expression values for `@Core.MediaType`, like `@Core.MediaType: (mimeType)`
- _[cds@9.9.0]_ Will not add a default target to `MULTIPLE_ERRORS`-type error
- _[cds@9.9.0]_ Enabled creating active composition children using `direct_crud` requests via navigation
- _[cds@9.9.0]_ Removed artifacts of draft metadata from active entity data
- _[cds@9.9.0]_ Prevent type error when encountering an unexpected symbol key in `cds.ApplicationService`
- _[cds@9.9.0]_ Reject requests with `$filter` on operations with primitive return types
- _[cds@9.8.5]_ `compile.for.direct_crud` is resilient against draft-enablement on non-service entities
- _[cds@9.8.5]_ Requests targeting a view with parameters are now correctly send to remote OData services
- _[cds@9.8.5]_ `TypeError` due to unchecked access when handling `PUT` on collection via navigation
- _[cds@9.8.5]_ Null value sorting in draft-enabled scenarios now matches database behavior (NULLS FIRST for ASC, NULLS LAST for DESC)

### Removed {#apr-26-removed}

- _[vscode-cds@9.9.0]_ Unsupported `play` button for CDS queries in the `CAP Release Notes` page.

## March 2026

### Added {#mar-26-added}

- _[cds-dk@9.8.2]_ `cds init` now removes the `.vscode` folder when creating projects in SAP Business Application Studio in order to restore compatibility with other project generators. This is a temporary solution likely to be reverted in cds-dk 10.
- _[cds-dk@9.8.0]_ `cds up --overlay <file|name> (Cloud Foundry) now resolves MTA extension descriptors (<name>.mtaext) from the project root.`
- _[cds-dk@9.8.0]_ `cds add postgres` now supports Kyma with automatic database provisioning and IP whitelisting.
- _[cds-dk@9.8.0]_ `cds deploy --to hana --store-credentials` now warns about the deprecated option `--store-credentials`.
- _[cds-dk@9.8.0]_ `cds import` now uses the default options defined via `cds.import.options[<from>] = {option: 'value'}`
- _[cds-dk@9.8.0]_ `cds version` now shows version of `@sap/eslint-plugin-cds`.
- _[cds-dk@9.8.0]_ `cds version --json` returns a stable output format as JSON.
- _[cds-compiler@6.8.0]_ **api:** basic experimental support for code completion in `cds repl`
- _[cds-compiler@6.8.0]_ **compiler:**
  - retain original meta property in CSN
  - add compilerCsnFlavor to meta property
- _[cds-compiler@6.8.0]_ **sql:**
  - Add support for `cds.Vector`
  - Allow migration from cds.String to cds.LargeString
  - Fiori Tree Views in the database backend
  - For postgres: warning for identifiers that exceed the databases length limit
- _[cds.java@4.8.0]_ Support aggregate functions in `@assert`.
- _[cds.java@4.8.0]_ Setting `cds.messaging.services.<key>.queue.config.channel: null` for a Kafka channel-based messaging service now disables the default channel. If no channel is explicitly configured for an event using `@kafka.channel` the topic itself is used as channel.
- _[cds.java@4.8.0]_ Improved performance of queries merging active and inactive data (e.g. "All" Fiori list-report filter), when reading draft-enabled entities for a user with a lot of drafts.
- _[cds.java@4.8.0]_ Improved performance of inactive draft delete during draft save.
- _[cds.java@4.8.0]_ The `add` goal of the `cds-maven-plugin` now adds a dependency to `cf-java-logging-support-servlet` for feature APPLICATION_LOGGING.
- _[cds.java@4.8.0]_ HCQL adapter and HCQL client for remote services now support HCQL V2.
- _[cds.java@4.8.0]_ Actions annotated with `@Common.DraftRoot.NewAction` now have a default `@On` handler.
- _[cds.java@4.8.0]_ Setting `cds.drafts.postActive` causes plain POST requests to a draft-enabled entity (without explicit `IsActiveEntity`) to create an active instance, in case the entity has a draft new action.
- _[cds.java@4.8.0]_ Support OData v4/v2 [Date and Time](https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_DateandTimeFunctions) functions: `year`, `month`, `day`, `hour`, `minute`, `second`.
- _[cds.java@4.8.0]_ Improved layout of change tracking UI on mobile devices.
- _[cds.java@4.8.0]_ Setting `cds.environment.deployment.appid` allows to define an identifier for the applications using the persistent outbox on shared databases.
- _[cds4j@4.8.0]_ Support aggregate functions on associations in expressions of calculated elements, by moving them into a subquery.
- _[cds4j@4.8.0]_ Support functions to extract date and time components: `year`, `month`, `day`, `hour`, `minute`, `second`.
- _[cds@9.8.0]_ Calculated elements are now properly calculated in draft state. So far, the elements have been treated as regular elements ignoring the calculation.
  - In case this causes issues, you can opt-out with `cds.fiori.calc_elements = false` until cds10
- _[cds@9.8.0]_ $compute supports decimal constants
- _[cds@9.8.0]_ Support `/$metadata` requests in OData batch
- _[cds@9.8.0]_ Support for `@odata.bind` parameters in collection bound actions
- _[cds@9.8.0]_ Support for renaming of foreign keys of managed associations while resolving views
- _[cds@9.8.0]_ Support for `Prefer: return=minimal` header in generic draft actions
- _[cds@9.8.0]_ OData batch: Parallel processing of atomicity groups via `cds.odata.max_batch_parallelization=<number>` (default: `1`)
  - Only applicable if `$batch` request exclusively contains `GET` requests
  - Note: Parallel processing of atomicity groups is in conflict with OData specification for `multipart/mixed`!
  - Additional experimental feature: Bundle independent `GET` requests into single transaction via `cds.odata.group_parallel_gets=true`
- _[cds@9.8.0]_ `hcql`: request raw stream via http header `Accept: application/octet-stream`
- _[cds-mtxs@3.8.0]_ If not needed, CSV data deployment with extensions can be disabled with `cds.requires['cds.xt.ExtensibilityService'].activate['skip-csv'] = true`. This improves the performance when pushing extensions if many extensions already exist.

### Changed {#mar-26-changed}

- _[cds-dk@9.8.0]_ `cds add multitenancy` does not add an explicit `java` profile to the main app any more.
- _[cds-dk@9.8.0]_ `cds deploy` and `cds bind` support Kyma-by-default for projects with Kyma-only deployment descriptors.
- _[cds-dk@9.8.0]_ `cds deploy --to hana --on k8s` now supports deploying to SAP HANA using an existing Kubernetes service binding, allowing non-default Kyma naming conventions.
- _[cds-dk@9.8.0]_ `cds import` now correctly imports Views with Parameters from a given OData EDMX service definition.
- _[cds-dk@9.8.0]_ `cds import` now interprets empty navigation path references as if it would be a null value.
- _[cds-compiler@6.8.0]_ **compiler:**
  - improve warning in case of invalid type for key
  - simplify syntax error text when expecting Comparison and Operator tokens
  - improve support for code completion with `case` expressions, queries, and subqueries
- _[cds.java@4.8.0]_ Generated `package.json` for new projects no longer contains a `description`, `repository` and `license`.
- _[cds4j@4.8.0]_ Changed the fallback mode of expand to `parent-keys`.
- _[cds4j@4.8.0]_ A query that uses a ref as substring|prefix|suffix in `contains`|`startWith`|`endsWith` is now rejected. Only literals or parameters may be used.
- _[cds@9.8.0]_ Destination caching is no longer modified at runtime. Caching configuration is now managed by the Cloud SDK.
- _[cds@9.8.0]_ `cds.env` now supports for credentials lookup Kubernetes secrets with a structure like `${SERVICE_BINDING_ROOT}/${SERVICE}/${INSTANCE}/${BINDING}`. Previously only one level between the root and the binding was possible.
- _[cds@9.8.0]_ Allow using ESlint 10 by opening version range `^9 || ^10` for `@eslint/js`
- _[cds@9.8.0]_ Outbound `hcql` requests always via `POST`

### Fixed {#mar-26-fixed}

- _[cds-dk@9.8.2]_ `cds add workzone` for Kyma correctly adds the `html5-apps-repo-runtime` to its `Chart.yaml`.
- _[cds-dk@9.8.2]_ `cds add app-front` in combination with `cds add ias` correctly includes all `IASDependencyName` settings.
- _[cds-dk@9.8.2]_ `cds build` has improved performance in some scenarios.
- _[cds-dk@9.8.1]_ `cds build` plugins correctly formats a thrown `BuildError` in the logs.
- _[cds-dk@9.8.1]_ `cds version` also reports a cds-dk installation in Java projects that don't have such a dependency in their `package.json`.
- _[cds-dk@9.8.0]_ `cds bind` reports additional error information while accessing Cloud Foundry services.
- _[cds-dk@9.8.0]_ `cds version` now works again if executed in subfolders of Java projects without a `pom.xml` file.
- _[cds-dk@9.8.0]_ `cds add workzone` in combination with `cds add ias` adds the `HTML5.IASDependencyName` for the `srv-api`.
- _[cds-dk@9.8.0]_ `cds add lint` now creates an ESLint config file again.
- _[cds-dk@9.8.0]_ `cds import` now correctly handles enum types as keys in EDMX v4 import.
- _[cds-dk@9.8.0]_ `cds push` now shows the correct passcode URL when the subdomain changes between logins.
- _[vscode-cds@9.8.0]_ running CDS Typer in WSL projects
- _[vscode-cds@9.8.0]_ formatter: indentation of annotations to entities with annotated actions
- _[cds-compiler@6.8.0]_ **sql:**
  - do not report validation errors on entities marked as `@cds.persistence.skip`
  - normalize named arguments for portable functions
  - properly flatten associations for temporal unique constraints
- _[cds.java@4.8.0]_ Fixed a bug, causing the IAS tenant host not getting propagated to Cloud SDK if the issuer does not include a protocol scheme.
- _[cds.java@4.8.0]_ Fixed a bug, causing incorrect predicates in remote OData adapter for expressions with `false` literals.
- _[cds.java@4.8.0]_ Fixed a bug, causing errors in case custom `EventContext` interfaces were (package) private.
- _[cds.java@4.8.0]_ Fixed a bug, causing draft data created from a deep update to have `IsActiveEntity` and `HasDraftEntity` set to `null`.
- _[cds.java@4.8.0]_ Fixed a bug, causing incorrect executions of cds-maven-plugin `build` and `resolve` goals, when executed from the root directory.
- _[cds.java@4.8.0]_ Fixed a bug, causing drafts to be created in OData V4, even if `IsActiveEntity` was explicitly set to `true` in a preceeding URL segment.
- _[cds.java@4.8.0]_ Fixed a bug, causing TenantProviderService.readTenantInfos to throw an exception with TMSv2.
- _[cds4j@4.8.0]_ Fixed parsing of calculated elements with value `null`.
- _[cds4j@4.8.0]_ Fixed SQL error due to missing CTEs when using `exits` on runtime views in infix filters.
- _[cds4j@4.8.0]_ Fixed SQL error when using `exists` predicates in calculation expressions.
- _[cds4j@4.8.0]_ Fixed a bug forcing runtime view mode `resolve` for queries using `lock(null)` (incl. queries parsed from cqn).
- _[cds4j@4.8.0]_ `matchesPattern` is correctly parsed from and to JSON when the flags are omitted.
- _[cds4j@4.8.0]_ Hierarchical selects now optimize the select list, resulting in simpler queries.
- _[cds@9.8.4]_ `res.statusCode` of batch sub-requests did not consider potential modifications during `srv.on('error')`
- _[cds@9.8.4]_ Restore login challenge for late `401` with mocked authentication in `$batch`
- _[cds@9.8.4]_ Batched request fails when depended upon atomicity group fails
- _[cds@9.8.3]_ OData batch parallel processing: Drain remaining queue when aborting
- _[cds@9.8.2]_ Compatibility with `@eslint/js^10`
- _[cds@9.8.1]_ OData batch parallel processing: Preserve request sequence for OData v2
- _[cds@9.8.1]_ In inbound messaging, only load the extended model if there is a tenant
- _[cds@9.8.1]_ Ensure `cds.fiori.direct_crud` is considered during `cds build`
- _[cds@9.8.0]_ OData JSON batch:
  - Response value formatting and escaping for non `application/json` responses
  - Setting correct `content-type` header value for all content types
- _[cds@9.8.0]_ `content-length` is now set for OData multipart/mixed batch subrequest responses
- _[cds@9.8.0]_ Connection issues when a Kafka cluster has been created with public endpoints
- _[cds@9.8.0]_ Fix duplicated columns in case of `$expand=*`
- _[cds@9.8.0]_ Unhandled promise rejection in `cds.spawn` if extended model could not be loaded
- _[cds@9.8.0]_ Set `msg.tenant` & `msg.event` of messages received from Kafka, based on the stringified header values
- _[cds@9.8.0]_ `$expand=*` expands only the exposed associations
- _[cds@9.8.0]_ Broken `odata-v2` formatting for values used in `beween- and`, `in` and `lambda` type expressions
- _[cds@9.8.0]_ Appending `/$value` to an entity that is not a media entity returns `400 Bad Request`
- _[cds@9.8.0]_ In Jest test runs in ESM projects, files are now loaded properly
- _[cds@9.8.0]_ Correctly resolve dependencies in workspace setups where the CAP project is not at the root
- _[cds@8.9.9]_ Requests targeting a view with parameters are now correctly send to remote OData services
- _[cds-mtxs@3.8.1]_ More accurate exception handling if the extension table `cds.xt.Extensions` cannot be read.
- _[cds-mtxs@3.8.1]_ For HANA, tenant subscription now stores the tenant database `schema` in `cds.xt.Tenants`.
- _[cds-mtxs@3.8.1]_ The annotation allowlist correctly handles allowed parent annotations.
- _[cds-mtxs@3.8.0]_ The extension linter for annotations on structured types does not throw a `TypeError`.
- _[cds-mtxs@3.8.0]_ The response when getting extensions using `/-/cds/Extensions/<id>` now also contains the `status`.

## February 2026

### Added {#feb-26-added}

- _[cds-dk@9.7.0]_ `cds debug` is now supported for Kubernetes/Kyma deployments.
- _[cds-dk@9.7.0]_ `cds init --nodejs` as a shortcut for `cds init --add nodejs`.
- _[cds-dk@9.7.0]_ Support for express 5 (in addition to express 4).
- _[cds-dk@9.7.0]_ `cds deploy --to hana` now supports `--out` to specify the output directory for generated files.
- _[cds-dk@9.7.0]_ `cds mock <service>` as a shortcut for `cds serve --mocked --project <service> --in-memory? --port 0`.
- _[cds-dk@9.7.0]_ `cds add ias` adds a URL for local approuter testing to `redirect-uris` if approuter is configured.
- _[cds.java@4.7.0]_ Added resilient connection handling in `cds-feature-kafka` for the case that the Kafka cluster is not available when a microservice starts.
- _[cds.java@4.7.0]_ Improved handling of `@assert` and dynamic `@mandatory`/`@inapplicable` on managed associations.
- _[cds.java@4.7.0]_ Added support for `publishPrefix` and `subscribePrefix` in configuration for `cds-feature-kafka`.
- _[cds.java@4.7.0]_ Added support for Event Hub integration via `mvn cds:add -Dfeature=EVENT_HUB`
- _[cds.java@4.7.0]_ Reduced database lock conflicts when processing messages of unordered outboxes by skipping locked entries.
- _[cds4j@4.7.0]_ Allow using `$now` as default value for elements of type `Date`.
- _[cds4j@4.7.0]_ Support function `ceil` as synonymn for `ceiling`.
- _[cds4j@4.7.0]_ Allow supplying foreign-key values for path-based inserts via the data entries.
- _[cds4j@4.7.0]_ Draft-enclosed associations now retain `@cascade` annotations.
- _[cds4j@4.7.0]_ SAP HANA, PostgreSQL and H2: Support `Select.lock(mode, CqnLock.Wait.SKIP_LOCKED)`, which returns immediately and yields only rows that are not currently locked (non-blocking).
- _[cds@9.7.0]_ Support for express 5 (in addition to express 4)
- _[cds@9.7.0]_ New config option `cds.requires.db.data` to configure source folders for initial data and test data CSV files
- _[cds@9.7.0]_ Enterprise Messaging now caches access tokens to support high-throughput message processing from Event Mesh
- _[cds@9.7.0]_ Automatically add `@Common.DraftRoot.NewAction` for each draft-enabled entity during `compile.for.odata` via `cds.fiori.direct_crud=true`
- _[cds@9.7.0]_ Support for `null` value in `@odata.bind`
- _[cds@9.7.0]_ Validation of flow annotations at compile step

### Changed {#feb-26-changed}

- _[cds-dk@9.7.0]_ `cds version` received major enhancements: It's now fully based on the `npm ls` command and always prints a tabular output. Also some new flags were added; check `cds version --help` for details.
- _[cds-dk@9.7.0]_ `cds deploy --to k8s` increased the timeout to wait for the HDI container creation from 120 to 180 seconds.
- _[cds-dk@9.7.0]_ `cds add` facets now abort when executed in a folder that is neither a Node.js nor a Java project.
- _[cds-dk@9.7.0]_ `cds add lint` now also adds the .java extension to the files that are linted within VSCode.
- _[cds-dk@9.7.0]_ `cds init` now restricts project names to 64 characters maximum, requiring them to start with an alphanumeric character or `_`, and contain only alphanumeric characters, `_`, and `-`.
- _[cds-dk@9.7.0]_ `cds import` now generates an on condition for associations if the navigation property in an imported OData v4 service has a referential constraint.
- _[cds-dk@9.7.0]_ `cds build` does not ignore wildcarded folders like `app/*` any more.
- _[cds-dk@9.7.0]_ `cds env --resolve-bindings/-b` also considers local service bindings.
- _[cds.java@4.7.0]_ `Update` statements triggered from `draftActivate` now include a key filter in the statement's `ref`.
- _[cds.java@4.7.0]_ `cds-feature-flow` now rejects the statements for flow-annotated actions without full key in the infix filter.
- _[cds@9.7.0]_ Colors are enabled by default in GitHub Actions workflows
- _[cds@9.7.0]_ `queue`: Manually update `lastAttemptTimestamp` of outbox messages (instead of relying on `@cds.on.update: $now`)
- _[cds@9.7.0]_ `express` is no longer a peer dependency of `@sap/cds` but a regular one. Applications that want to pin it or require it in their custom code, should declare the dependency on their own.
- _[cds@9.7.0]_ `hcql` response format: `{ data: [], errors: [] }`
- _[cds-mtxs@3.7.1]_ Provisioning service calls now skip `cds.xt.DeploymentService` operations if it is disabled, logging only a warning.

### Fixed {#feb-26-fixed}

- _[cds-dk@9.7.2]_ `cds build --for mtx-sidecar` correctly resolves `@source` in custom MTX sidecar services.
- _[cds-dk@9.7.2]_ `cds build` now utilises caching for workspace resolution, which will speed up build times for projects with many workspaces.
- _[cds-dk@9.7.2]_ `cds add` commands don't augment Helm Charts if not managed by CAP.
- _[cds-dk@9.7.2]_ `cds add approuter` for Kyma configures token exchange for managed approuter scenarios.
- _[cds-dk@9.7.2]_ `cds bind` reports additional error information while accessing Cloud Foundry services.
- _[cds-dk@9.7.1]_ `cds add completion` now works without specifying the project runtime.
- _[cds-dk@9.7.1]_ `cds add xsuaa` correctly adds the the binding for the `html5-apps-deployer` on Kyma.
- _[cds-dk@9.7.1]_ `cds version` prints an older format in a legacy situation.
- _[cds-dk@9.7.1]_ `cds add nodejs` is automatically added in BAS scenarios for compatibility if no other runtime is specified.
- _[cds-dk@9.7.1]_ `cds add data -n` works correctly for `Composition of one` scenarios.
- _[cds-dk@9.7.0]_ `cds add sqlite --for production` adds `@cap-js/sqlite` to `dependencies`.
- _[cds-dk@9.7.0]_ `cds build --ws` fixes a race condition.
- _[cds-dk@9.7.0]_ `cds build` now places the `i18n` folder in the generated output in nested locations.
- _[cds-dk@9.7.0]_ `cds build --for mtx-sidecar` loads CAP plugins from the MTX sidecar instead of the main app for generating the sidecar CSN.
- _[cds-dk@9.7.0]_ `cds add ias` uses a matching `IASDependencyName` for the application content deployer.
- _[cds-dk@9.7.0]_ `cds add ias` uses a more generic `redirect-uris` pattern.
- _[cds-dk@9.7.0]_ `cds import` no longer generates a managed association for navigation properties of imported OData v4 services if the foreign key, the managed association would generate, already exists.
- _[cds-dk@9.7.0]_ `cds add multitenancy` for Java correctly creates a `package-lock.json` in _mtx/sidecar_.
- _[cds-dk@9.7.0]_ `cds add xsuaa` works properly when executed after `cds add workzone`.
- _[cds-dk@8.9.14]_ CVE-2026-25639: Update `axios` version to 1.13.5
- _[eslint-plugin-cds@4.2.1]_ Removed usage of deprecated API in `lib/utils/rules.js`
- _[eslint-plugin-cds@4.2.0]_ Use ESLint API supported by versions `9` and `10`.
- _[eslint-plugin-cds@4.1.2]_ No longer crash on .java files larger than 32 kB.
- _[eslint-plugin-cds@4.1.2]_ Weaken `java/cql-class-targets` to only warn when a string literal is passed as parameter.
- _[eslint-plugin-cds@4.1.2]_ `assoc2many-ambiguous-key` no longer falsely warns about 1-n joins when an infix filter reduces the joined relation to a single row.
- _[cds-compiler@6.7.3]_ **sql:** do not resolve path navigations to virtual elements which resulted in an internal error.
- _[cds-compiler@6.7.2]_ **compiler:** Just issue warning for `using` declaration referring to nothing
  (fixes regression introduced with v6.7.0 if there is a file containing
  a `namespace` declaration, but no definitions)
- _[cds-compiler@6.7.2]_ **effective:** clean up internal Symbols from meta section
- _[cds-compiler@6.7.2]_ **sql:** clean up internal Symbols from meta section
- _[cds.java@4.7.0]_ Avoid extra parenthesis in `filter` predicate of `$apply` in remote OData.
- _[cds.java@4.7.0]_ Reduced the number of database calls to set session variables (on Postgres)
- _[cds.java@4.7.0]_ Fixed a bug, that caused skipping CQN Predicate `FALSE` in remote OData.
- _[cds.java@4.7.0]_ Fixed a bug, causing duplicated draft messages in case of entities with compound keys.
- _[cds.java@4.7.0]_ Fixed a bug, causing duplicated draft messages in case of String-based targets.
- _[cds.java@4.7.0]_ Fixed a bug, causing HTTP status `500` instead of `400` (not supported) when setting the `Content-Type: application/pdf` header for OData v4 action.
- _[cds4j@4.7.0]_ Fixed exception on averaging over associations when using the static query builder API.
- _[cds4j@4.7.0]_ Fixed refs with `$self` in exists predicates.
- _[cds4j@4.7.0]_ Fixed "No element found" exception on statements using match predicates (exists, any, all) in subqueries.
- _[cds4j@4.7.0]_ Fixed projection resolution in results:
  - for null values when paths are aliased by the first segment.
  - for paths whose last segment equals another element in the projection.
- _[cds4j@4.7.0]_ Fixed a bug in recursive hierarchy on HANA, causing sporadic incorrect sort order of elements.
- _[cds4j@4.7.0]_ Fixed an exception when using `exists` predicates in runtime views.
- _[cds@9.7.1]_ `DELETE` requests nulling a `@mandatory` property
- _[cds@9.7.1]_ Correctly call remote collection bound action for `odata-v4` services
- _[cds@9.7.1]_ Flow annotation validation at compile time strictly follows the documentation: only enum status values are allowed
  - Status value validation can be disabled via `cds.features.skip_flows_validation=true`
- _[cds@9.7.0]_ Correctly respond with status `404` when `@cds.api.ignore` annotated action is requested
- _[cds@9.7.0]_ Ensure plugin debug emitted with `DEBUG=all`
- _[cds@9.7.0]_ Prevent app crash when `JSON.parse` of operation parameters fails
- _[cds@9.7.0]_ Generate correct UI annotations for Status Transition Flows when building and compiling
- _[cds@9.7.0]_ Remote services: Prefer `cds.context.user?.authInfo?.token?.jwt` over JWT in HTTP header of incoming request
- _[cds@9.7.0]_ References to child elements in `@Common.Text` annotations will now be checked. The reference will not be included in `@cds.search`, in case ...
  - ... the reference can not be found in the annotated entity's associations
  - ... the referenced entity is annotated with `@cds.persistence.skip`
  - ... the referenced field does not exist in the referenced entity
  - References to children of children will be ignored.
- _[cds@9.7.0]_ OData parser: Ignore superfluous brackets
- _[cds@9.7.0]_ Prevent app crash in case of `req.reject()` during draft activate triggered via OData batch
- _[cds@9.7.0]_ `cds minify` no longer removes services if their actions are kept
- _[cds@9.7.0]_ Better error when subquery can't be resolved for the current service
- _[cds@9.7.0]_ Flows: Record transition to default value on `INSERT`/ `UPSERT`
- _[cds@9.7.0]_ Error response properties of OData batch subrequests are now formatted identically to properties in single OData error responses
- _[cds@9.7.0]_ Prevent `@Common.numericSeverity` from appearing in persistent draft messages (in addition to the correct property `numericSeverity`)
- _[cds-mtxs@3.7.1]_ HANA deployment parameters set via the `HDI_DEPLOY_OPTIONS` environment are now correctly evaluated.

### Removed {#feb-26-removed}

- _[cds@9.7.0]_ `@cds.on.update: $now` from `cds.outbox.Messages.lastAttemptTimestamp`


## January 2026

### Added {#jan-26-added}

- _[vscode-cds@9.7.0]_ Multi-Cursor support for range selection
- _[vscode-cds@9.7.0]_ Folding range for consecutive `using` statements
- _[vscode-cds@9.6.3]_ Progress reporting for persistency
- _[vscode-cds@9.6.0]_ (Experimental) persistency of where-used index
  This feature allows to persist/restore where-used indexes on a per-file basis to speed up indexing of large projects
  with many root models. It is currently experimental and must be enabled via user setting `cds.workspace.persistency.enabled`.
  There are a couple of user settings to fine tune the behavior
  - `cds.workspace.persistency.enabled`: general enablement. All other settings have no effect if this is disabled.
  - `cds.workspace.persistency.persistAfterSave`: when a file is saved its index is persisted.
  - `cds.workspace.persistency.persistAfterCompile`: when (closed) CDS files are compiled (also as part of another model compilation) their index gets persisted.
  - `cds.workspace.persistency.restoreBeforeCompile`: when CDS files are part of a compilation their persisted index is used if matching
  - `cds.workspace.persistency.restoreAfterStartup`: restore all persisted indexes after start-up
  - `cds.workspace.persistency.indexAllAfterStartup`: index all files not yet persisted
  - `cds.workspace.persistency.garbageCollectOrphanedIndexesAfterStartup`: index files are written per content. Delete index files with outdated content after start-up
  - `cds.workspace.persistency.garbageCollectOrphanedIndexesAfterNSaves`: Delete index files with outdated content after specified number of `Save` requests
  - `cds.workspace.persistency.reindexAfterCompileIfRestored`: If files are part of a compilation and a matching index exist, still index again.
- _[cds-compiler@6.7.0]_ to.hdi: Support .hdbprojectionview for Data Product Production
- _[cds-mtxs@3.7.0]_ Immediate deletion of TMS HANA tenants can be enabled with configuration `cds.requires['cds.xt.DeploymentService'].hdi.create.immediate_deletion = true`
(combined with `cds.requires['cds.xt.DeploymentService'].hdi.create.cleanup_hana_tenants = true`)
- _[cds-mtxs@3.7.0]_ Container credential determination with TMS v2 is accelerated by using `$top=1` for the container query.

### Changed {#jan-26-changed}

- _[cds-dk@9.6.1]_ All commands use colored logs in GitHub Actions workflows by default.
- _[vscode-cds@9.7.0]_ Persistency of where-used index is now beta
- _[vscode-cds@9.7.0]_ User setting categories in settings UI
- _[cds-compiler@6.7.0]_ compiler: Change internal processing sequence (extensions and entity generation) for
    potentially upcoming compiler features; messages for erroneous models might differ slightly
- _[cds-compiler@6.7.0]_ for.odata/to.edm(x): Enhancements for Fiori Tree Views: support managed associations with explicit foreign keys,
    raise messages when the `@hierarchy` annotation cannot be applied.
- _[cds-mtxs@3.7.0]_ MTXS is now using fewer requests when getting container credentials from HANA TMS v2.
- _[cds-mtxs@3.6.2]_ Maximum chunk size when retrieving container bindings from service-manager is reduced to 1000.

### Fixed {#jan-26-fixed}

- _[cds-dk@9.6.1]_ CVE-2025-15284: update `express` to fix vulnerability with `qs` <6.14.1.
- _[cds-dk@9.6.1]_ `cds watch` is more efficient on Linux with respect to `inotify` events. This fixes some crash and stall situations on Linux, especially in SAP Business Application Studio where resources are shared.
- _[cds-dk@9.6.1]_ `cds build --production` correctly includes `message.properties` from i18n files provided by CAP plugins.
- _[cds-dk@9.6.1]_ `cds add sample` fixes a warning about unused imports in _app/common.cds_.
- _[cds-dk@9.6.1]_ `cds init` fixes some rare argument parsing errors.
- _[vscode-cds@9.7.0]_ Show `CAP Release Notes` automatically only if timestamp of page changed.
- _[vscode-cds@9.7.0]_ Formatter: align element names after `key` keyword only
- _[vscode-cds@9.6.3]_ Some minor fixes
- _[vscode-cds@9.6.0]_ Syntax highlighting in bracketed expressions
- _[cds-compiler@6.7.1]_ compiler: Properly accept aspects as composition targets in an `extend`
  (fixes regression introduced with v6.7.0)
- _[cds-compiler@6.7.0]_ to.sql: portable hana functions `*_between` with dates
- _[cds-compiler@6.6.2]_ for.effective: Don't resolve backlinks in aspects
- _[cds@9.6.4]_ `queue`: Too eager removal of control data from deserialized task
- _[cds@9.6.4]_ Stop overriding existing `cds.requires.[service].credentials` configurations using values from `.cds-services.json`
- _[cds@9.6.3]_ `queue`: Exactly-once guarantee only with `legacyLocking: false`
- _[cds@9.6.2]_ Consider `@mandatory.message` for the error message, when a mandatory action / function parameter is not provided
- _[cds@9.6.2]_ Respond with error code `400` when receiving requests that use `any()` / `all()` filters on an association to one
- _[cds@9.6.2]_ Error message of unknown property check will no longer include `undefined` to identify structs without a name
- _[cds@9.6.2]_ `enterprise-messaging`: Type error in check for unofficial XSUAA fallback
- _[cds@9.6.2]_ Status Transition Flows: Exclusions for multiple projections
- _[cds-mtxs@3.7.0]_ More stable deletion of HDI container instances via SAP BTP Service Manager.
- _[cds-mtxs@3.7.0]_ Extension validation no longer counts field type changes as new fields.
- _[cds-mtxs@3.7.0]_ Getting a task from the job service no returns `404` for non-existing tasks.
- _[cds-mtxs@3.7.0]_ In combination with `@cap-js/hana` version 2.6.0 pool connection errors with invalid database credentials are handled more gracefully.
- _[cds-mtxs@3.6.2]_ Command `cds-mtx` now correctly passes the services when triggering the 'served' event.
- _[cds-mtxs@3.6.2]_ HDI deployment log files are now safely written in case of process terminations.
- _[cds-mtxs@3.6.2]_ Etag returned by `/-/cds/model-provider/getCsn` now properly reflects model changes again.
- _[cds-mtxs@3.6.2]_ Reading extensions using `/-/cds/extensibility/Extensions` now also works with an outdated schema of the extension table.

### Removed {#jan-26-removed}

- _[vscode-cds@9.6.0]_ User setting `cds.workspace.debounceFastChanges`, now always enabled
