---
id: DOM-CMT-MTG-001
title: Meeting
realises: CON-CMT-MTG-001
product_area: committees
module: meetings
revision: 3
status: draft
design_intent: proposed
implementation_evidence: inconsistent
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
owned_by: SVC-CMT-MTG-meetings
readable_by:
  - SVC-CMT-MTG-decisions
  - SVC-PFM-QRY-queries
lifecycle: STATE-CMT-MTG-001
custom_fields: none
identity: >-
  The meeting has a stable record identity independent of its title or start
  time. Series occurrences additionally use the series and local occurrence date
  as a unique pair. Participants are unique by meeting and contact; agenda items
  have separate identities and ordered sibling keys.
attributes:
  - name: committee
    kind: reference
    required: true
    computed: false
    notes: >-
      The owning committee reference is required and is not editable after
      insertion.
  - name: title
    kind: text
    required: true
    computed: false
    notes: The staff-facing name of the gathering.
  - name: kind
    kind: enum
    required: true
    computed: false
    notes: >-
      The meeting category is regular by default; special, annual, executive
      session, retreat and other are also declared.
  - name: start and end
    kind: date
    required: true
    computed: false
    notes: UTC instants for beginning and ending; ending must be later.
  - name: time zone
    kind: text
    required: true
    computed: false
    notes: >-
      The validated calendar zone determines the local date used to read the
      roster.
  - name: location
    kind: collection
    required: false
    computed: false
    notes: >-
      A structured place description; the public representation excludes its
      name and room.
  - name: video details
    kind: collection
    required: false
    computed: false
    notes: >-
      Manual joining details or provider room references, dial-in data and
      settlement outcome, filtered according to participation.
  - name: status
    kind: enum
    required: true
    computed: false
    notes: 'The gathering’s stage: draft, scheduled, in_progress, held or cancelled.'
  - name: agenda status
    kind: enum
    required: true
    computed: true
    notes: 'The preparation stage of the agenda: draft, published or final.'
  - name: visibility
    kind: enum
    required: true
    computed: false
    notes: 'The declared audience beyond staff: participants, members or public.'
  - name: continuation
    kind: reference
    required: false
    computed: false
    notes: >-
      An optional later meeting reference; the database refuses self-reference
      but does not make it unique.
  - name: series and occurrence
    kind: reference
    required: false
    computed: false
    notes: >-
      A series reference paired with its original local occurrence date; both
      are supplied together.
  - name: staff notes
    kind: text
    required: false
    computed: false
    notes: >-
      Internal text, including an appended cancellation reason, excluded from
      meeting portal and public representations but still used by calendar
      output.
  - name: quorum determination
    kind: collection
    required: false
    computed: true
    notes: >-
      The recorded quorum rule, counts, required number, result and
      determination time.
  - name: packet published
    kind: date
    required: false
    computed: true
    notes: 'The first packet release time, set through a one-time publication action.'
  - name: current minutes
    kind: reference
    required: false
    computed: true
    notes: The meeting’s pointer to the newest minutes revision.
  - name: reserved references
    kind: reference
    required: false
    computed: false
    notes: >-
      Unused references reserve document storage, recording and transcription
      links.
  - name: series · rule
    kind: text
    required: true
    computed: false
    notes: >-
      Recurrence text and calendar bounds, zone, duration of 1–1,440 minutes,
      default place and video, and active, paused or ended status.
  - name: participant
    kind: collection
    required: false
    computed: false
    notes: >-
      Contact and optional appointment, meeting role, voting standing,
      invitation response, attendance and presence times, proxy target, video
      attendance and notes.
  - name: reopening audit
    kind: collection
    required: false
    computed: true
    notes: >-
      Correction evidence appended when staff explicitly reopen held
      participants or attendance; deletion and update grants are declared but
      unverified here.
  - name: agenda item
    kind: collection
    required: false
    computed: false
    notes: >-
      Agenda tree nodes with title, kind, description, presenter, allotted time,
      item status, deferral and decision links; display position derives from
      sibling order.
  - name: packet material
    kind: collection
    required: false
    computed: false
    notes: >-
      A titled, ordered paper with audience and publication time, referencing
      exactly one managed asset or document.
  - name: notification ledger
    kind: collection
    required: false
    computed: true
    notes: >-
      Communication submission keys identify purpose, meeting, contact and
      occasion; skipped requests release their key.
  - name: video-room request
    kind: collection
    required: false
    computed: true
    notes: >-
      Durable provider work committed with the meeting change and later claimed
      by the jobs function.
  - name: calendar feed token
    kind: collection
    required: false
    computed: true
    notes: >-
      A personal feed credential represented in storage by its hash, with one
      unrevoked token per contact.
relationships:
  - to: DOM-CMT-MTG-002
    cardinality: one-to-many
    ownership: >-
      Minutes revisions belong to their meeting, and closing ensures an initial
      draft exists.
    cross_service: false
  - to: DOM-CMT-MTG-003
    cardinality: one-to-many
    ownership: >-
      Decisions own references to a meeting and optional agenda item; decision
      code writes the reverse item link.
    cross_service: false
  - to: DOM-CMT-MTG-001
    cardinality: many-to-one
    ownership: >-
      A meeting or deferred agenda item owns its outgoing meeting reference;
      several records can point to the same destination.
    cross_service: false
invariants:
  - id: INV-DOM-CMT-MTG-001-01
    statement: >-
      The service validates the time zone and requires end after start; the
      database declares the same ordering check for instants.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/meetings.table.ts:meetings_times_check;
      services/persistence/meetings.ts:requireTimes
  - id: INV-DOM-CMT-MTG-001-02
    statement: >-
      Staff lifecycle edits refuse held and cancelled meetings, while system
      settlement and minutes pointers can still update the stored row.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/lifecycle/meeting-lifecycle.ts:mayMoveMeeting;
      services/persistence/meetings.ts:rewriteMeetingDetails
  - id: INV-DOM-CMT-MTG-001-03
    statement: The database declares one meeting per series and occurrence date.
    enforced_at:
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/meetings.table.ts:meetings_series_occurrence_unique
  - id: INV-DOM-CMT-MTG-001-04
    statement: Meeting and series creation reject a dissolved committee.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meetings.ts:insertMeeting;
      services/persistence/meeting-series.ts:createSeries
  - id: INV-DOM-CMT-MTG-001-05
    statement: The database declares one participant per meeting and contact.
    enforced_at:
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/meeting-participants.table.ts:meeting_participants_contact_unique
  - id: INV-DOM-CMT-MTG-001-06
    statement: >-
      Proxy role and proxy target must appear together, and the service verifies
      that the represented appointment participates in that meeting.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/meeting-participants.table.ts:meeting_participants_proxy_check;
      services/persistence/meeting-participants.ts:checkProxy
  - id: INV-DOM-CMT-MTG-001-07
    statement: >-
      Held participant or attendance corrections require an explicit reopening
      action and append an audit; the declared append-only database protection
      remains unverified.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/minutes/close-rule.ts:participantEditDecision;
      db/meeting-reopen-audits.table.ts
  - id: INV-DOM-CMT-MTG-001-08
    statement: >-
      Ordinary agenda edits stop at final status or once the meeting is held or
      cancelled.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/lifecycle/meeting-lifecycle.ts:mayEditAgenda;
      agendaStatusAfter
  - id: INV-DOM-CMT-MTG-001-09
    statement: >-
      Agenda deletion refuses items referenced by notes, follow-ups, task links
      or decisions.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/agenda-items.ts:deleteAgendaItem
  - id: INV-DOM-CMT-MTG-001-10
    statement: >-
      A material has exactly one file reference, and packet publication is
      allowed once while the meeting has not ended.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/meeting-materials.table.ts:meeting_materials_one_file_check;
      services/lifecycle/meeting-lifecycle.ts:mayPublishPacket
  - id: INV-DOM-CMT-MTG-001-11
    statement: >-
      The notice ledger and submission path deduplicate each purpose, meeting,
      contact and occasion, except that skipped preparation releases its
      reservation.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/meeting-notifications.table.ts:meeting_notifications_key_unique;
      services/persistence/meeting-notifications.ts:notifyParticipants
  - id: INV-DOM-CMT-MTG-001-12
    statement: >-
      A contact has at most one unrevoked feed token and its plaintext
      credential is not stored.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/calendar-feed-tokens.table.ts:calendar_feed_tokens_live_unique;
      services/persistence/calendar-feeds.ts:issueFeedToken
physical:
  - committees.meetings
  - committees.meetings_versions
  - committees.meeting_series
  - committees.meeting_participants
  - committees.meeting_reopen_audits
  - committees.agenda_items
  - committees.meeting_materials
  - committees.meeting_notifications
  - committees.meeting_room_requests
  - committees.calendar_feed_tokens
  - committees.managed_assets (the file pipeline's lifecycle rows for materials)
  - committees.meeting_attendance_query (the attendance dataset's view)
evidence:
  - >-
    services-committees at 36129c24: modules/meetings/db/*.table.ts;
    services/lifecycle/meeting-lifecycle.ts; services/persistence/meetings.ts,
    meeting-series.ts, meeting-participants.ts, agenda-items.ts,
    meeting-materials.ts, meeting-notifications.ts, calendar-feeds.ts,
    committee-dissolutions.ts; services/participants/*.ts;
    services/participation/participation-rule.ts; services/portal/*.ts;
    lib/record-merge/committees-references.ts; aws/committees.metadata.ts
    (meetings and attendance datasets)
  - >-
    react-console at baf6dae3: app/(console)/console/[tenantId]/committees (no
    page hosts a meeting)
---
# Meeting

## What It Models

A meeting brings together the committee’s scheduled gathering, expected participants, recorded attendance, agenda and supporting papers. Recurring series are a facet of this object because their purpose is to produce those gatherings. Notice, room and calendar records support participation rather than define another business concept.

## Identity and Attributes

The record identity survives rescheduling. A recurring occurrence keeps its original local date even when its start changes. The logical attributes group related values; the table and request schemas remain the detailed field definitions.

## Relationships

Each meeting belongs to a committee whose appointments and settings it reads. Its minutes form a revision sequence, and decisions reference the meeting and the agenda item where the motion arose. Continuation and deferral links are optional outgoing references rather than exclusive pairings.

## Invariants

Staff actions use the meeting lifecycle and record lock. Uniqueness constrains occurrence and participant duplication. Reopening explicitly permits held attendance corrections, while event, notice and provider work is committed alongside the business change.

## How It Is Stored and Shared

The meetings service owns the records and reads CRM addresses through the shared database access contract. Decision code also writes agenda decision links and quorum information inside the shared macroservice. Queries exposes meeting and attendance datasets. Managed file content uses Platform assets, and this concept declares no custom fields.

## Open Design Questions

Product’s decisions on draft series timing, live roster membership, proxy defaults and suppressed e-mail differ from the built paths. Calendar descriptions can disclose staff notes. Video registrant and attendance paths have no production delivery, and database append-only enforcement needs its migration evidence.
