---
id: STATE-CMT-MTG-001
title: Meeting Status
object: DOM-CMT-MTG-001
product_area: committees
module: meetings
revision: 2
status: draft
design_intent: proposed
implementation_evidence: inconsistent
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
states:
  - name: draft
    meaning: >-
      A planned gathering that has not been called and is omitted from member
      and public reads.
  - name: scheduled
    meaning: >-
      A called gathering for which participant notices and any requested room
      work are prepared.
  - name: in_progress
    meaning: The gathering is under way and its agenda has become final.
  - name: held
    meaning: >-
      The gathering is recorded as completed, with an initial minutes revision
      if needed.
  - name: cancelled
    meaning: The gathering will not proceed; calendar output represents cancellation.
transitions:
  - from: draft
    to: scheduled
    trigger: >-
      Staff call a draft or create it called; materialization also creates
      called occurrences.
    guard: >-
      The staff version matches where supplied, times and zone are valid, and
      creation checks an undissolved committee.
    side_effects:
      - >-
        Record the first scheduled event or a later updated event, prepare
        non-declined participant notices keyed by start, and enqueue a requested
        missing room.
    who: Meeting staff or series processing
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:rewriteMeetingDetails;
      called
  - from: scheduled
    to: scheduled
    trigger: Staff or a series edit changes a called meeting’s time.
    guard: The supplied version matches and the resulting times and zone are valid.
    side_effects:
      - >-
        Record the updated event, prepare notices for the start occasion and
        enqueue an update for an existing room.
    who: Meeting staff or series processing
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:rewriteMeetingDetails
      (moved)
  - from: scheduled
    to: draft
    trigger: Staff return a called meeting to planning.
    guard: The expected meeting version matches.
    side_effects:
      - Retain video details and send no withdrawal notice.
    who: Staff holding meeting management permission
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/lifecycle/meeting-lifecycle.ts:NEXT
  - from: scheduled
    to: in_progress
    trigger: Staff record that the meeting has begun.
    guard: The expected meeting version matches.
    side_effects:
      - >-
        Finalize the agenda, record the updated event and enqueue any
        still-requested room.
    who: Staff holding meeting management permission
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:rewriteMeetingDetails;
      services/lifecycle/meeting-lifecycle.ts:agendaStatusAfter
  - from: scheduled
    to: held
    trigger: Staff close a called meeting without a recorded start.
    guard: The expected meeting version matches.
    side_effects:
      - >-
        Finalize the agenda, protect participants through the reopening rule,
        create missing draft minutes and record the close event.
    who: Staff holding meeting management permission
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:closeMeeting
  - from: in_progress
    to: held
    trigger: Staff close the meeting already under way.
    guard: The expected meeting version matches.
    side_effects:
      - >-
        Finalize the agenda, require audited participant corrections, create
        missing draft minutes and record the close event.
    who: Staff holding meeting management permission
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:closeMeeting
  - from: draft
    to: cancelled
    trigger: >-
      Staff cancel a draft, its series removes the date, or dissolution cancels
      a later occurrence.
    guard: >-
      Staff cancellation compares the supplied version; automatic cancellation
      runs under the record lock.
    side_effects:
      - >-
        Append any reason and record cancellation without a participant notice;
        enqueue cancellation if a room reference exists.
    who: >-
      Meeting manager, the series materialisation, or the committee's
      dissolution
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:cancelMeetingIn
  - from: scheduled
    to: cancelled
    trigger: 'Staff, a series rewrite or committee dissolution cancels a called meeting.'
    guard: >-
      Staff cancellation compares the supplied version; automatic cancellation
      uses the locked record.
    side_effects:
      - >-
        Append the reason, record cancellation and enqueue room cancellation
        when needed; notify participants unless dissolution suppresses notices.
    who: >-
      Meeting manager, the series materialisation, or the committee's
      dissolution
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:cancelMeetingIn;
      services/persistence/committee-dissolutions.ts:cancelMeetingsAfterDissolution
  - from: in_progress
    to: cancelled
    trigger: Staff cancel the meeting while it is under way.
    guard: The expected meeting version matches.
    side_effects:
      - >-
        Append the reason, record cancellation, notify participants and enqueue
        cancellation of an existing room.
    who: Staff holding meeting management permission
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/lifecycle/meeting-lifecycle.ts:NEXT
invalid:
  - from: held
    to: cancelled
    why: A completed gathering cannot be changed to one that never took place.
  - from: cancelled
    to: scheduled
    why: >-
      Cancellation is terminal for staff lifecycle actions; schedule a separate
      meeting.
  - from: draft
    to: in_progress
    why: Staff must call the meeting before recording its start.
  - from: draft
    to: held
    why: A draft cannot use the close operation until called.
  - from: in_progress
    to: scheduled
    why: The started gathering cannot return to its pre-start status.
concurrency: >-
  Record locks serialize meeting writers and explicit staff writes compare
  versions. Automatic series and dissolution writes can invalidate a previously
  read staff version. Events and durable notice or room work share the write
  transaction.
invariants:
  - INV-DOM-CMT-MTG-001-02
  - INV-DOM-CMT-MTG-001-07
  - INV-DOM-CMT-MTG-001-08
evidence:
  - >-
    services-committees at 36129c24:
    modules/meetings/services/lifecycle/meeting-lifecycle.ts;
    services/persistence/meetings.ts, meeting-series.ts,
    committee-dissolutions.ts; services/minutes/close-rule.ts;
    tests/integration/services/meetings.integration.spec.ts
---
# Meeting Status

## The Lifecycle

```mermaid
stateDiagram-v2
  [*] --> draft
  draft --> scheduled
  scheduled --> scheduled
  scheduled --> draft
  scheduled --> in_progress
  scheduled --> held
  in_progress --> held
  draft --> cancelled
  scheduled --> cancelled
  in_progress --> cancelled
```

draft: A planned gathering that has not been called and is omitted from member and public reads.

scheduled: A called gathering for which participant notices and any requested room work are prepared.

in_progress: The gathering is under way and its agenda has become final.

held: The gathering is recorded as completed, with an initial minutes revision if needed.

cancelled: The gathering will not proceed; calendar output represents cancellation.

## Transitions Explained

Staff call a draft or create it called; materialization also creates called occurrences. The staff version matches where supplied, times and zone are valid, and creation checks an undissolved committee. Record the first scheduled event or a later updated event, prepare non-declined participant notices keyed by start, and enqueue a requested missing room.

Staff or a series edit changes a called meeting’s time. The supplied version matches and the resulting times and zone are valid. Record the updated event, prepare notices for the start occasion and enqueue an update for an existing room.

Staff return a called meeting to planning. The expected meeting version matches. Retain video details and send no withdrawal notice.

Staff record that the meeting has begun. The expected meeting version matches. Finalize the agenda, record the updated event and enqueue any still-requested room.

Staff close a called meeting without a recorded start. The expected meeting version matches. Finalize the agenda, protect participants through the reopening rule, create missing draft minutes and record the close event.

Staff close the meeting already under way. The expected meeting version matches. Finalize the agenda, require audited participant corrections, create missing draft minutes and record the close event.

Staff cancel a draft, its series removes the date, or dissolution cancels a later occurrence. Staff cancellation compares the supplied version; automatic cancellation runs under the record lock. Append any reason and record cancellation without a participant notice; enqueue cancellation if a room reference exists.

Staff, a series rewrite or committee dissolution cancels a called meeting. Staff cancellation compares the supplied version; automatic cancellation uses the locked record. Append the reason, record cancellation and enqueue room cancellation when needed; notify participants unless dissolution suppresses notices.

Staff cancel the meeting while it is under way. The expected meeting version matches. Append the reason, record cancellation, notify participants and enqueue cancellation of an existing room.

## What Cannot Happen

A completed gathering cannot be changed to one that never took place. Cancellation is terminal for staff lifecycle actions; schedule a separate meeting. Staff must call the meeting before recording its start. A draft cannot use the close operation until called. The started gathering cannot return to its pre-start status. Staff details stop changing at held or cancelled. System room settlement and current-minutes references can still update the row, so terminal status does not mean every column is immutable. Series timing, roster refresh and e-mail suppression still differ from recorded product decisions.

## Concurrency and Timing

Record locks serialize meeting writers and explicit staff writes compare versions. Automatic series and dissolution writes can invalidate a previously read staff version. Events and durable notice or room work share the write transaction.
