---
id: WF-PFM-NOT-008
title: Retry an exhausted delivery from Rhythm HQ
trigger: An authorized HQ operator retries an exhausted channel delivery.
product_area: platform
module: notifications
revision: 1
status: draft
design_intent: proposed
implementation_evidence: observed
inference: []
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
implements:
- CAP-PFM-NOT-012
moves:
- STATE-PFM-NOT-005
- STATE-PFM-NOT-003
crosses:
- SVC-PFM-NOT-notifications
hops:
- n: 1
  actor_or_service: Rhythm notification operator
  action: Read exhausted deliveries across operational workspaces, bounded to one thousand workspaces
    and one hundred results.
  anchor: services-platform:modules/notifications/services/centre/hq-notifications.ts:listDeadLetters
  seam: sync
  on_failure: Return an error to the operator.
  left_inconsistent: No delivery change; returned content currently lacks an access-grant check.
  observer: Operation response.
  provenance: observed
  source: services-platform:modules/notifications/services/centre/hq-notifications.ts:listDeadLetters
- n: 2
  actor_or_service: Rhythm notification operator
  action: Request retry for a delivery in its selected workspace.
  anchor: services-platform:modules/notifications/services/centre/hq-notifications.ts:retryDeadDelivery
  seam: sync
  on_failure: Refuse missing rows and failures other than exhaustion.
  left_inconsistent: No change on refusal.
  observer: Operation response.
  provenance: test
  source: services-platform:modules/notifications/tests/integration/services/dispatch/deliver-delivery.integration.spec.js#queues
    a delivery that ran out of receives again, with its work row, and nothing else
- n: 3
  actor_or_service: Dispatcher and chat consumer
  action: Dispatch the new work and process it with a fresh queue receive budget.
  anchor: services-platform:modules/notifications/services/dispatch/deliver-delivery.ts:deliverQueuedDelivery
  seam: queue
  on_failure: Apply the ordinary channel delivery retry policy.
  left_inconsistent: Ordinary channel-delivery ambiguity and summary gaps still apply.
  observer: Delivery history and monitoring.
  provenance: observed
  source: services-platform:modules/notifications/services/persistence/deliveries.ts:requeueExhaustedDelivery
idempotency: Only one failed-to-queued exhaustion update succeeds; another retry is refused.
concurrency: The retry claim coordinates operators, then ordinary send claims coordinate consumers.
branches: []
waits: []
evidence:
- 'services-platform at ad3f6a65: modules/notifications/services/centre/hq-notifications.ts; services/persistence/deliveries.ts;
  aws/api/notifications.routes.ts (HQ routes).'
controls: [TC-AVL-001, TC-AVL-004, TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-005, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-IAM-001, TC-IAM-002, TC-IAM-003, TC-IAM-004, TC-IAM-005, TC-IAM-006, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, 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-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
---
# Retry an exhausted delivery from Rhythm HQ

## What It Does

An authorized HQ operator retries an exhausted channel delivery.

## The Flow

```mermaid
flowchart TD
    h0["Read exhausted deliveries across operational workspaces, bounded to one thousand workspaces and one hundred results"]
    h1["Request retry for a delivery in its selected workspace"]
    h0 --> h1
    h2["Dispatch the new work and process it with a fresh queue receive budget"]
    h1 --> h2
```

## When Something Fails

The hop rows identify each retry boundary, any state left behind and the available observer. Only one failed-to-queued exhaustion update succeeds; another retry is refused. The retry claim coordinates operators, then ordinary send claims coordinate consumers.

## Open Design Questions

The module findings retain unresolved cross-service authority and recovery questions where this flow depends on shared infrastructure.
