---
id: WF-PFM-ELG-018
title: Send attention reminders
trigger: >-
  The fifteen-minute sender processes due attention reminders for each
  workspace.
product_area: platform
module: eligibility
revision: 1
status: draft
design_intent: confirmed
origin: >-
  Responsibilities and attention architecture D-10, approved 2026-10-18;
  PLAT-M16 change "use the notifications platform capability" and D1 (digest and
  quiet hours dropped) and D2 (reminders off until enabled), approved by Andrew
  2026-10-21. The built sender is inconsistent with these decisions.
implementation_evidence: inconsistent
inference: []
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
implements:
  - CAP-PFM-ELG-019
moves: []
crosses:
  - SVC-PFM-ELG-attention
idempotency: >-
  A message key hashes the person and complete sorted reminder-row cohort.
  Identical cohorts deduplicate; a changed cohort can repeat an accepted
  reminder after a stamp failure.
concurrency: >-
  Reserved concurrency is one and each workspace reads up to two thousand rows.
  Send-time checks cover item and personal state, policy and address, but not
  current audience membership.
hops:
  - 'n': 1
    actor_or_service: Reminder sender
    action: >-
      Read due rows and skip closed, dismissed, snoozed, hidden, disabled or
      undeliverable items, honoring quiet-hour deferral without resolving the
      audience again.
    anchor: >-
      services-platform:modules/attention/services/reminders/send-reminders.ts:sendTenantReminders
    seam: schedule
    on_failure: Log a workspace failure and leave due rows for later invocation.
    left_inconsistent: A former holder can still have a deliverable queued reminder.
    observer: Sender failure and silence alarms expose stalled work.
    provenance: observed
    source: >-
      services-platform:modules/attention/services/reminders/send-reminders.ts:sendTenantReminders
  - 'n': 2
    actor_or_service: Reminder sender
    action: >-
      Group deliverable rows by person, render titles, summaries, local due
      times and console links, and submit through Communications.
    anchor: >-
      services-platform:modules/communications/services/requests/submit-request.ts:submitRequest
    seam: queue
    on_failure: Rejected requests remain due and are logged for retry.
    left_inconsistent: >-
      Accepted delivery followed by failed stamping can repeat under a changed
      cohort key.
    observer: Error logs and communication history expose acceptance.
    provenance: observed
    source: >-
      services-platform:modules/attention/services/reminders/reminder-message.ts:buildReminderMessage
  - 'n': 3
    actor_or_service: Reminder sender
    action: Mark the included rows sent with the accepted request identity.
    anchor: >-
      services-platform:modules/attention/services/persistence/reminders.ts:markRemindersSent
    seam: sync
    on_failure: A stamp failure leaves rows due for another run.
    left_inconsistent: >-
      Delivery and reminder storage can disagree; cohort deduplication does not
      guarantee exactly-once delivery.
    observer: Sent counters report successful stamping.
    provenance: observed
    source: >-
      services-platform:modules/attention/services/persistence/reminders.ts:markRemindersSent
branches:
  - >-
    Approved delivery belongs to Notifications and starts disabled until
    administrator enablement; the current sender differs from that target.
waits: []
evidence:
  - >-
    services-platform at ad3f6a6: modules/attention/services/reminders/;
    reminders.ts; services/persistence/reminders.ts;
    modules/communications/services/requests/submit-request.ts;
    aws/logic/attention-reminders.lambda.ts; docs/attention.md §7;
    docs/milestones/PLAT-M16-attention-follow-up-and-tuning.md (Decisions).
controls: [TC-AVL-004, TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-CRY-004, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-IAM-006, TC-LOG-002, TC-LOG-003, TC-LOG-005, TC-MON-001, TC-MON-002, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-004, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-PRV-004, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
---
# Send attention reminders

## What It Does

The fifteen-minute sender processes due attention reminders for each workspace.

## The Flow

```mermaid
flowchart TD
  H1["Reminder sender" ]
  H2["Reminder sender" ]
  H1 --> H2
  H3["Reminder sender" ]
  H2 --> H3
```

Read due rows and skip closed, dismissed, snoozed, hidden, disabled or undeliverable items, honoring quiet-hour deferral without resolving the audience again. Group deliverable rows by person, render titles, summaries, local due times and console links, and submit through Communications. Mark the included rows sent with the accepted request identity.

## When Something Fails

Log a workspace failure and leave due rows for later invocation. A former holder can still have a deliverable queued reminder. Rejected requests remain due and are logged for retry. Accepted delivery followed by failed stamping can repeat under a changed cohort key. A stamp failure leaves rows due for another run. Delivery and reminder storage can disagree; cohort deduplication does not guarantee exactly-once delivery.

## Open Design Questions

Approved delivery belongs to Notifications and starts disabled until administrator enablement; the current sender differs from that target.
