feat(notifications): SMS notifications retry under SmsConfiguration.MaxRetries/RetryDelay (SMTP policy remains the Email + fallback policy) — wires the dead fields

Claude-Session: https://claude.ai/code/session_01MtdgwpEeCUn6cUA5f1LMPj
This commit is contained in:
Joseph Doherty
2026-07-10 04:07:03 -04:00
parent f0dd016207
commit 178ae35308
5 changed files with 173 additions and 38 deletions
@@ -28,19 +28,21 @@ public class SmsConfiguration
/// <summary>
/// Gets or sets the maximum number of delivery retries before parking.
/// <para>
/// RESERVED: the Notification Outbox dispatcher currently derives the retry policy
/// (max-retries + interval) from the central SMTP configuration for <em>all</em>
/// notification types — see the "retry reuses central SMTP max-retry-count and fixed
/// interval" design decision and <c>NotificationOutboxActor.ResolveRetryPolicyAsync</c>.
/// This per-SMS value is persisted/transported for forward-compatibility but is NOT
/// yet read at dispatch time. Honoring it per-type is a deferred enhancement (it would
/// supersede the shared-SMTP-policy decision and is not a silent behavioral change).
/// LIVE for SMS: the Notification Outbox dispatcher selects the retry policy by
/// notification <c>Type</c> — SMS notifications retry under this value (and
/// <see cref="RetryDelay"/>), while Email (and every other type) uses the central SMTP
/// policy. When no SMS configuration row exists the dispatcher falls back to the SMTP
/// policy. A non-positive value is clamped to the outbox fallback (10) with a Warning so
/// a misconfiguration cannot silently park SMS on the first transient failure. See
/// <c>NotificationOutboxActor.ResolveRetryPoliciesAsync</c>.
/// </para>
/// </summary>
public int MaxRetries { get; set; }
/// <summary>
/// Gets or sets the delay between retry attempts. RESERVED — see <see cref="MaxRetries"/>:
/// the dispatcher currently uses the shared SMTP-derived retry interval for all types.
/// Gets or sets the delay between retry attempts. LIVE for SMS — see
/// <see cref="MaxRetries"/>: the dispatcher schedules the next SMS attempt with this delay
/// (clamped to the 1-minute fallback if non-positive), falling back to the SMTP interval
/// when no SMS configuration exists.
/// </summary>
public TimeSpan RetryDelay { get; set; }