---
id: WF-CMT-MTG-001
title: Notify Participants After Meeting Changes
trigger: 'A staff or series write calls, reschedules, publishes or cancels a meeting.'
product_area: committees
module: meetings
revision: 1
status: draft
design_intent: proposed
implementation_evidence: inconsistent
inference: []
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
implements:
  - CAP-CMT-MTG-001
  - CAP-CMT-MTG-004
  - CAP-CMT-MTG-005
  - CAP-CMT-MTG-006
moves:
  - STATE-CMT-MTG-001
  - STATE-CMT-MTG-002
crosses:
  - SVC-CMT-MTG-meetings
  - SVC-PFM-NOT-communications
  - SVC-CRM-ENT-entities
idempotency: >-
  Notice keys combine purpose, meeting, recipient and occasion. Calling uses the
  start instant, so a new start permits another request; committed events are
  separate records.
concurrency: >-
  Meeting locks serialize writes. Unique notice keys suppress concurrent
  submissions for the same occasion.
hops:
  - 'n': 1
    actor_or_service: Meetings API
    action: >-
      Validate and lock the meeting at the supplied version, then save it;
      creation also copies the dated roster.
    anchor: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:rewriteMeetingDetails
    seam: sync
    on_failure: Reject the request without committing changes.
    left_inconsistent: No partial database change.
    observer: The operation response.
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:rewriteMeetingDetails
  - 'n': 2
    actor_or_service: Meetings API
    action: Persist the corresponding business event with the meeting change.
    anchor: >-
      services-committees:modules/meetings/services/events/meeting-events.ts:publishMeetingEvent
    seam: sync
    on_failure: Roll back the transaction.
    left_inconsistent: No committed event or change.
    observer: The persisted event ledger.
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/events/meeting-events.ts:publishMeetingEvent
  - 'n': 3
    actor_or_service: Meetings API
    action: >-
      Reserve each recipient’s notice key and submit the request using their CRM
      address; cancellations include declined participants.
    anchor: >-
      services-committees:modules/meetings/services/persistence/meeting-notifications.ts:notifyParticipants
    seam: sync
    on_failure: >-
      Release the key and log an unavailable address or communications service;
      other database failures abort the write.
    left_inconsistent: Non-reminder notices have no scheduled recovery after a skip.
    observer: The meeting function warning log.
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meeting-notifications.ts:notifyParticipants
  - 'n': 4
    actor_or_service: Meetings API
    action: 'Append any needed room creation, update or cancellation request.'
    anchor: >-
      services-committees:modules/meetings/services/persistence/meeting-room-requests.ts:enqueueRoomRequest
    seam: sync
    on_failure: Abort the enclosing write.
    left_inconsistent: No room request survives rollback.
    observer: Pending room-request rows.
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meeting-room-requests.ts:enqueueRoomRequest
  - 'n': 5
    actor_or_service: Meetings API
    action: >-
      Wake the event and communication dispatchers after the transaction
      commits.
    anchor: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:afterMeetingCommitted
    seam: event
    on_failure: Treat the wake-up as best effort; scheduled dispatch remains available.
    left_inconsistent: Delivery waits for a later dispatcher pass.
    observer: Dispatcher execution logs.
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:afterMeetingCommitted
branches:
  - Dissolution suppresses participant notices.
  - Returning a scheduled meeting to draft sends no withdrawal.
  - Packet release timestamps every material not yet published.
waits:
  - >-
    Post-commit dispatch is scheduled each minute; no upper delivery bound is
    established.
evidence:
  - >-
    services-committees at 36129c24:
    modules/meetings/services/persistence/meetings.ts, meeting-notifications.ts,
    meeting-room-requests.ts; ports/notifier.ts, contact-addresses.ts;
    docs/milestones/CMTE-M3-meetings-and-minutes.md (D1, What is built today)
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-SEC-001
  - TC-SEC-004
  - TC-CRY-001
  - TC-DAT-001
  - TC-DAT-002
  - TC-DAT-003
  - TC-DAT-004
  - TC-LOG-002
  - TC-LOG-003
  - TC-LOG-004
  - TC-LOG-005
  - TC-AVL-004
  - 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
---
# Notify Participants After Meeting Changes

## What It Does

A staff or series write calls, reschedules, publishes or cancels a meeting. The delivery work commits with the business change. A skip can still leave participants uninformed, because only reminders have a recurring recovery path. Dissolution suppresses cancellation notices, and returning a scheduled meeting to draft sends no withdrawal.

## The Flow

```mermaid
flowchart TD
  H1["Validate and lock the meeting at the supplied version, then save it"]

  H2["Persist the corresponding business event with the meeting change."]
  H3["Reserve each recipient’s notice key and submit the request using their CRM address"]
  H4["Append any needed room creation, update or cancellation request."]
  H5["Wake the event and communication dispatchers after the transaction commits."]
  H1 --> H2
  H2 --> H3
  H3 --> H4
  H4 --> H5
```

Validate and lock the meeting at the supplied version, then save it; creation also copies the dated roster. Persist the corresponding business event with the meeting change. Reserve each recipient’s notice key and submit the request using their CRM address; cancellations include declined participants. Append any needed room creation, update or cancellation request. Wake the event and communication dispatchers after the transaction commits.

## When Something Fails

Reject the request without committing changes. No partial database change. Roll back the transaction. No committed event or change. Release the key and log an unavailable address or communications service; other database failures abort the write. Non-reminder notices have no scheduled recovery after a skip. Abort the enclosing write. No room request survives rollback. Treat the wake-up as best effort; scheduled dispatch remains available. Delivery waits for a later dispatcher pass.

## Open Design Questions

The delivery work commits with the business change. A skip can still leave participants uninformed, because only reminders have a recurring recovery path. Dissolution suppresses cancellation notices, and returning a scheduled meeting to draft sends no withdrawal.
