For user-facing changes, see the Release notes.
For information on upgrading from previous versions, see the
Migration guide.
2026-10-29
Follow this link to download the zipped distribution files for:
- UI source code
- UI build
- Source files to build the module
- Maven repository required to build the project and run the tests.
Added
- PIVOT-14984: Added the
limits.as-of-date.initial-providerproperty, which selects the source of the initial as-of-date:file(default, loads the date from theas_of_date.csvfile, or creates this file with the current date if it does not exist),utc-time(current UTC date, as-of-date file ignored, no file generated) ornone(no default, as-of-date file ignored, the as-of-date must come from anILimitsInitialAsOfDateProviderbean). - PIVOT-14984: Added the
ILimitsInitialAsOfDateProviderinterface. Declare a bean of this type to choose the initial as-of-date. A declared bean replaces the provider selected bylimits.as-of-date.initial-provider, and Atoti Limits then ignores the as-of-date file.
Changed
- PIVOT-15374: The KPI measures that the Limits Auto-Config modules create in the connected Atoti server are now typed: the KPI status is an integer, the KPI goal is a double, and the KPI value has the type of its underlying measure. The type stays
Objectfor a calculated measure, or when the underlying measure is not yet initialized when the KPI measure is. - PIVOT-15406: Limits using a legacy workflow now expire with the same rules as the new workflow service, including capping the
/expiredate at the current as-of date, see Expire the workflow. Their temporary limits now expire too. - PIVOT-15450: In the default four-eyes workflow (process
limit-process-instance.four-eyes),LimitsProcessInstanceWorkflowService#roleValidationidentifies the requester with the new protected methodisCurrentUserTheRequester. Override it instead ofisCurrentUserTheSameAsPreviousActorto change who counts as the requester in this process. Other processes still useisCurrentUserTheSameAsPreviousActor.
Deprecated
- PIVOT-14961: The REST service behind
/services/rest/v1/levelPathis deprecated for removal in 6.3.0, replaced by an equivalent service shipped by Atoti Server 6.2.3 and later. To use it, setatoti.server.endpoint.level-path.enabled=true. See the Migration guide.
Removed
- PIVOT-14984: Removed the protected method
DefaultLimitsFileLoadingService#createAsOfDateFile(). The defaultfileinitial as-of-date provider now creates theas_of_date.csvfile with the current date at startup if this file does not exist. Subclasses that override the method must remove the override. See the Migration guide.
Fixed
- PIVOT-14984: When the as-of-date file contains several dates, Atoti Limits now starts with the latest one. Previously, it used the last date read, which depended on the order of the rows in the file.
- PIVOT-15251: Loading the limits data no longer fails with
ActivitiIllegalArgumentException: key is nullwhen a limit using a non-legacy workflow, such as the Six-Eyes Approval Process, is past its end date. - PIVOT-15331: Limits using a non-legacy workflow, such as the Six-Eyes Approval Process, now expire once the as-of date passes their end date. A client that does not deploy every
processes/*.bpmnfile oflimits-startermust also deploylimit-process-expiry.bpmn, see the Migration guide. - PIVOT-15420: In persistent mode, deleting or expiring a limit that uses a legacy workflow, such as the Four-Eyes Approval Process, now saves its
DELETEDorEXPIREDstatus to the database. Previously, the limit kept its old status in the database, so after a restart of Atoti Limits or of the connected server it applied again and its resolved incidents went back toBREACHED. Limits already affected are not repaired by this fix. - PIVOT-15420: In persistent mode, a user with
ROLE_APPROVE_REJECT_LIMITbut notROLE_UPDATE_LIMITcan now approve or reject a limit that uses a legacy workflow. Previously, saving to the database failed with an access denied error. - PIVOT-15421: A limit using a legacy workflow that fails to expire no longer stops the expiry of the other limits. Each failure is logged with its limit id.
- PIVOT-15451: The Pending Approval column of the Limits Inventory now counts the limits awaiting approval on the
FourEyesworkflow. It showed 0 for these structures since 6.2.1. - PIVOT-15454: A new notification subscription no longer misses its initial event at random, and closing it no longer throws a
NullPointerException. Withnotification-service.initial-notification-mode=DONT_SEND, a subscription now starts with an emptyINITIAL_EVENT, as documented, instead of an emptyNOTIFICATIONevent. - PIVOT-15394: In persistent data mode, incidents are now saved and updated when the evaluation MDX of their limit structure exceeds 1,000 characters. About 16 single-level limits, or only 5 to 7 limits scoped on several levels, were enough to reach this length: saving a new incident then failed, and an existing breach incident stopped being updated. Atoti Limits now maps the
mdxcolumn of theincidenttable with a length of 1,000,000 characters, and the new Liquibase changesetlimits-6-2-3-changelog-1.yamlwidens this column. Widening the column is optional: Atoti Limits starts without it, but these incidents still fail to save until the column is widened. See the Migration guide. - PIVOT-15450: In the default four-eyes workflow, the user who created, edited or requested the deletion of a limit can no longer approve or reject that request, including after an approver rejected it, unless
limits.workflow.workflow-rules.can-approver-be-same-as-creatoristrue. The approver who rejected it can now approve or reject it later. Previously, the creator could approve their own limit after a rejection, and the approver who rejected it was blocked because they were the last user to act on it.
2026-09-30
Follow this link to download the zipped distribution files for:
- UI source code
- UI build
- Source files to build the module
- Maven repository required to build the project and run the tests.
Added
- LIM-2432: Added the
limits.scope.allow-multiple-not-in-limitsproperty. Setting it tofalseallows at most one “NOT IN” scoped limit per structure at a time. Defaults totrue, preserving prior behavior.
Changed
- LIM-2361: The
ApproveandRejectactions of the default Six-Eyes limit approval workflow now include aCommentfield, as in the Sign-off workflows. - PIVOT-15183: Creating a limit scoped at the
(Total)of the first level of a slicing hierarchy is now rejected from the UI, the REST API and CSV upload. A(Total)on a deeper level is still accepted. Existing limits, including those loaded at startup, still load, evaluate and can be updated.
Deprecated
- PIVOT-15188:
IncidentEvaluator.evaluateIncidentswithout measure names is deprecated. It reads the KPI value from the limit’s measure, which is wrong for aTOTAL EXCEPTorTOTAL EQUALSscope. Use the overload that takes the status and value measure names selected by the MDX query.
Removed
- LIM-2438: The
limits-commonMaven module - which store duplicate classes shared by both Atoti Limits and the connected server - has been removed. Its classes, in thecom.activeviam.limits.core.sharedpackages, now belong tolimits-activeviam, while the connected Atoti Server keeps its own copies inlimits-integration-common. Package and class names are unchanged. See the Migration guide. - PIVOT-14850: Removed support for connecting to Atoti Server 6.0.x and 6.0.x-sb3. The
limits-auto-config-60,limits-auto-config-60-sb3,limits-atoti-server-60, andlimits-atoti-server-60-sb3artifacts have been deleted.
Fixed
- LIM-2346: Fixed a limit scoped at a
(Total)of a slicing hierarchy never being applied, leaving those rows with no limit status. - LIM-2346: Fixed the scheduled evaluation never raising an incident for a limit scoped at the
(Total)of the first level of a slicing hierarchy, whether the scope uses theAllMemberor an aggregated operator (TOTAL EQUALS,TOTAL EXCEPT). - LIM-2356: When a six-eyes workflow update or deletion is approved, any earlier workflow still active for that limit is now cancelled; the cancelled workflow is marked as superseded and keeps its audit history, so the limit’s original creation request remains visible in the audit trail.
- LIM-2442: A scheduled evaluation with limit failures sent the same
Limits Evaluation Completednotification as a successful run, so failures went unnoticed outside the server log. The notification now reports the number of errors and its severity is raised to high when there were errors. - LIM-2432: Creating limits on the same structure with overlapping dates and overlapping “for each in” scopes - for example a limit on Book in
[A, B]and a limit on Book in[B, C]- would have passed but should not have been allowed. - LIM-2433: Fixed a limit scoped with
(Total) of selectedor(Total) excluding selectedon a multi-level hierarchy being evaluated over every member of the level. The members the scope selects or excludes were ignored, so a(Total) excludinglimit was evaluated against the unfiltered total and breached on it; such scopes now aggregate only the members they select. - PIVOT-15188: Evaluating a limit with a
TOTAL EXCEPTscope failed with aNullPointerExceptionand raised no incident. Such incidents now report the exposure without the excluded members.
2026-09-03
Follow this link
to download the zipped distribution files for:
- UI source code
- UI build
- Source files to build the module
- Maven repository required to build the project and run the tests.
Added
- PIVOT-14095: Added an opt-in security filter chain for the Atoti Limits REST endpoints of a Connected Server. Setting
limits.autoconfiguration.security.enabledtotrueregisters aSecurityFilterChainbuilt with the Connected Server’sMachineToMachineSecurityDslthat accepts any authenticated request, so applications no longer need to write their own chain for these endpoints. The property isfalseby default and leaves existing applications unchanged. See the Auto-configuration properties reference.
Changed
- PIVOT-14310: The incident SSE subscription (
GET /limits/sse/v2/incidents/subscribe/filter) and the notification service SSE subscription now carryX-Accel-Buffering: noandCache-Control: no-cache, no-transformso that reverse proxies do not buffer or compress the event stream. A buffering proxy delivers the incident and notification updates only when the stream ends.
Removed
- PIVOT-14667: The
Dependenciespage has been removed from the release documentation because the dependencies are now aligned with the Atoti Server version. See the Atoti Server dependencies page for the underlying Spring Boot and Java versions.
Fixed
- LIM-2278: Fixed limit evaluation considering only the default member for scopes on a slicing hierarchy (no AllMember level); every matching member, including multi-level Total subtotals, is now evaluated.
- LIM-2346: Fixed a limit defined at the
(Total)of a multi-level hierarchy’s first level (for example a dynamic tenor hierarchy) not applying to the Total row, which showed no limit status. - LIM-2352: Fixed the Audit Screen reporting a spurious change (for example
100 → 100) when an unchanged numeric value was deserialized as a different numeric type, such asIntegerandDouble. - LIM-2357: Fixed the connection request from an Atoti server timing out when the limits data load is slow, which made the server retry and pile up blocked threads on the Limits server. The limits data load now runs in the background, one load at a time per server, and the connection request returns immediately.
- LIM-2370: Querying a limit KPI (Goal or Status) on a recently created calculated measure would throw an
IllegalArgumentException: Unknown measure contributors.COUNT. - LIM-2171: Fixed Limit Structures with no Limits minting a duplicate Scope Value ID instead of reusing the existing “N/A” ID, which could crash the scope cache with a duplicate-key error.
- LIM-2366: Fixed the log filling with
ERROR-level stack traces for everyAccessDeniedException, which now logs atDEBUGwhile other exceptions still log atERROR. - LIM-2365: Fixed the
Mismatch for scope locationserror not naming which limits caused a limit structure to fail loading; it now names the structure, the two limits, and the missing level. - LIM-2428: Fixed querying a limit KPI (Goal or Status) throwing a
NullPointerExceptionwhen the as-of date fell outside the date range of the limits covering the queried location. - LIM-2355: The Audit Screen showed no entry for a breach review, or for any other workflow task completed on the new workflow engine, leaving only the object’s creation entry.
- LIM-2357: Saving a limit took several minutes for a user with scope restrictions. The permission check loaded the whole limit inventory and re-resolved the user’s accessible scopes for every limit in it; it now looks up only the submitted limit and reuses the resolved scopes until a scope is added or removed. An existing limit outside the caller’s scope is also no longer mistaken for a new limit, so updating it requires the update permission rather than the creation one.
- LIM-2358: Workflow buttons - such as “Approve”, “Reject” and “Review breach” - were enabled for users without permission to approve/reject limits or process incidents, which failed with an “Access Forbidden” error on click instead of being disabled.
- LIM-2388: Approving an update or deletion of a limit that already had an attachment failed with an error and could leave Atoti Limits unable to restart.
- LIM-2439: Deleting a limit did not stop its KPIs from being evaluated on the connected Atoti Server until that server was restarted.
- PIVOT-14979: Uploading a CSV file that creates a large number of limits failed with a database parameter limit error.
- PIVOT-15169: When the two Six-Eyes approvers entered different comments, the Audit Screen showed the second comment as a change of the first one. Values entered in a workflow action’s input fields, such as
Comment, are now shown as entered on each task. - PIVOT-15170: When the two Six-Eyes approvers entered the same comment, the second approver’s comment was missing from the limit’s history and from the Audit Screen.
Security
2026-07-27
Follow this link
to download the zipped distribution files for:
- UI source code
- UI build
- Source files to build the module
- Maven repository required to build the project and run the tests.
Added
- LIM-2228: Added a first-class Atoti Limits plugin for the Atoti Python SDK (
atoti-limits), replacing the existing Atoti Limits Python extension as the way to connect an Atoti Python session to a running Atoti Limits server. - LIM-2350: Fixed a limit’s ID being reused by a new limit created with the same scope after a restart, which merged their audit histories. New limits no longer reuse a soft-deleted limit’s ID, so their audit histories stay separate.
Fixed
- LIM-2364: Fixed creating a limit structure on a recently created calculated measure failing validation with
Measure ... not in the list of measures for the cube. - LIM-2348: Fixed the audit history and decision buttons failing to open for expired, deleted-and-recreated, or fully-approved six-eyes limits. Those steps now simply show no available actions.