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
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.