Version 9.1.256 (28 September 2026) Dashboards Onboarding Adding info icon on Onboarding dashboard widget (#155249) Problem The **Info** icon was missing for people who do not have a linked journey. Solution Added an **Info** icon with a tooltip to any card where no journey is present. Data Warehouse Implemented performance improvements within TenantManagement_ETL (#155300) Problem Performance improvements needs to be implemented for TenantManagement_ETL Solution Removed Source step for Steps to improve performance/memory usage Implemented performance improvements within JobProfiler_ETL (#155300) Problem Performance improvements needs to be implemented for JobProfiler_ETL Solution Added hashrows for jpAppointments to improve performance Removed Source step for Steps to improve performance/memory usage Updated DataDictionary to exclude TenantID (#155482) Problem The reports within report builder did not return correctly when join occurs between users and reportinglines Solution Updated DataDictionary to exclude TenantID between users and reportinglines Implemented performance improvements within LearningManagement_ETL (#155300) Problem Performance improvements needs to be implemented for LearningManagement_ETL Solution Removed Source step for Steps to improve performance/memory usage Implemented performance improvements within PerformanceManagement_ETL (#155300) Problem Performance improvements needs to be implemented for PerformanceManagement_ETL Solution Removed Source step for Steps to improve performance/memory usage Added latest V9 DWH Package Backup to repo (#143176) New Functionality Added latest V9 DWH Package Backup to repo General Support Deployment of Release branch (#154731) Solution Support Deployment of Release branch Allow termination reason to be optional when terminating a user's active appointment (#155351) Problem Terminating a user's active appointment always required a termination reason ID. When terminating by username with a termination reason name that didn't match exactly one active reason for the ruleset, the API rejected the request outright instead of allowing the termination to proceed without a reason. Solution `TerminateUserActiveAppointmentCommand.TerminateReasonId` is now nullable, matching the already-nullable-ready domain layer (`IUserDomainService.TerminateAppointmentAsync` / `TerminateActiveSecondaryAppointmentAsync`). The gRPC `TerminateUserActiveAppointment` handler now treats `reason_for_termination_id == 0` (the proto3 default) as "no reason" and passes `null` through, since real termination reason IDs are DB-generated and start at 1. `TerminateUserActiveAppointmentByUsername` no longer throws when the termination reason name doesn't match exactly one active reason — it now falls back to no reason and proceeds with the termination. Restart Identity cert consumers and log updated certs (#0) Problem Updating the Identity certs only restarts identity, so webmvc and the APIs that mount `encryption-certificate` keep the old keys in memory until they happen to restart. The job log also only prints the certs from before the update, so a successful run looks like nothing changed. Solution After updating the secrets, the script restarts identity first and then every other deployment in the namespace that references either cert secret (dry-run lists them). It then prints the cert summary again under "Certificates after update". Schedule Legate identity cert updates (#0) Problem Update Identity Certs only runs when someone dispatches it by hand, and each run targets every namespace that has Identity certs. Solution The new Identity Certs Scheduler queues a Legate `Update` every `IDENTITY_CERTS_SCHEDULE_MINUTES` minutes for `IDENTITY_CERTS_SCHEDULE_NAMESPACE`, which defaults to `victrix` and accepts `all` for the whole cluster. Update Identity Certs gets `namespace` and `notify_success` inputs, and the scheduler turns `notify_success` off so it doesn't email and post to Teams every run. Scan release images for vulnerabilities (#151872) Problem Vulnerable packages are able to be deployed in some cases Solution Scan release images for vulnerabilities before releases HR Processes Expired landbot access token can be used when user session is still active (#154635) Problem The access token which is passed to landbot (so that it can make authenticated requests), are set initially when the page opens. If the user stays on the page for extended periods, the token can expire, meaning subsequent landbot requests to our authenticated API's will fail with a 401 (Unauthorized) due to the expired token that is still erroneously used. Solution Access Token along with the landbot key is used to determine whether the user still has an active session. If the user does then the expired access token can be used to authenticate for that user's landbot session. Imports Resolve emails being sent out after User import of existing users (#154003) Problem During user import, existing users are rebuilt as new DomainUser objects inside UpdateExistingUsers. The lookup model used for existing users did not include WelcomeNotificationSentDate, so the rebuilt object always had that property as null. That null value then flowed through the import response/update path, making it look like the user had never received the welcome notification and allowing the value to be reset or rematerialised incorrectly. Solution The existing user lookup now reads WelcomeNotificationSentDate from [Account].[Users] and stores it on BasicUserPreviewPayrollModel. When UpdateExistingUsers reconstructs the existing DomainUser, it copies the saved welcome notification date back onto the object. The bulk update config also excludes WelcomeNotificationSentDate from updates, giving a second layer of protection so imports update user details without clearing the welcome notification history. Corrected property to be excluded that is a normal column and not ValueObject (#154003) Problem Excluded properties is mapped within the sql insert update call, but for sent welcome notification it is identified as if it was nested within another object Solution Added fix to remove one part Job Profiler Excluded people are not removed from query included conditions (#155746) Problem When a people group used an included custom SQL query to select users, a user manually added under the excluded people section could still appear in the final materialised people group. The full materialisation flow was not always adding manually excluded people into the exclusion set before calculating the final result, so the included query result could win. Solution Update the full materialisation query to explicitly load excluded PeopleGroupUserItems into #CalculatedUsers with Excluded = 1 before building #Result. The existing final calculation already removes any included user that has a matching excluded row, so this keeps the current design intact while ensuring manual exclusions override custom SQL includes. Resolved caching values (#155748, #155882) Problem When actions occur the previous cache is not being busted Solution Added more bustable methods to attributes Master Data Performance Management Ruleset Management Added more bustable methods to cache queries (#155862) Problem More queries not being busted on certain methods Master data cache queries conflicting with redis cache no need to add these as cacheable queries Solution Add more bustable methods and remove cache query attribute from master data calls Notifications Added manual test flag to send emails when not active (#155529) Problem When setting the Email setup email notificaitons off, and then proceeding to do a test email the email will fail as email notifications is set to inactive, Solution Add new flag check to be mapped and pulled to still be able to trigger an email when email notifications is off as it is test email Multiple files being downloaded when clicking export (#155528) Problem Multiple files are downloaded when multiple tabs are open as signalR sends a request to download file once it is done processing, development was added to only limit to a tabId generated but was not added here Solution Added tabId to limit download to tab which requested it Onboarding Resolved cache methods and user exclusion (#155244) Problem Cache methods was not busting correctly, user exclusion not removed once a journey is created Solution Added cache methods to bust. Add new command to remove user exclusion if exists Updating Onboarding Dashboard Widgets Translations (#155505) Problem There are no translation entries for the following Dashboard Widgets: * **Onboarding Employee** * **Onboarding My Activities** * **Onboarding Manager** Solution Moved the translation strings to the correct file and updated the widget types to use the new translation keys. Removing Banner activity from dashboard widget (#155525) Problem For the HR Process Automation Journey Widget, **Banner** activities are being counted as **In Progress Activities**, which can be confusing. Banner activities should not be included in activity counts. Solution Removed Banner activities from the dashboard widget data so they are no longer included in activity counts. Performance Management Resolved save add new, allows to reselect a library item (#155890) Problem When selecting a library item within the contract, saved, and thereafter it can not be reselected, but when you do save add new the library item selection list does not update and keep behaviour causing it to be reselected Solution Added fix to restrict it and update the list Add change to only show update section when there is a record for that type (#155821) Problem When clicking update all modal both sections show for interpolation and rating scales Solution Add check to only show the update section when there is of that type record Added bust methods for list review year setups (#155589) Problem When linking/unlinking a review setup the list does not bust cache Solution Add methods to bust the list cache data Resolved translation, and some missing case checks (#153180) Problem 155610 Imports does not have the validation check as the UI when editing is disabled ratings can not be enabled 155617 Incorrect naming 155619 Interpolation check was not included in group by 155635 Save add new does not recall the sync checks to the rules of editing and rating Solution 155610 implemented validation to accommodate these checks and throw error 155617 corrected naming translation 155619 added check to group by 155635 added correction to recall sync check Resolved comment not being able to update if ratings are locked (#155523) Solution Business rule logic required if the ratings is locked, allow the ratings modal to open and still save comments without ratings Report Builder Adding Status enum and job requested date alternative (#155032) Problem The DWH modal was being refreshed before the SQL Agent job had started, resulting in an incorrect or outdated status being displayed. Solution Updated the status check to use the job's requested date when the start date is not yet available. The modal now displays a broader job status instead of waiting for the job to start, allowing it to refresh immediately while still disabling the REQUEST button and displaying the appropriate status. System Access Improve the performance of the logout process (#155329) Problem The V8 logout excessively delays user logout, causing the user to wait on a blank page very long Solution Reworked account logout to call the legacy external logout endpoint from HomeController using IHttpClientFactory instead of rendering an iframe bridge page. The action now validates the generated URL, posts externalBaseUrl in a background task, logs failures/invalid configuration, and then proceeds directly to CompleteLogout. The obsolete ExternalLogoutBridge view and external-logout-bridge.js script were removed. System Help Fix help content showing the wrong language or hide other sections when falling back to English. (#152901) Problem Help content could show the wrong language or hide other sections when falling back to English. Solution Each section now checks the current ruleset and language first, then follows the English and RS1 fallback order independently.