> ## Documentation Index
> Fetch the complete documentation index at: https://docs.activeviam.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

<Warning>
  From version 6.1.20 onwards, Atoti Limits version numbers are aligned with the Atoti Java SDK. Previously, Atoti Limits used its own versioning (the last release under the old scheme was 4.2.2).

  The jump in version numbers reflects this alignment. There are no missing releases between 4.2.2 and 6.1.20.
</Warning>

<Info>
  For user-facing changes, see the [Release notes](./release-notes).
  For information on upgrading from previous versions, see the
  [Migration guide](./migration-guide).
</Info>

<Update label="6.1.23" description="2026-07-10">
  ### Changed

  * PIVOT-14106 Improved performance of audit history filtering.

  ### Fixed

  * LIM-2182: The Atoti Python extension now supports connecting to a Limits server running on a different host or port. See the [Python integration guide](/dev/integration/python.html) for how to configure the URL.
  * LIM-2188: Fixed the Atoti Python UI extension getting stuck on a loading screen forever when the Limits server was unreachable, blocking login and the cube/home page even though the Atoti session itself was healthy. The extension's LIMITS client is now always provided to the UI, using a fallback service descriptor when the server's versions can't be fetched, so a down or unreachable Limits server no longer prevents the rest of the application from loading.
  * LIM-2237: Fixed limit structure creation failing validation with `Server Name ... not in the list of current connections` when the connected Atoti server's catalog name differed from the configured `limits.autoconfiguration.server-name`. Remote cube discoveries were tracked by catalog name instead of the connection server name, so the lookup returned no server; they are now keyed by the connection server name.
  * LIM-2266: Fixed bulk workflow actions (for example selecting several Six-Eyes limits and approving them together) failing with a database deadlock on SQL Server. Completing several workflow tasks at once ran them as concurrent transactions that contended on Activiti's task and bookkeeping rows and deadlocked on `ACT_RU_TASK` (SQL Server error 1205). Task state-transitions (claim, assign, release, complete) now run sequentially, while the high-volume workflow start, deletion and read operations remain parallel to preserve performance.
  * LIM-2268: `DefaultLimitsAppCrudService` now synchronizes all create, update and delete operations on the same monitor as the existing `save*` methods, so concurrent limit modifications (from triggers or the UI) can no longer interleave and corrupt the JPA/datastore writes.
  * LIM-2285: Executing a workflow with an unknown task or action now returns a clear `400 Bad Request` instead of an opaque HTTP 500 `NoSuchElementException`. Limits whose scopes are inconsistent within a structure are now caught during validation, with an error naming the conflicting limits and scope keys.
  * LIM-2305: Fixed incident review actions of the new incident review workflow not enforcing permissions, which let a user without `ROLE_PROCESS_INCIDENT` or `ROLE_LIMITS` process incidents through the `/workflow-service/execute-task-action` endpoint.
  * LIM-2319: Fixed notifications breaking after running for several hours, where streaming the stored notifications for a new subscriber while another thread published could fail with `IllegalStateException: Accept exceeded fixed size`. The notification store is now backed by a concurrent map.
  * LIM-2320: Fixed the Limits Inventory "Pending Approval" count always showing `0` for limits awaiting six-eyes approval. The count only recognised the four-eyes `INITIALIZED`/`EDIT` statuses and ignored the six-eyes `PENDING_FIRST_APPROVAL`/`PENDING_SECOND_APPROVAL` (and update/deletion/changes) statuses; they are now all counted.
  * LIM-2331: Fixed a data-access-permissions leak where a limit structure containing several limits with different scopes exposed all of its limits to a restricted user as soon as one of them was in scope. Structure visibility is unchanged (a structure is shown when the user can see at least one of its limits), but its out-of-scope limits are now removed from the returned structure so a visible structure no longer reveals limits the user is not entitled to.
  * LIM-2332: Fixed attachment workflow variables being missing from the workflow history. When converting historic variable updates, the returned map was keyed by the raw variable name (with the internal `file://` prefix) instead of the prefix-stripped user-facing name, so callers looking up an attachment by its name could not find it; the map is now keyed consistently with the other variable converters.
  * LIM-2333: Fixed a data-access `scope` permission granted on a parent level of a multi-level hierarchy not granting visibility to limits scoped at a deeper level underneath it. `contains_any`/`contains_all` scope matching only inspected each scope location's selected (leaf) level name, so a permission on, for example, `Level 2=FICC` did not match a limit scoped at `Level 3` whose stored path contains `Level 2=FICC`; matching now considers every level in the nested path.

  ### Security

  * LIM-2313: Fixed a security issue where an uncontrolled server name passed when connecting to a limit server could be used to read arbitrary files from disk. Server names are now restricted to ANSI alphanumeric characters, spaces, `.`, `-`, and `_`.
</Update>

<Update label="6.1.22" description="2026-06-18">
  This release does not ship any changes.
</Update>

<Update label="6.1.21" description="2026-06-17">
  ### Added

  * LIM-2227: Added an implementation of the audit screen that uses the new workflow service.

  ### Fixed

  * LIM-2233: Fixed deletion of a limit failing on the connected Atoti server when one of its calculated members ("available amount" / "utilization %") had already been removed by a concurrent measure refresh. The drop is now idempotent, so an already-removed member no longer raises a "does not exist" error or leaves the deletion workflow in error.
  * LIM-2243: Fixed limit creation, update and deletion failing with a 409 `ConflictException` (`You cannot delete this member because other members depend on it`), which could make the whole application unusable, when a user-defined calculated measure depended on a Limits-created measure ("Available Amount" or "Utilization %"). Limits measures are now only created when missing and only dropped once their KPI no longer has any limit; a measure that another calculated member depends on is kept and the failure logged, instead of aborting the operation.
  * LIM-2252: Fixed `IndexOutOfBoundsException` in the incidents SSE listener when processing datastore transactions, which could cause real-time incident updates to stop being pushed to the UI.
  * LIM-2253 Limits: Improved the performance of limit operations for large applications with tens of thousands of limits, where operations could previously take 30s to 1min each.
  * LIM-2256: Fixed a race when several limits are deleted concurrently, where two `KpiCrudService.refreshKPIs()` runs both tried to `DROP` the same orphaned KPI on the connected server, causing the second drop to fail with a 404 (`NotFoundException`) and the deletion to surface as HTTP 500. The refresh is now serialized and a 404 on `DROP KPI` is treated as a successful (idempotent) deletion.
  * LIM-2259: Fixed new limit creation failing with `LimitsCrudException: No value present` when the new limit's date range overlapped multiple existing active limits sharing the same structure, scope, and limit type.
  * LIM-2264: Fixed the Limit Structure delete action remaining available in the UI when no live limits exist for that structure.
  * LIM-2267: Fixed KPI measures not being correctly created for new workflow limits because KPIs were refreshed before the limits were added to the connected server's cache.
  * LIM-2274: Evaluating a limit whose value is `0` no longer fails to persist the incident. The utilization ratio (`measureValue / limitValue`) produced a non-finite value (`Infinity`/`NaN`) that the relational store rejected; it now resolves to `0` for a zero-value limit.
  * PIVOT-14077: Fixed the ID of a deleted limit being re-issued to a subsequently created limit.
</Update>

<Update label="6.1.20" description="2026-05-29">
  ### Changed

  Group IDs of dependencies have changed and must be updated. See the [migration notes](./migration-guide#4-2-2-to-6-1-20) for more details.

  * LIM-2239: Scope strings now use backslash escaping for the reserved characters `| = < > & + [ ] \`, so level, hierarchy, dimension and member names containing any of these characters are preserved through a scope-string round-trip. Existing scope strings without backslashes parse unchanged. See the [scope overview](/dev/scopes/scope-overview.html) and [advanced scopes](/dev/scopes/advanced-scopes.html) pages for the escape rules.

  ### Fixed

  * LIM-2172: Member selection in limit scope sometimes does not allow to remove members. Switching between simple and advanced mode can lead to empty tiles being displayed.
  * LIM-2215 Permissions: Fixed limit permission checks being silently ignored for users authenticated via SSO.
  * LIM-2238: Fixed editing a limit's attachment in the Six-Eyes approval workflow failing with a 500 Internal Server Error when re-saving the limit.
  * LIM-2240: Fixed `ScopeCacheService.refresh()` throwing `IllegalStateException: Duplicate key ... (attempted merging values X and Y)` on every restart when the datastore contained two `LimitStructure`s declaring the same scope keys in a different order.
    The in-process scope-id dedup in `ScopeTupleGenerator` now keys by the canonical (sorted) scope form, matching what `ScopeCacheService.refresh()` uses, so equivalent scopes share a single id instead of being persisted as two store rows that later collide.
  * LIM-2241: Fixed the **Add Limit** button being incorrectly disabled when the structure's history contained a deleted limit with an advanced scope, which prevented the creation of new limits.
  * LIM-2242: Fixed KPIs not displaying on dashboards for limits with `TOTAL_EQUALS` / `TOTAL_EXCEPT` advanced scopes on multi-level hierarchies.
  * LIM-2244 Temporary limits: Fixed temporary limit creation failing from the KPI Drawer when selecting a different member on a multi-level hierarchy.
  * LIM-2251: Fixed Atoti Limits failing to start for applications with a very large number of
    workflows. Warming the workflow cache at startup previously fetched tasks one workflow id at a
    time and queried their variables with one bind parameter per workflow, which could exceed the
    database's per-query parameter limit (such as SQL Server's 2100-parameter cap) and fail with a
    "query too large" error. Tasks are now retrieved in a single bulk query and their variables are
    fetched in batches sized to stay under each database's parameter limit.
  * PIVOT-13934: Fixed an NPE on Limits startup when the content server held a calculated measure whose content was not readable by the Limits service account (for example a measure created by another user with restrictive owners/readers).
    Such measures are now skipped with a WARN log identifying the measure name and the reason (missing read permission, empty content, or directory entry).
</Update>

<Update label="4.2.2" description="2026-04-16">
  ### Added

  * LIM-1877: Users with the `ROLE_AUTO_APPROVE_LIMIT` permission can now upload Six-Eyes limits and have them auto-approved.
  * LIM-2113: Users with the `ROLE_AUTO_APPROVE_LIMIT` role can now bypass the approval workflow when uploading limits via a new "Bypass Approval" checkbox in the limit upload dialog.
  * LIM-2157: Limit scope accepts free text values using the search input.

  ### Deprecated

  * LIM-2164: The `POST /limits/rest/v2/limitEvaluation/unschedule` endpoint has been deprecated. Please use the `DELETE /limits/rest/v2/evaluation/scheduling` endpoint instead.

  ### Fixed

  * LIM-2158: Scope dropdown not showing members with no contributions.
  * LIM-2162: Stale entries in the identity generator cache were not being cleaned up.
  * LIM-2163: Persisted workflow information was not being correctly re-loaded when restarting Atoti Limits.
  * LIM-2164: The scheduled limit structure evaluation.
  * LIM-2165: Error thrown in limits inventory when the limits server is configured without legacy workflows.
  * LIM-2168: Limits datastore containing objects that failed validation on save in persistent mode.
  * LIM-2169: Scope keys for limits on slicing multi-level hierarchies are now correctly resolved against their limit structure.
  * LIM-2170: Restarting the limits server did not update the limits cache on the connected server.
</Update>

<Update label="4.2.1" description="2026-02-20">
  ### Added

  * LIM-2060: A new direct limit approval process has been added as a default workflow, which does not require any approvals for limits to be created, updated or deleted. This workflow uses the more performant `workflow-service` and should be preferred to the `StraightThrough` workflow. See [this section](../dev/limit-workflow/default-workflows/direct-approval-process) for more details.
  * LIM-2073: Added a new configuration property `limits.autoconfiguration.connect-on-application-ready-event` (default: true) which determines if the application server should automatically connect to Atoti Limits on startup upon receiving the Spring `ApplicationReadyEvent`. Set this property to `false` to disable automatic connection and enable manual connection control.
  * LIM-2073: Added a new POST endpoint `/limits/autoconfig/connect` in the application server that will allow users to manually trigger a connection to Atoti Limits when `limits.autoconfiguration.connect-on-application-ready-event` is set to `false`.
  * LIM-2074: Improved performance in `LookUpPostProcessor` and `LimitsKpiEvaluator` by caching work across locations and failing invalid evaluations faster.

  ### Changed

  * LIM-2032: `IAuthenticatedLimitsUserService` now uses a Spring authentication object for improved compatibility.
  * LIM-2078: Upgraded the Atoti Server dependencies for version-specific modules to versions `6.1.16`, `6.0.27-sb3` and `6.0.27`.
  * LIM-2106: The `limits.autoconfiguration.server-name` property is now required to be set if the connected server uses the default catalog name (‘Catalog’), otherwise the connection will fail.

  ### Deprecated

  * LIM-2073: Deprecated the `limits/autoconfig/connecting` endpoint for removal in favor of the `limits/autoconfig/connected` endpoint, both of which were previously doing the same thing.

  ### Fixed

  * LIM-1928: Fixed an issue where real-time updates in the status screen weren’t respecting the filters applied to the screen.
  * LIM-2041: Fixed an issue where workflow variable changes were being applied before approval in the Six-Eyes Approval Process.
  * LIM-2084: Fixed an issue where the calculated measures for limits with workflows using the new workflow service were not being created immediately after limits were approved.
  * LIM-2121: Fixed an issue where temporary limits were not being exported.
  * LIM-2124: Fixed incorrect parsing of localized numbers on the limits viewer.
</Update>

<Update label="4.2.0" description="2025-11-12">
  ### Added

  * LIM-357: Added a new six-eyes workflow for limits that require two levels of approval before they can be evaluated.
  * LIM-1809: We have added new services to start Activiti workflows in bulk.
  * LIM-1812: All workflow variables are now visible on the status screen table.
  * LIM-1818: Added a new set of properties, `LimitsInitialLoadConfigurationProperties`, to replace `LimitsDlcConfigurationProperties` for the new file loading service.
  * LIM-1819: Added a new service, `ILimitsFileLoadingService` with default implementation `DefaultLimitsFileLoadingService`, to replace the DLC in the initial load of Limits data.
  * LIM-1829: Added a new column to the table to display the ‘limit type’ of each incident.
  * LIM-1836: Added a new set of properties and a new API, `ILimitsStatusMananager`, that allow for statuses in custom workflows to be mapped to limit actions.
  * LIM-1839: Added a field `limitType` to the `Incident` class. This indicates which type of limit was used in the evaluation: `OFFICIAL` or `TEMPORARY`
  * LIM-1853: The audit differences drawer now supports array / JSON payloads from the server.
  * LIM-1854: Filter on limit ID is automatically applied to the table when navigating from the Status screen to the limit structure screen using links.
  * LIM-1856: Added a rest endpoint in the auto-configuration module to retrieve the limits with a location and a kpi name.
  * LIM-1862: Added a new endpoint `/activeviam/limits/rest/v2/startup`, which is used to ping the Atoti Limits server.
  * LIM-1864: Added a new endpoint `/limits/rest/v2/incidents/filter-with-variables` to retrieve the
    incidents along with their workflow variables, which is used to dynamically generate columns in
    the status screen.
  * LIM-1864: Added an optional request parameter `includeVariableDefinitions` to the endpoint
    `/limits/sse/v2/incidents/subscribe/filter` to send the initial incidents along with their
    workflow variables, which is used to dynamically generate columns in the status screen.
  * LIM-1921: Added a new endpoint
    `/activeviam/limits/rest/v2/workflow-service/workflow-history/{workflow-type}/{object-id}` for
    retrieving workflow histories in the new format.
  * LIM-1923: Added a new field `actionName` to the `WorkflowTaskActionExecutionDTO`.
  * LIM-1924: Updated Atoti Server to version 6.1.13. This includes the upgrade of artifacts required to connect to 6.1.13 versions of Atoti Server.
  * LIM-1924: Added a new endpoint `/activeviam/limits/rest/v2/dataexport/download` in the auto-configuration modules to handle evaluation responses.
  * LIM-1943: Added a new Incident workflow, `incident-review-process.bpmn`, that uses the new workflow service.
  * LIM-1962: Added new columns for limit structure files: `Limit Workflow Variables` and `Incident Workflow Variables` that are used to populate new fields in the limit structure table: `Limit Workflow Details` and `Incident Workflow Details`.
  * LIM-1962: Added new properties `limits.workflow.limit-business-functions` and `limits.workflow.incident-business-functions` to map the business functions used for limit and incident workflows respectively.
  * LIM-2019: Added a new column for setting limit workflow initialization variables
  * LIM-2027: Added new property `limits.workflow.structure-deletion-workflows` to configure the workflows where structure deletion is enabled

  ### Changed

  * LIM-1506: Removed server-specific properties from `application.yml`. Properties specific to the `ConnectedAcc` reference test servers released with Atoti Limits can be found in `application-connectedacc.yml` and can be activated with the `connectedacc` Spring profile.
  * LIM-1750: Realtime mode can now be toggled off during a long initial load.
  * LIM-1809: The default implementation of `ILimitsProcessInstanceWorkflowCacheService` is now a no-operation implementation as this class is unused.
  * LIM-1810: The status screen is filtered by default to only show the user’s outstanding tasks.
  * LIM-1838: Enhanced the filtering of the Server-sent events replacing the `asOfDates` and `incidentTypes` by a `FilterConditionDTOs`.
  * LIM-1849: Improved performance of executing workflow actions using the default workflows by skipping unnecessary retrieval of limit workflow information.
  * LIM-1849: Scope hierarchies are now disabled by default to improve performance. They can be enabled by setting `limits.cube.scope-hierarchies-enabled=true`.
  * LIM-1862: The optional property `limits.autoconfiguration.limits-ping-url` is now auto-configured to point at the newly introduced endpoint `/activeviam/limits/rest/v2/startup`
  * LIM-1912: The name of the process in `limit-process-straight-through.bpmn` has been renamed from `Straight-through instance process` to `StraightThrough`
    to match the name in the UI.
  * LIM-1912: The name of the process in `limit-process-four-eyes.bpmn` has been renamed from
    `Four-eyes instance process` to `FourEyes` to match the name in the UI.
  * LIM-1912: The name of the process in `limit-process-exception.bpmn` has been renamed from
    `Exception Workflow` to `Exception` to match the name in the UI.
  * LIM-1912: The property to define the file types allowed to be uploaded as attachments in the
    workflow has changed from `limits.workflow.allowed-file-upload-extensions` to
    `activeviam.apps.workflow-service.settings.allowed-file-upload-extensions`.
  * LIM-1912: The property to define the file storage path for uploaded attachments in the workflow
    has changed from `limits.workflow.file-storage-path` to
    `activeviam.apps.workflow-service.settings.file-storage-path`.
  * LIM-1923: The field `taskKey` in `WorkflowTaskActionDTO` has been renamed to `taskName`.
  * LIM-1924: The default value of the `limits.autoconfiguration.atoti-mdx-download-url` property has been changed from `/dataexport/download` to `/activeviam/limits/rest/v2/dataexport/download`.
  * LIM-2034: The `limitValue` field on the `Limit` and `Incident` objects has been changed from a `double array` to a `double`. The `double array` was previously unused.

  ### Deprecated

  * LIM-1809: `ILimitsProcessInstanceWorkflowCacheService` is unused and has been deprecated for removal. It is still present to avoid breaking the API.
  * LIM-1809: `IEvaluationTaskManager` has been deprecated for removal because most of its methods are unused.
  * LIM-1912: `LimitsWorkflowService` has been renamed to `LegacyLimitsWorkflowService` and deprecated for removal in a future release.

  ### Removed

  * LIM-1822: Removed the DLC and all related configuration properties and classes. It has been replaced by `ILimitsFileLoadingService`.

  ### Fixed

  * LIM-1777: The limits viewer sometimes incorrectly displays a notification that a limit was added on another table page
  * LIM-1799: Errors while creating a structure sometimes do not show up on the screen.
  * LIM-1811: Input fields are now properly disabled while submitting workflow actions.
  * LIM-1827: Fixed the logic and wording for warning thresholds. The warning threshold is now directly correlated to the limit utilization percentage.
  * LIM-1846: Fixed an issue where JWT tokens were not being refreshed causing requests between servers to fail after token expiration (default is 12 hours).
  * LIM-1848: Fixed an issue where duplicate incident events may be published by the SSE emitters.
  * LIM-1851: Fixed an issue where the Atoti Limits KPIs were not updated after a change of KPI
    description.
  * LIM-1862: Fixed an issue where the reconnection to the Atoti Limits server wouldn’t happen properly if the Atoti Limits server was behind a loadbalancer.
  * LIM-1865: Fixed an issue where a limit could not be created if it overlapped with an inactive limit.
  * LIM-1915: Fixed an issue where structures created without a `Limit Changes` workflow defaulted to using the `StraightThrough` workflow instead of
    throwing an exception.
  * LIM-1924: Fixed an issue where evaluation requests were failing due to the streaming responses.
  * LIM-1936: Fixed an issue where limit statuses were defaulting to `INITIALIZED` if they were not set on creation in `LimitsCrudService`.
  * LIM-1954: You can now create limits on calculated measures where the underlying is a hierarchy.
  * LIM-2002: Fixed an issue where creating and updating structures, limits and incidents simultaneously could fail intermittently.
</Update>
