---
id: CAP-CMT-MTG-006
title: 'Maintain meeting notices, calendar feeds and video access'
feature: FEAT-CMT-MTG-01
product_area: committees
module: meetings
revision: 1
status: draft
product_intent: proposed
implementation_evidence: inconsistent
supersedes:
  - 'react-console acceptance inventory CAP-CMT-MTG-011, 012, 013, 014'
  - 'react-console acceptance journeys CMT-ACC-0213, 0215, 0234, 0236, 0244 to 0246'
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#D1'
  - 'services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#D9'
purpose: >-
  Participants can follow meeting arrangements through notices and calendar subscriptions, with
  video-room work processed after the meeting change commits.
outcomes:
  - Notification submissions are deduplicated by their occasion
  - 'Calendar clients receive identified, versioned events'
  - Room requests run through committed queued work
concepts:
  - CON-CMT-MTG-001
actors:
  - ACT-CMT-002
  - ACT-CMT-005
  - ACT-CMT-011
surfaces:
  - api
  - portal
  - job
preconditions: []
postconditions: []
permissions:
  - key: committees.meetings.read
    where_checked: api
    scope: tenant
  - key: committees.portal.calendar
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-CMT-MTG-006-01
    proved_by: [ATS-CMT-MTG-006-01, ATS-CMT-MTG-006-16, TST-CMT-MTG-123, TST-CMT-MTG-125, TST-CMT-MTG-211, TST-CMT-MTG-215]
    statement: >-
      Calling or moving a scheduled meeting, publishing its agenda or packet, and entering the
      48-hour or two-hour reminder window requests notices for participants who have not declined,
      while cancellation and minutes circulation include every participant.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meeting-notifications.ts:notifyParticipants;
      services-committees:modules/meetings/services/notifications/reminders.ts:sendDueReminders
    origin: none
  - id: BR-CAP-CMT-MTG-006-02
    proved_by: [ATS-CMT-MTG-005-10, ATS-CMT-MTG-006-02, ATS-CMT-MTG-006-14, TST-CMT-MTG-215]
    statement: >-
      Successful notification submissions reserve a unique purpose, meeting, contact and occasion
      key, so repeating that occasion does not submit another request.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#makes
      every idempotency key once
    origin: none
  - id: BR-CAP-CMT-MTG-006-03
    proved_by: [ATS-CMT-MTG-006-03, TST-CMT-MTG-215, TST-CMT-MTG-217]
    statement: >-
      Notifications select the lowest-position non-blank CRM e-mail address and log a skipped result
      when no address is available.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/unit/ports/contact-addresses.spec.ts#is the primary
      address of a contact with one
    origin: none
  - id: BR-CAP-CMT-MTG-006-04
    proved_by: [ATS-CMT-MTG-006-04, TST-CMT-MTG-215, TST-CMT-MTG-218]
    statement: >-
      An unavailable communications service leaves the meeting write successful and releases the
      notification key for explicit retry, without guaranteeing automatic replay of every notice.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meeting-notifications.ts:notifyParticipants
    origin: none
  - id: BR-CAP-CMT-MTG-006-05
    proved_by: [ATS-CMT-MTG-006-05]
    statement: >-
      The product should suppress meeting e-mail until the portal or notifications service arrives
      and let staff download meeting papers and calendar files in the interim.
    kind: policy
    enforced_at: []
    must_prove: true
    provenance: documented
    source: 'services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#Decisions'
    origin: >-
      CMTE-M3 D1 (Andrew 2026-10-21,
      services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#Decisions)
  - id: BR-CAP-CMT-MTG-006-06
    proved_by: [ATS-CMT-MTG-001-17, ATS-CMT-MTG-006-06, ATS-CMT-MTG-006-13, TST-CMT-MTG-115, TST-CMT-MTG-221]
    statement: >-
      A meeting calendar file uses the meeting identity and saved version and changes from an
      invitation to a cancellation when the meeting is cancelled.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/unit/services/ics-calendar.spec.ts#renders an
      invitation as the golden file
    origin: none
  - id: BR-CAP-CMT-MTG-006-07
    proved_by: [ATS-CMT-MTG-006-07, TST-CMT-MTG-215]
    statement: >-
      Issuing a calendar token returns its secret once, stores only its fingerprint and revokes the
      contact’s earlier live token.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#stores
      only the tokens’ hashes, the first revoked by the rotation
    origin: none
  - id: BR-CAP-CMT-MTG-006-08
    proved_by: [ATS-CMT-MTG-006-08, ATS-CMT-MTG-006-15, ATS-CMT-MTG-020-14, TST-CMT-MTG-211]
    statement: >-
      A personal feed accepts a live token without a login, rejects unknown tokens, and includes
      non-draft meetings linked through current committee participation or a meeting participant row
      within the feed window.
    kind: permission
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: observed
    source: 'services-committees:modules/meetings/services/persistence/calendar-feeds.ts:personalFeed'
    origin: none
  - id: BR-CAP-CMT-MTG-006-09
    proved_by: [ATS-CMT-MTG-006-09, TST-CMT-MTG-215]
    statement: >-
      Requested video-room work runs after commit under a stable idempotency key, records successful
      room details, retries failed or unknown outcomes after its claim expires, and settles
      provider-unavailable outcomes without retry.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meeting-room-requests.ts:drainRoomRequests
    origin: none
  - id: BR-CAP-CMT-MTG-006-10
    proved_by: []
    statement: >-
      The product should support pasted meeting or series video links and hide automatic room
      creation until that facility is delivered.
    kind: policy
    enforced_at: []
    must_prove: false
    provenance: documented
    source: 'services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#Decisions'
    origin: >-
      CMTE-M3 D9 (Andrew 2026-10-21,
      services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#Decisions)
  - id: BR-CAP-CMT-MTG-006-11
    proved_by: [ATS-CMT-MTG-006-10]
    statement: >-
      The product should preserve unchanged video details when staff update another part of the
      video information.
    kind: policy
    enforced_at: []
    must_prove: true
    provenance: documented
    source: >-
      services-committees:docs/milestones/plans/CMTE-M3-plan.md#D12. Smaller rules to approve as a
      group
    origin: >-
      CMTE-M3 D12 item 10 (Andrew 2026-10-21,
      services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#Decisions)
  - id: BR-CAP-CMT-MTG-006-12
    proved_by: [ATS-CMT-MTG-006-11]
    statement: >-
      Meeting calendar descriptions currently include staff notes, both in downloaded files and
      personal feeds.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: 'services-committees:modules/meetings/services/persistence/calendar-feeds.ts:icsMeetingOf'
    origin: none
  - id: BR-CAP-CMT-MTG-006-13
    proved_by: []
    statement: >-
      Daily and hourly meeting processes run reminder and room work for active workspaces
      sequentially, with workspace failures reported and the remaining workspaces attempted.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: false
    provenance: observed
    source: 'services-committees:modules/meetings/services/jobs/meetings-jobs.ts'
    origin: none
scenarios:
  - id: SC-CAP-CMT-MTG-006-01
    given: A scheduled meeting has already been called for its original start time
    when: Staff change the start and later restore the original start
    then: >-
      Each distinct start time has its own call-notice occasion; restoring an already submitted
      occasion does not submit it again
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meeting-notifications.ts:notifyParticipants
edge_cases: []
constraints: []
depends_on:
  - CAP-CMT-MTG-001
related:
  - CAP-CMT-MTG-020
journeys:
  - JNY-CMT-MTG-001
open_questions:
  - OQ-CMT-MTG-007
  - OQ-CMT-MTG-008
evidence:
  - >-
    services-committees at 36129c24: Notification claims and retries, calendar token rotation,
    calendar disclosure and room request settlement.
  - >-
    react-console at baf6dae3: the meeting acceptance specifications cited by this capability and
    its acceptance set.
controls:
  - TC-IAM-001
  - TC-IAM-002
  - TC-IAM-004
  - TC-IAM-005
  - 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-002
  - TC-SEC-003
  - TC-SEC-004
  - TC-CRY-001
  - TC-CRY-002
  - TC-CRY-003
  - TC-CRY-004
  - TC-DAT-001
  - TC-DAT-002
  - TC-DAT-003
  - 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-VEN-001
  - TC-VEN-002
  - TC-VEN-003
  - TC-PRV-001
  - TC-PRV-002
exercised_by: [FAS-CMT-MTG-01-01, FAS-CMT-MTG-01-05]
suites: [TST-CMT-MTG-115, TST-CMT-MTG-123, TST-CMT-MTG-125, TST-CMT-MTG-211, TST-CMT-MTG-215, TST-CMT-MTG-217, TST-CMT-MTG-218, TST-CMT-MTG-221]
---

# Maintain meeting notices, calendar feeds and video access

## Purpose

Meeting arrangements need to stay understandable when dates or supporting papers change. Notices, calendar subscriptions and video details provide several ways for participants to follow those arrangements.

## How It Works

The current service submits notices at meeting and publication checkpoints. It chooses addresses from CRM and records successful submissions in a ledger. A recorded submission does not establish that a person received the message. Skipped requests release their keys, but automatic reminder processing does not replay every skipped notice. Staff can download a calendar event, while signed-in members can obtain a secret subscription link. Rotating that link invalidates the earlier token. Calendar descriptions currently include staff notes, leaving a disclosure decision for Product. Video work uses queued requests rather than holding a database transaction open during provider calls. Successful results update the meeting, failed or uncertain results remain eligible for retry, and unavailable-provider results are settled. The approved direction to suppress meeting e-mail and defer automatic video controls still differs from the available backend behaviour.

## Relationships

Scheduling and publication provide the notice occasions. Member participation supplies calendar-token access; shared communications and video services fulfil the external requests.
