Release v1.38.0
Released June 2026
Executive Summary
Features
Notifications
- Migrated the portal notification read path from live Dynamics 365 and Redis to a Dapr Actor CDC SQL projection, eliminating production outage risk caused by Redis unavailability and live Dynamics query timeouts (157742) (PR 24766)
User Experience
- Added on-behalf-of subscription support to the profile subscriptions card, enabling users to view and manage subscriptions held on behalf of other parties (158289) (PR 24844)
Bug Fixes
- Fixed notification reappearing as unseen after a user closes it — caused by soft-deleted
TenantNotificationrows being orphaned on CDC update events, discarding the user's interaction history (158983) (PR 24943) - Fixed recurring (Daily and other frequency) notifications reappearing after dismissal — dismiss interactions are now always recorded as new rows so frequency filtering always evaluates against the latest timestamp (PR 24950)
Documentation
- Published incident report for the Severity 1 outage on May 20, 2026 caused by a Microsoft-deployed Dapr upgrade that failed all Azure Container Apps containers (PR 24911)
Overview
Release v1.38.0 is a targeted release focused on the notifications domain. The headline change is the dark-deploy of the SQL projection pipeline that replaces live Dynamics 365 and Redis as the portal notification read path, addressing recurring production outages. Two related notification reliability bug fixes ship alongside the feature to fully stabilise seen-state behaviour. The release also adds on-behalf-of subscription visibility to the profile subscriptions card.
Features
Notifications: Portal Read Path Migration to Dapr Actor CDC
Implements Epic 1 of Feature 157742 — the dark-deploy SQL projection pipeline that eliminates Redis and live Dynamics calls from the portal notification read path. (PR 24766)
Background: The two portal notification read endpoints (GET /{notificationType}/unseen and POST /notificationproduct) previously made up to six live Dynamics 365 OData calls per request and depended on Redis to cache the OData delta URL between calls. When Redis was unavailable or degraded, the delta URL state was lost, queries fell back to full table scans, and both endpoints timed out — causing production outages.
Changes delivered:
- SSDT SQL Tables —
TenantNotificationandTenantNotificationInteractiontables defined as SSDT.sqlfiles underinfrastructure/Databases/Notifications/, with a covering indexIX_TenantNotification_TenantTypeon(TenantReferenceId, NotificationTypeId, NotificationCategoryId)for zero-scan reads - EF Core Entities and NotificationsDbContext —
TenantNotificationandTenantNotificationInteractionEF entities implementingIAuditableEntity, with explicit soft-delete query filters and keyedNotificationsDbContextregistration for actor use - NotificationActor (Dapr Virtual Actor) —
INotificationActorwithUpdateAsync/DeleteAsync, inheritingActivatableAggregateActorand keyed byNotificationId; upserts match onNotificationId + TenantReferenceId + TargetPartyIdwith per-actor failure isolation - NotificationViewsUpdateService (CDC Pipeline) —
NotificationViewsUpdateServiceimplementingIDynamicsViewUpdate+IResilientDynamicsViewUpdate; sequential CDC loop from Dataverse change pages to Dynamics M:N tenant lookup to one actor proxy per notification; inactive-state events route toDeleteAsync
Deployment note: This is a dark deploy. The SQL projection pipeline populates the new tables but the portal read endpoints continue to use the existing Dynamics+Redis path until the feature flag cutover in a future release.
User Experience: Profile Subscriptions On-Behalf-Of Support
Added support for on-behalf-of subscriptions in the profile subscriptions card MFE, allowing users to view and manage subscriptions that exist on behalf of other parties within their account. (158289) (PR 24844)
Bug Fixes
-
Notification Seen-Gate Bypass via Soft-Delete Orphaning —
NotificationActor.UpdateAsyncwas queryingTenantNotificationsthrough the EF global soft-delete query filter. When a soft-deleted row existed and a CDC update event arrived for the same notification, the query returnednulland a newTenantNotificationIdwas created, orphaning all existingTenantNotificationInteractionrows (the user's seen history). The notification then reappeared as unseen on the next page load. Fixed by calling.IgnoreQueryFilters()inUpdateAsyncand resurrecting soft-deleted rows in-place, preserving the original ID and all interaction history. Closes 158983. (PR 24943) -
Recurring Notification Reappear After Dismiss — After a user dismissed a Daily (or other recurring-frequency) notification, it reappeared on the next page reload. Root cause:
NotificationInteractionService.MarkAsSeenAsynchad an existence check that skipped insertion when aTenantNotificationInteractionrow already existed. The seed script had backfilled rows with historicalCreatedOnDateUtcvalues; on dismiss, no new row was written, soShouldShowBasedOnFrequencyevaluated against the old historical date and kept showing the notification. Fixed by removing the existence check and always inserting a new interaction row — the filtering service already orders byCreatedOnDateUtcdescending and picks up the latest timestamp immediately. (PR 24950)
Documentation
- Incident Report: 2026-05-20 Dapr Upgrade Container Failure — Published a Severity 1 incident report documenting the outage on May 20, 2026 (11:50 – 14:42 SAST, ~2 hours 52 minutes) where a Microsoft-deployed Dapr upgrade caused all Azure Container Apps containers to fail, blocking report generation across all Apex tenants. The report also documents the related background issue of Dapr actor reminders not firing since April 7, 2026 (SR# 2604240050001595), which remains open. (PR 24911)