---
id: CAP-CMT-MTG-001
title: Schedule a committee meeting and preserve its outcome
feature: FEAT-CMT-MTG-01
product_area: committees
module: meetings
revision: 2
status: draft
product_intent: proposed
implementation_evidence: inconsistent
supersedes:
  - 'react-console acceptance inventory CAP-CMT-MTG-001, 002, 003, 004, 025, 027'
  - 'react-console acceptance journeys CMT-ACC-0210 to 0216, 0251, 0252, 0254'
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#D12'
  - 'services-committees:docs/milestones/plans/CMTE-M3-plan.md#4. Assumptions'
  - >-
    services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#D5
purpose: >-
  Governance staff arrange a committee gathering and keep a reliable record of
  whether it takes place or is cancelled.
outcomes:
  - >-
    A committee has a dated meeting record with its location and current
    standing
  - Completed and cancelled meetings retain their meeting details
  - Dissolution stops later draft and scheduled gatherings
concepts:
  - CON-CMT-MTG-001
actors:
  - ACT-CMT-002
  - ACT-CMT-008
  - ACT-CMT-011
surfaces:
  - api
  - job
preconditions:
  - The owning committee is present and has not been dissolved.
postconditions:
  - >-
    Closing leaves a held meeting with a final agenda and a draft minutes record
    if one is needed.
permissions:
  - key: committees.meetings.read
    where_checked: api
    scope: tenant
  - key: committees.meetings.manage
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-CMT-MTG-001-01
    proved_by: [ATS-CMT-MTG-001-01, ATS-CMT-MTG-001-19, TST-CMT-MTG-222]
    statement: >-
      A draft meeting can be scheduled or cancelled, a scheduled meeting can
      return to draft, start or be cancelled, and an in-progress meeting can
      close or be cancelled; closing also accepts a scheduled meeting, while
      held and cancelled statuses have no successor.
    kind: lifecycle
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:closeMeeting
    origin: none
    examples:
      positive: Staff return a scheduled gathering to draft.
      negative: Staff try to reschedule a gathering already recorded as held.
  - id: BR-CAP-CMT-MTG-001-02
    proved_by: [ATS-CMT-MTG-001-02, TST-CMT-MTG-090]
    statement: >-
      A meeting is refused without being saved unless its end follows its start
      and its time zone is recognised.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:requireTimes
    origin: none
    examples:
      positive: Staff save a ninety-minute evening meeting in the New York time zone.
      negative: Staff submit a meeting whose start and end coincide.
    note: >-
      The database checks end-after-start but does not validate the time-zone
      vocabulary; the combined rule is enforced through the service.
  - id: BR-CAP-CMT-MTG-001-03
    proved_by: [ATS-CMT-MTG-001-03, TST-CMT-MTG-131]
    statement: New meetings are refused for dissolved committees.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:insertMeeting
    origin: none
  - id: BR-CAP-CMT-MTG-001-04
    proved_by: [ATS-CMT-MTG-001-04, ATS-CMT-MTG-001-15, ATS-CMT-MTG-002-10, TST-CMT-MTG-091, TST-CMT-MTG-215]
    statement: Held and cancelled meetings reject staff edits to their meeting details.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:rewriteMeetingDetails
    origin: none
  - id: BR-CAP-CMT-MTG-001-05
    proved_by: [ATS-CMT-MTG-001-05, TST-CMT-MTG-093, TST-CMT-MTG-215]
    statement: >-
      A staff change is refused when it supplies a meeting version older than
      the saved version.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#refuses
      a replace at a version the meeting no longer has
    origin: none
  - id: BR-CAP-CMT-MTG-001-06
    proved_by: [ATS-CMT-MTG-001-06, ATS-CMT-MTG-001-16, ATS-CMT-MTG-001-18, ATS-CMT-MTG-003-16, ATS-CMT-MTG-007-11, TST-CMT-MTG-212, TST-CMT-MTG-216]
    statement: >-
      Closing a scheduled or in-progress meeting leaves it held with a final
      agenda and ordinarily frozen participants and attendance, creating an
      empty minutes draft only when no minutes exist.
    kind: lifecycle
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:closeMeeting
    origin: none
  - id: BR-CAP-CMT-MTG-001-07
    proved_by: [ATS-CMT-MTG-001-07, ATS-CMT-MTG-001-17, ATS-CMT-MTG-006-13]
    statement: >-
      Cancellation of an unfinished meeting retains any supplied reason in its
      notes and requests cancellation of a video room already recorded for it.
    kind: lifecycle
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:cancelMeetingIn
    origin: none
  - id: BR-CAP-CMT-MTG-001-08
    proved_by: [ATS-CMT-MTG-001-08]
    statement: >-
      Dissolving a committee ends its active and paused series and cancels its
      later draft and scheduled meetings without notices, using each meeting’s
      local date and retaining on-date, earlier, in-progress and ended meetings.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/committee-dissolutions.ts
    origin: >-
      CMTE-M1 D5 (Andrew 2026-10-19 17:53 ET,
      services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#Decisions)
  - id: BR-CAP-CMT-MTG-001-09
    proved_by: [ATS-CMT-MTG-001-09, TST-CMT-MTG-095]
    statement: A meeting may link to its continuation but cannot select itself.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/meetings.table.ts:meetings_adjourned_not_self_check
    origin: none
  - id: BR-CAP-CMT-MTG-001-10
    proved_by: [ATS-CMT-MTG-001-10]
    statement: >-
      The product should restrict a continuation to a later meeting of the
      original committee.
    kind: validation
    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 5 (Andrew 2026-10-21,
      services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#Decisions)
  - id: BR-CAP-CMT-MTG-001-11
    proved_by: []
    statement: The committee’s meeting list is paged in descending start order.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: false
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:listCommitteeMeetings
    origin: none
  - id: BR-CAP-CMT-MTG-001-12
    proved_by: [ATS-CMT-MTG-001-11]
    statement: >-
      Bulk insert and upsert definitions call the same meeting and series
      persistence services as ordinary writes, so each newly created meeting
      receives a roster snapshot.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/data-operations/meetings-data-operations.ts
    origin: none
  - id: BR-CAP-CMT-MTG-001-13
    proved_by: []
    statement: >-
      Database version records retain each meeting change and its author,
      although staff have no history route or screen.
    kind: invariant
    enforced_at:
      - database
    must_prove: false
    provenance: observed
    source: 'services-committees:modules/meetings/db/meetings.table.ts:meetingVersions'
    origin: none
  - id: BR-CAP-CMT-MTG-001-14
    proved_by: []
    statement: Meeting records have no custom-field values.
    kind: policy
    enforced_at:
      - api
    must_prove: false
    provenance: documented
    source: 'services-committees:docs/milestones/plans/CMTE-M3-plan.md#4. Assumptions'
    origin: 'CMTE-M3 plan A10 (R2-ARCH-001, Andrew 2026-10-19)'
  - id: BR-CAP-CMT-MTG-001-15
    proved_by: [ATS-CMT-MTG-001-13, TST-CMT-MTG-090]
    statement: >-
      Meeting requests reject blank titles, unsupported kinds or visibility,
      instants without offsets, disallowed statuses and fields outside the
      declared request shape.
    kind: validation
    enforced_at:
      - api
    must_prove: true
    provenance: observed
    origin: none
    source: >-
      services-committees:modules/meetings/aws/api/meetings.schemas.ts:meetingCreateSchema
  - id: BR-CAP-CMT-MTG-001-16
    proved_by: [ATS-CMT-MTG-001-14, TST-CMT-MTG-095]
    statement: >-
      A continuation reference is refused unless it identifies an existing
      meeting in the current workspace.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: observed
    origin: none
    source: >-
      services-committees:modules/meetings/db/meetings.table.ts:meetings_adjourned_to_meeting_fk
scenarios:
  - id: SC-CAP-CMT-MTG-001-01
    given: The Finance Committee has a November meeting in draft
    when: A meeting manager schedules it
    then: >-
      Calling the meeting initiates participant notices and requests a room if
      its video settings ask for one
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:rewriteMeetingDetails
  - id: SC-CAP-CMT-MTG-001-02
    given: A meeting is already recorded as held
    when: A staff member submits a different meeting title
    then: The meeting-detail edit is rejected because the meeting has ended
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:rewriteMeetingDetails
edge_cases: []
constraints: []
depends_on: []
related:
  - CAP-CMT-MTG-002
  - CAP-CMT-MTG-003
  - CAP-CMT-MTG-006
  - CAP-CMT-MTG-007
journeys:
  - JNY-CMT-MTG-001
open_questions:
  - OQ-CMT-MTG-001
evidence:
  - >-
    services-committees at 36129c24: examined scheduling schemas and routes,
    meeting writes and lifecycle guards, table constraints, dissolution effects,
    bulk-operation declarations, integration assertions and the cited product
    decisions
  - >-
    react-console at baf6dae3: inspected the scheduling, invalid-input,
    lifecycle, cancellation, continuation, bulk-load and dissolution test bodies
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-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
exercised_by: [FAS-CMT-MTG-01-01, FAS-CMT-MTG-01-02, FAS-CMT-MTG-01-03, FAS-CMT-MTG-01-04, FAS-CMT-MTG-01-05]
suites: [TST-CMT-MTG-090, TST-CMT-MTG-091, TST-CMT-MTG-093, TST-CMT-MTG-095, TST-CMT-MTG-131, TST-CMT-MTG-212, TST-CMT-MTG-215, TST-CMT-MTG-216, TST-CMT-MTG-222]
---

# Schedule a committee meeting and preserve its outcome

## Purpose

Governance staff arrange the committee’s gathering and retain its outcome. The meeting record connects the calendar to preparation, attendance and the later account of what happened.

## How It Works

A meeting manager supplies the title, type, start, finish and time zone, together with any location, video details, visibility and staff notes. Staff can save a draft or create a meeting already scheduled. Scheduling initiates the call to participants and requests a video room when configured. Staff can return a scheduled meeting to draft or mark it in progress when the gathering starts. Closing records the meeting as held and hands its final agenda and ordinarily frozen attendance to the minutes work. Cancellation records an unfinished meeting as cancelled, retains a supplied reason and queues cancellation of an existing video room. A rejected input leaves the meeting unchanged. Staff saves use the version they read so a concurrent change produces a refusal rather than a silent overwrite. Meeting details cannot be edited after the meeting ends; corrections to held-meeting attendance use the separate reopening process. A continuation reference can be set, replaced or cleared, with nonexistent and self references refused. The product should also require that continuation to be later and belong to the same committee. Dissolution stops active series and cancels later draft and scheduled gatherings while retaining the committee’s earlier record. Bulk-operation definitions reuse these persistence services, but the cited bulk-load journey skips execution and supplies no proof of a working import.

## Relationships

- Participant management supplies the roster snapshot and governs later attendance corrections.
- Notices and calendars communicate scheduling changes and cancellation.
- Minutes preparation uses the draft created when a meeting closes.
