Skip to main content

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 TenantNotification rows 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 TablesTenantNotification and TenantNotificationInteraction tables defined as SSDT .sql files under infrastructure/Databases/Notifications/, with a covering index IX_TenantNotification_TenantType on (TenantReferenceId, NotificationTypeId, NotificationCategoryId) for zero-scan reads
  • EF Core Entities and NotificationsDbContextTenantNotification and TenantNotificationInteraction EF entities implementing IAuditableEntity, with explicit soft-delete query filters and keyed NotificationsDbContext registration for actor use
  • NotificationActor (Dapr Virtual Actor)INotificationActor with UpdateAsync / DeleteAsync, inheriting ActivatableAggregateActor and keyed by NotificationId; upserts match on NotificationId + TenantReferenceId + TargetPartyId with per-actor failure isolation
  • NotificationViewsUpdateService (CDC Pipeline)NotificationViewsUpdateService implementing IDynamicsViewUpdate + IResilientDynamicsViewUpdate; sequential CDC loop from Dataverse change pages to Dynamics M:N tenant lookup to one actor proxy per notification; inactive-state events route to DeleteAsync

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 OrphaningNotificationActor.UpdateAsync was querying TenantNotifications through 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 returned null and a new TenantNotificationId was created, orphaning all existing TenantNotificationInteraction rows (the user's seen history). The notification then reappeared as unseen on the next page load. Fixed by calling .IgnoreQueryFilters() in UpdateAsync and 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.MarkAsSeenAsync had an existence check that skipped insertion when a TenantNotificationInteraction row already existed. The seed script had backfilled rows with historical CreatedOnDateUtc values; on dismiss, no new row was written, so ShouldShowBasedOnFrequency evaluated 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 by CreatedOnDateUtc descending 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)