# Version 9.1.251 (7 September 2026)

#### **Ruleset Management**

##### Resolve the resource exhaustion error when error logs exceed 1000 (#154679)

**Problem**

- Resources are exhausted when error logs exceed 1000; the current 5000 limit is unnecessary for on-screen analysis.

**Solution**

- Reduce the returned error logs to the last 500 logs

##### Session does not expire (#152563)

**Problem**

- User session never expires, and it is difficult to know when it will expire.

**Solution**

- This solution introduces significant improvements to session management, token lifetime configuration, and user experience around session expiry. The changes ensure that session expiry is consistently enforced and communicated across the backend and frontend, and that refresh token lifetimes are configurable and respected throughout the application stack.
- Session expiry has been added to the footer of the profile drop-down.
- The warning message shows from 30min before the session expires every 5min and then again 60s before the session expires to warn the user of the session expiry.

---

#### **People Management**

##### Fix inconsistent subordinate count (#153718)

**Problem**

- Subordinate count displays inconsistently

**Solution**

- This was due to the query joining to the incorrect column. Ensures that it joins to the managerId column, correcting the count

##### Ensure the user, when not authorised to edit appointments, does not receive a 405 screen (#154695)

**Problem**

- When a user is not allowed to edit appointment history based on the people group access, the user receives a 405 error rather than getting notified of the not authorised exception.

**Solution**

- This change updates the way unauthorised access is handled in several actions within the PeopleController.
- Instead of returning a generic Unauthorised () response, the controller now provides user feedback via a localised error message and redirects the user back to the appropriate edit page or tab.
- This improves the user experience by making authorisation failures clearer and guiding users back to relevant pages.

##### Fix squashed tooltip on People Management Data sources tooltip (#154698)

**Problem**

- With numerous data sources linked to the category and the tooltip displayed, the popover content is squashed and the text overlaps.

**Solution**

- Correct styling on the popover to ensure that tooltip text does not overlap and the popover size is updated correctly.

##### People with birthdays not available on the People dashboard. Unable to edit a user's profile when a unique ID number is active (#154605)

**Problem**

- Birthday saved with a time component.
- Filter criteria on the People Management dashboard incorrectly filter on birthday
- When a unique ID number is active, saving on the profile screen incorrectly validates for the user itself

**Solution**

- This change focuses on improving date handling and filtering logic across several user query endpoints, as well as ensuring consistent date-only comparisons in both application code and SQL queries.
- Additionally, it introduces a minor scheduling fix for bi-weekly notifications.

##### Add Allow HID for iframe to allow signature pad connection (#154099)

**Problem**

- Signature pad does not want to connect when trying to sign an assessment document from within V9

**Solution**

- Add Allow HID for iframe to allow signature pad connection

##### Improve large data source tooltip layout and positioning (#154378)

**Problem**

- Large data source tooltips displayed all items in a single column, causing the popover to exceed the screen and briefly overflow while positioning.

**Solution**

- Display large tooltips across a maximum of four columns, dynamically increasing the column size for larger lists and constraining the popover to the viewport.

##### Adding breadcrumb when redirecting to update people group view (#153690)

**Problem**

- When opening one of the Event Scheduling People Groups and clicking Back or Cancel, the system navigates the user to Custom People Groups instead of returning to Event Scheduling People Groups.

**Solution**

- Added the appropriate breadcrumb action so that the Back button in the ribbon redirects the user to the correct tab on the People Groups page.

##### Permanent deletion &amp; merging of user profiles (#111732)

**New functionality features:**

- Create additional permissions to delete and merge profiles
- Delete a person's profile from the Grid View
- Merge a person's profile from the Grid View
- Add a Recycle Bin to the filters to see the deleted profiles
- Have a summary of the merge on a person's profile

---

#### **Performance Management**

##### Add Dapper type handler for Section enum (#154345)

**Problem**

- A bunch of PM queries are failing because Dapper cannot map the custom "Section" enum automatically

**Solution**

- Add a Dapper type handler globally for PM so that it can map the enum properly in queries

##### Resolve DataTables error on Review Setup page (#154694)

**Problem**

- DataTables warning is displayed when loading the Review Setup admin page, and template information is not displayed.

**Solution**

- Resolve issue on review setup templates query handler breaks due to enum conversion.

##### Updating global modal margin (#154465)

**Problem**

- Navbar was set to be in front of the modal overlay. This causes the modal header to be rendered behind the navbar.

**Solution**

- Update modal margin so that the modal is always rendered below the navbar.

##### Resolve issue where the Single Approval Final Rating button text is not displaying correctly (#154484)

**Problem**

- On single participation (Manager only) review setups, when the manager has completed ratings, the button still only displays Rate for the Final Rating phase. It should reflect Final Rating, the same as with Dual Participation

**Solution**

- Correct the Rate button label to display Final Rating for Single Participation

##### Resolve edge case scenario where unapproved score differs from approved score due to decimal precision (#154439)

**Problem**

- When the unapproved score is calculated, the score can work out to more than 4 decimals in precision depending on the score and weight distribution. This leads to a 0.01 difference in some instances displayed on the front end, due to the 4-decimal rounding not being applied until the rating is saved. (Enforced by DB precision).

**Solution**

- When calculating the score for the Contract Period, ensure that 4-decimal rounding is always applied.

##### Add a PM historical graph (#148639)

**New functionality features:**

- Styling of the Review Year button
- Add a new button to access the historical scores for myself
- Add a new button to access the historical scores on the Overall Summary of the Managers Dashboard

##### Setting when Dual Participation is inactive to have only Final Rating (#148703)

**New functionality features:**

- When dual participation is not selected, have an option to select whether only the Final Rating should be completed
- Include this rule on the Agreement Import

---

#### **Data Warehouse**

##### Moved SystemAlerts to the Communication category within ReportBuilder (#154598)

**Problem**

- The SystemAlert data sources were in the incorrect Category within the ReportBuilder

**Solution**

- Moved SystemAlerts to the Communication category

##### Merged ES with TS within stored procedure C\_03798\_99999\_reportCustomUserUsage\_2026 (#152566)

**Problem**

- The count for Event Scheduling needs to be included within Training Scheduling

**Solution**

- Merged the Event Scheduling count with Training Scheduling within the stored procedure C\_03798\_99999\_reportCustomUserUsage\_2026

##### Updated the jpAppointments step to use Delete/Insert instead of Update/Insert (#142737)

**Problem**

- The jpAppointments Update step did not update existing fields as expected

**Solution**

- Updated the jpAppointments step to use Delete/Insert instead of Update/Insert

---

#### **AutoDoc**

##### Add SendReminders to ListUserDocumentsPreviewQueryHandler, fixing the query (#154703)

**Problem**

- SendReminders missing from query, causing page load to break

**Solution**

- Add SendReminders back to the query

##### Fix Create Document item on Kebab menu is disabled (#154060)

**Problem**

- The grid rendered before ruleset settings loaded, so Extended Core defaulted to false and disabled “Create Document” incorrectly

**Solution**

- Treat ruleset settings as unloaded initially and show loading until the real feature status is available

##### User with no permissions sees enable Create Document menu item and can select a template before seeing unspecified error (#154125)

**Problem**

- User with no permissions sees the Enable Create Document menu item and can select a template before seeing an unspecified error

**Solution**

- Ensure the button only displays when the user is an admin

##### Special characters not displayed correctly on Create Document confirmation modal (#154136)

**Problem**

- Special characters not displayed correctly on Create Document confirmation modal

**Solution**

- Decode the username before displaying

---

#### **Communication Portal**

##### Added image upload for system messages (#154601)

**Problem**

- When adding an image to a system alert/message, the image is never actually uploaded.

**Solution**

- Correctly handle uploads using the "Insert Image" control and pasting an image into the RTE.

---

#### **Notification**

##### Allow nullable Quartz simple trigger string props (154089)

**Problem**

- Quartz simple-property triggers can store NULL string properties, but the generated Notification schema marked STR\_PROP\_\* columns as required.
- This made it so that the Notification service did not successfully do its part during ruleset/tenant creation

**Solution**

- Override the Quartz EF model so those string properties are nullable and future migrations align with Quartz runtime behaviour.

##### Implement SMS portal as a SMS provider (#153056)

**Problem**

- An additional SMS provider with WhatsApp capability is required.

**Solution**

- This solution introduces multi-SMS provider support (ZoomConnect and SMSPortal) into the notification system.
- The main changes include adding the SMSProvider enum, updating SMS setup commands and handlers to support provider selection, and modifying queries and models to store and return the selected SMS provider type.

---

#### **API**

##### Expose functions over api for event scheduling on the mobile app (#154097)

**Problem**

- Certain event scheduling data is not available on the mobile app.

**Solution**

- Expose certain functions as endpoints for the mobile app to use.

---

#### **Report Builder**

##### Bust report permission cache when copying a report. Improve report permission denied error notification (#154401)

**Problem**

- When opening a copied report immediately, an empty snack message is displayed.
- The issue is that the report permission check is failing because the user permission cache is not cleared once the report is copied, and as such, the error is actually 403.

**Solution**

- Ensure the user report permissions cache is busted when report copy succeeds.
- Changed the auth failure to return a formatted 403 message and display a snack accordingly.

---

#### **System Framework**

##### Correct watermark that gets cut off on certain screen resolutions (#154033)

**Problem**

- When cropping an image on a screen with higher resolution, the watermark is being cut off

**Solution**

- Correct the watermark that gets cut off on certain screen resolutions

##### Safari modal focus fix, Firefox sharing notification fix (#154033)

**Problem**

- Firefox: sharing notification shown in screen capture; Safari: screen capture not focusing after capture

**Solution**

- Safari modal focus fix, Firefox sharing notification fix

##### Resolve focus problem on Safari after screen capture (#153916)

**Problem**

- Safari still not focusing

**Solution**

- Resolve Safari focus problem
- The finally block now calls window.focus() instead — reclaims OS/browser-level focus from Safari's native picker without depending on the modal's visibility.
- unhideModalAfterCapture() now calls modalElement.focus() itself, right after restoring opacity/pointer-events — so the focus reclaim happens at the one point the modal is actually a valid, visible focus target again, and it's covered on every unhide path (success, error, and cancel) since they all go through this function.

---

#### **System Access**

##### The time displayed on the watermark is not the same as the default timestamp the screen capture is named with (#153224)

**Problem**

- It appears the zip folder on display on the screen capture contains UTC.

**Solution**

- Correct the timestamp on the watermark and zip file name, and correct the translation on the Email button

##### Session expiry notification does not dismiss (#153089)

**Problem**

- When will the session expire? It shows 30 minutes before it expires on every page.
- When the session expires on an SPA file, the page breaks on click.

**Solution**

- Add checks to show the 5-minute warning only once every 5 minutes.
- Add an auto-redirect to log out when the user session has expired.

##### Issue with error message translations when using Microsoft login (#152530)

**Problem**

- Issue with error message translations when using Microsoft login; message shows translation path

**Solution**

- Update external login translations to use TranslateAsync

---

#### **Audit**

##### Multiple entries created in the Identity audit table (#144811)

**Problem**

- When changes are made to a user role on the System modules admin screen, 3 audit entries are logged in the Identity audit table.

**Solution**

- Resolve Audit entities getting lost or not always logging correctly

---