---
id: WF-CMT-MTG-005
title: Dispatch Committed Business Events
trigger: >-
  A business write records an event; a post-commit wake-up or minute schedule
  starts dispatch.
product_area: committees
module: meetings
revision: 1
status: draft
design_intent: proposed
implementation_evidence: observed
inference: []
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
implements:
  - CAP-CMT-MTG-001
  - CAP-CMT-MTG-010
  - CAP-CMT-MTG-016
crosses:
  - SVC-CMT-MTG-meetings
  - SVC-PFM-INT-extensions
idempotency: >-
  Events and delivery rows commit together. Rows are removed after queue
  acceptance, so delivery is at least once and subscribers must tolerate
  duplicates.
concurrency: >-
  Dispatch claims pending work and consumers settle messages individually. The
  inspected wrapper does not promise ordering for successive events about one
  record.
hops:
  - 'n': 1
    actor_or_service: Any Committees write
    action: >-
      Persist the event and subscriber delivery work with the business
      transaction.
    anchor: >-
      services-committees:modules/meetings/services/events/meeting-events.ts:publishMeetingEvent
    seam: sync
    on_failure: Abort the business write.
    left_inconsistent: No event survives a rolled-back change.
    observer: The persisted event ledger.
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/events/meeting-events.ts:publishMeetingEvent
  - 'n': 2
    actor_or_service: Business-event dispatcher
    action: >-
      Claim delivery rows and send subscriber messages from the scheduled or
      nudged dispatcher.
    anchor: >-
      services-committees:modules/meetings/aws/lambda/EVENTS_DISPATCHER.handler.ts:handler
    seam: schedule
    on_failure: Keep unaccepted rows for another dispatch pass.
    left_inconsistent: Subscribers receive the event later.
    observer: Dispatcher logs and its declared silence alarm.
    provenance: observed
    source: >-
      services-committees:modules/meetings/aws/lambda/EVENTS_DISPATCHER.handler.ts:handler
  - 'n': 3
    actor_or_service: Business-event consumer
    action: Invoke each destination and return partial batch results.
    anchor: >-
      services-committees:modules/meetings/aws/lambda/EVENTS_CONSUMER.handler.ts:handler
    seam: queue
    on_failure: Allow the queue to redeliver failed messages.
    left_inconsistent: Subscriber effects can be delayed or repeated.
    observer: Message-consumer logs.
    provenance: observed
    source: >-
      services-committees:modules/meetings/aws/lambda/EVENTS_CONSUMER.handler.ts:handler
  - 'n': 4
    actor_or_service: Event intake
    action: >-
      Route native Committees envelopes in their workspace and refuse unknown
      subscriber keys.
    anchor: >-
      services-committees:modules/meetings/aws/lambda/EVENT_INTAKE.handler.ts:handler
    seam: event
    on_failure: >-
      Return failure for retry; unroutable envelopes eventually reach the
      publisher’s dead letter path.
    left_inconsistent: No native effect until delivery succeeds.
    observer: Delivery dead letters.
    provenance: observed
    source: >-
      services-committees:modules/meetings/aws/lambda/EVENT_INTAKE.handler.ts:handler
branches: []
waits: []
evidence:
  - >-
    services-committees at 36129c24: lib/events/business-events.ts;
    modules/meetings/aws/lambda/EVENTS_*.ts, EVENT_INTAKE.handler.ts;
    modules/meetings/aws/logic/meetings-functions.lambda.ts;
    aws/committees.events.ts
controls:
  - TC-IAM-006
  - TC-AZ-001
  - TC-AZ-002
  - TC-AZ-003
  - TC-AZ-004
  - TC-AZ-006
  - TC-TEN-001
  - TC-TEN-002
  - TC-TEN-003
  - TC-TEN-004
  - TC-SEC-001
  - TC-SEC-004
  - TC-DAT-001
  - TC-DAT-002
  - TC-DAT-003
  - TC-DAT-004
  - TC-LOG-001
  - TC-LOG-002
  - TC-LOG-003
  - TC-LOG-004
  - TC-LOG-005
  - TC-AVL-004
  - TC-AVL-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
---
# Dispatch Committed Business Events

## What It Does

A business write records an event; a post-commit wake-up or minute schedule starts dispatch. The source handlers delegate queue mechanics to the shared event library. Native intake fills openings from appointment-started events. The design describes that declared contract without treating an imported library wrapper as an independent execution test.

## The Flow

```mermaid
flowchart TD
  H1["Persist the event and subscriber delivery work with the business transaction."]

  H2["Claim delivery rows and send subscriber messages from the scheduled or nudged dispatcher."]
  H3["Invoke each destination and return partial batch results."]
  H4["Route native Committees envelopes in their workspace and refuse unknown subscriber keys."]
  H1 --> H2
  H2 --> H3
  H3 --> H4
```

Persist the event and subscriber delivery work with the business transaction. Claim delivery rows and send subscriber messages from the scheduled or nudged dispatcher. Invoke each destination and return partial batch results. Route native Committees envelopes in their workspace and refuse unknown subscriber keys.

## When Something Fails

Abort the business write. No event survives a rolled-back change. Keep unaccepted rows for another dispatch pass. Subscribers receive the event later. Allow the queue to redeliver failed messages. Subscriber effects can be delayed or repeated. Return failure for retry; unroutable envelopes eventually reach the publisher’s dead letter path. No native effect until delivery succeeds.

## Open Design Questions

The source handlers delegate queue mechanics to the shared event library. Native intake fills openings from appointment-started events. The design describes that declared contract without treating an imported library wrapper as an independent execution test.
