---
id: SVC-CMT-MTG-meetings
title: Meeting and Minutes Service
product_area: committees
module: meetings
repository: services-committees
source_module: modules/meetings
revision: 1
status: draft
design_intent: proposed
implementation_evidence: inconsistent
inference: []
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
owns:
  - DOM-CMT-MTG-001
  - DOM-CMT-MTG-002
does_not_own:
  - >-
    The committee module owns the committee, configuration, seats, appointments
    and roster facts that meeting work reads.
  - >-
    The decisions service owns motions and implements the quorum, approval and
    correction code called by meeting routes.
  - >-
    CRM owns people and e-mail addresses and the future shared tasks for
    accepted follow-ups.
  - >-
    Platform owns delivery, managed file storage and video integration; this
    service records their business inputs.
  - >-
    Platform owns attention delivery; the minutes condition is declared here but
    withheld.
  - >-
    Queries owns dataset execution and exports, and the Data Job Engine executes
    declared bulk operations.
operations:
  - operation_id: getMeetingsHealth
    intent: Answer a public availability probe for the meetings API.
    access: public
    permission: >-
      none: the shared health route (the operation name follows the
      get<Module>Health pattern of the route library)
    realises: []
    published_to_submissions: 'not published: availability monitoring is outside submitted-data intake.'
  - operation_id: listCommitteeMeetings
    intent: >-
      Browse the selected committee’s meetings in descending start order with
      keyset paging.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-001
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: createMeeting
    intent: >-
      Create a dated draft or scheduled gathering and copy its initial
      participants from the roster for that date.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-001
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: getMeeting
    intent: Retrieve the meeting record identified by the request.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-001
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: updateMeeting
    intent: >-
      Edit supplied meeting details at the read version and apply an allowed
      draft, scheduled or in-progress move.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-001
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: listMeetingParticipants
    intent: >-
      Retrieve the expected people with invitation responses and recorded
      attendance.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-003
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: addMeetingParticipant
    intent: >-
      Insert a guest, appointment participant or proxy; held records require
      explicit audited reopening.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-003
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: updateMeetingParticipant
    intent: >-
      Edit one participant at its read version, requiring audited reopening for
      held participation.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-003
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: recordMeetingAttendance
    intent: >-
      Save attendance entries for multiple participants, with reopening required
      for a held meeting.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-003
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: getMeetingAgenda
    intent: Retrieve the agenda tree in its displayed order.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-004
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: replaceMeetingAgendaOrder
    intent: Save a complete agenda ordering at the meeting’s expected version.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-004
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: addAgendaItem
    intent: Insert an ordered agenda node beneath its optional parent.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-004
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: updateAgendaItem
    intent: Edit the supplied details of an agenda node at its expected version.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-004
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: deleteAgendaItem
    intent: >-
      Remove an editable agenda node only when protected references do not
      require its retention.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-004
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: deferAgendaItem
    intent: >-
      Copy business to a later meeting of the committee and retain the original
      item’s deferral reference.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-004
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: listMeetingMaterials
    intent: Retrieve packet paper references for the meeting and its agenda items.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-005
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: addMeetingMaterial
    intent: Attach a prepared managed asset or document reference as a meeting paper.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-005
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: deleteMeetingMaterial
    intent: Remove a paper reference and detach its managed asset in the same write.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-005
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: publishMeetingAgenda
    intent: Release the draft agenda and prepare its participant notice occasion.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-004
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: publishMeetingPacket
    intent: Release unreleased packet papers once and prepare participant notices.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-005
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: closeMeeting
    intent: >-
      Record a called or in-progress meeting as held and ensure an initial
      minutes draft exists.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-001
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: cancelMeeting
    intent: >-
      Withdraw a meeting that has not ended and record its cancellation reason
      and delivery work.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-001
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: getMeetingCalendar
    intent: >-
      Download one meeting’s iCalendar representation, including its
      cancellation state.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-006
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: getMeetingMinutes
    intent: Read the current minutes revision and available body.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-007
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: saveMeetingMinutes
    intent: >-
      Store edited draft Markdown through asset preparation and fingerprint its
      bytes.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-007
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: assembleMeetingMinutes
    intent: >-
      Replace draft text with deterministic assembly from agenda, attendance and
      permitted item notes.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-007
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: circulateMeetingMinutes
    intent: >-
      Release a held meeting’s draft body for review and prepare circulation
      notices.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-007
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: revertMeetingMinutes
    intent: >-
      Return circulated minutes to editable draft and clear the circulation
      time.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-007
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: listMeetingItemNotes
    intent: Read recorded notes for agenda items.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-007
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: addMeetingItemNote
    intent: Append an authored note to an agenda item in an allowed meeting state.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-007
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: listMeetingActionItems
    intent: 'Browse the meeting’s proposed, accepted and dismissed follow-ups.'
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-009
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: proposeMeetingActionItem
    intent: >-
      Record a suggested follow-up with its origin, assignee reference and due
      date.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-009
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: acceptMeetingActionItem
    intent: >-
      Accept a proposed follow-up and create its placeholder task link without
      creating a CRM task.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-009
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: dismissMeetingActionItem
    intent: Retain a proposed follow-up as dismissed at its expected version.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-009
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: determineMeetingQuorum
    intent: Store the committee rule’s calculated meeting quorum determination.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-011
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: approveMeetingMinutes
    intent: >-
      Approve directly under a no-vote rule or create the rule-selected approval
      decision, leaving asynchronous voting open.
    access: console
    permission: committees.minutes.manage
    realises:
      - CAP-CMT-MTG-008
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: correctMeetingMinutes
    intent: >-
      Create the next empty draft revision that supersedes the current approved
      minutes.
    access: console
    permission: committees.minutes.manage
    realises:
      - CAP-CMT-MTG-008
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: listCommitteeSeries
    intent: Browse the selected committee’s recurring meeting series.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-002
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: createMeetingSeries
    intent: >-
      Save a validated recurring timetable and then materialize its occurrence
      window.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-002
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: getMeetingSeries
    intent: Retrieve the recurring timetable record.
    access: console
    permission: committees.meetings.read
    realises:
      - CAP-CMT-MTG-002
    published_to_submissions: 'not published: this read has no submitted-data input contract.'
  - operation_id: updateMeetingSeries
    intent: >-
      Save supplied series fields at its expected version, then rewrite and
      materialize future occurrences.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-002
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: materializeMeetingSeries
    intent: >-
      Run the selected series’s occurrence expansion now and report created or
      changed dates.
    access: console
    permission: committees.meetings.manage
    realises:
      - CAP-CMT-MTG-002
    published_to_submissions: >-
      not published: this staff action uses the direct governance or recruitment
      API; the publication boundary remains proposed.
  - operation_id: listMyMeetings
    intent: >-
      List gatherings related to the signed-in contact through committee or
      meeting participation.
    access: portal
    permission: committees.portal.participate
    realises:
      - CAP-CMT-MTG-020
    published_to_submissions: >-
      not published: the current member action uses direct authorization; an
      approved exemption from operation publication is unestablished.
  - operation_id: getPortalMeeting
    intent: >-
      Return the member-filtered meeting projection with permitted agenda,
      papers and participants.
    access: portal
    permission: committees.portal.participate
    realises:
      - CAP-CMT-MTG-020
    published_to_submissions: >-
      not published: the current member action uses direct authorization; an
      approved exemption from operation publication is unestablished.
  - operation_id: answerMeetingInvitation
    intent: Record the signed-in participant’s invitation answer.
    access: portal
    permission: committees.portal.participate
    realises:
      - CAP-CMT-MTG-020
    published_to_submissions: >-
      not published: the current member action uses direct authorization; an
      approved exemption from operation publication is unestablished.
  - operation_id: getPortalMeetingMinutes
    intent: >-
      Read circulated or approved minutes under the implemented member
      visibility rules.
    access: portal
    permission: committees.portal.participate
    realises:
      - CAP-CMT-MTG-020
    published_to_submissions: >-
      not published: the current member action uses direct authorization; an
      approved exemption from operation publication is unestablished.
  - operation_id: issueCalendarFeedToken
    intent: >-
      Rotate the signed-in contact’s calendar-feed credential while storing only
      its fingerprint.
    access: portal
    permission: committees.portal.calendar
    realises:
      - CAP-CMT-MTG-006
    published_to_submissions: >-
      not published: the current member action uses direct authorization; an
      approved exemption from operation publication is unestablished.
  - operation_id: getPersonalCalendarFeed
    intent: Return calendar entries authorized by the presented personal-feed token.
    access: public
    permission: 'none: the feed token in the query is the credential'
    realises:
      - CAP-CMT-MTG-006
    published_to_submissions: >-
      not published: this endpoint only reads a public projection or a
      token-authorized calendar.
  - operation_id: getDirectoryMeeting
    intent: Return the filtered representation of a publicly visible meeting.
    access: public
    permission: 'none: public meetings only'
    realises:
      - CAP-CMT-MTG-020
    published_to_submissions: >-
      not published: this endpoint only reads a public projection or a
      token-authorized calendar.
events:
  - name: committees.meeting.scheduled
    direction: produced
    when: The gathering first becomes scheduled.
    payload_summary: >-
      Meeting and committee references, optional series, title, category,
      status, start and end instants, calendar zone and filtered video
      references.
  - name: committees.meeting.updated
    direction: produced
    when: >-
      A scheduled or in-progress record is edited or the gathering is called
      again.
    payload_summary: >-
      Meeting and committee references, optional series, title, category,
      status, start and end instants, calendar zone and filtered video
      references.
  - name: committees.meeting.cancelled
    direction: produced
    when: 'Staff, series processing or dissolution records cancellation.'
    payload_summary: >-
      Meeting and committee references, optional series, title, category,
      status, start and end instants, calendar zone and filtered video
      references.
  - name: committees.meeting.agenda_published
    direction: produced
    when: Staff release the draft agenda.
    payload_summary: >-
      Meeting and committee references, optional series, title, category,
      status, start and end instants, calendar zone and filtered video
      references.
  - name: committees.meeting.packet_published
    direction: produced
    when: Staff release the packet once.
    payload_summary: >-
      Meeting and committee references, optional series, title, category,
      status, start and end instants, calendar zone and filtered video
      references.
  - name: committees.meeting.closed
    direction: produced
    when: Staff record the gathering as held.
    payload_summary: >-
      Meeting and committee references, optional series, title, category,
      status, start and end instants, calendar zone and filtered video
      references.
  - name: committees.minutes.circulated
    direction: produced
    when: Staff release a draft revision for participant review.
    payload_summary: >-
      Revision and parent references, revision number and status, body
      fingerprint and circulation instant.
  - name: committees.minutes.approved
    direction: produced
    when: >-
      A direct authorization or carried approval records the revision as
      approved.
    payload_summary: >-
      Revision and parent references, revision number, body fingerprint,
      approval instant, approving decision and predecessor revision reference.
  - name: events.attendance.joined and events.attendance.left
    direction: consumed
    when: >-
      A video provider would report participant joining or leaving, but no
      production entry delivers it.
    payload_summary: Provider room and registrant references with the attendance event time.
jobs:
  - >-
    The committees_meetings_jobs daily invocation at 06:41 UTC materializes
    active series, attempts due reminders and drains room work for each active
    workspace.
  - >-
    The committees_meetings_jobs hourly invocation at minute 11 attempts
    reminders and drains room work.
  - >-
    The committees_business_events_dispatcher runs every minute and on wake-up;
    committees_business_events_consumer handles its queued subscriber
    deliveries.
  - >-
    The committees_event_intake receiver routes the native appointment-started
    subscriber that fills recruitment openings.
  - >-
    The committees_asset_cleanup sweep runs every fifteen minutes and its
    consumer retires unreferenced managed content.
  - >-
    Meeting and series insert/upsert data operations call the same services from
    the Data Job Engine.
integrations:
  - system: Platform communications
    direction: outbound
    contract: >-
      Preparation verifies a configured communications bucket and submission
      grant, resolves the CRM address and writes a durable queue pointer with a
      stable key; only skipped reminders have recurring preparation retries.
  - system: Integration Platform video rooms
    direction: outbound
    contract: >-
      Room create, update and cancel requests leave the database through the
      outbox. The gateway flag defaults off, yielding provider unavailable;
      update keys distinguish meeting versions.
  - system: Platform file pipeline
    direction: outbound
    contract: >-
      Assets are prepared outside the record write, attached with it and
      detached or retired through the shared lifecycle after removal.
  - system: CRM contact e-mail addresses
    direction: inbound
    contract: >-
      The shared table read selects the first nonblank contact address by
      ascending position.
  - system: CRM tasks
    direction: outbound
    contract: >-
      The task port is unavailable and accepted items retain a task-link
      placeholder.
  - system: Platform Queries
    direction: outbound
    contract: >-
      Meeting, attendance, minutes and action-item datasets use the meeting read
      permission.
  - system: Platform attention
    direction: outbound
    contract: >-
      The minutes-awaiting-approval definition is intentionally withheld from
      registration, publication and sweeping.
consistency:
  - rule: >-
      A meeting change and its durable event, notice ledger, communication
      pointer and room work share the locked database write.
    kind: transactional
    compensation: >-
      Rollback removes the database changes; prepared outside objects are not
      part of that atomicity.
  - rule: >-
      Subscriber delivery, communication dispatch and room invocation follow the
      business commit.
    kind: eventual
    compensation: >-
      Dispatch and pending room calls retry; skipped notice preparation releases
      its key but only reminders are scheduled again.
  - rule: >-
      Held participant and attendance edits require reopening and append
      correction evidence in their write.
    kind: transactional
    compensation: >-
      The application has no compensation action; declared append-only database
      grants still need verification.
  - rule: >-
      File preparation precedes record attachment, and replacement detaches its
      predecessor with the reference write.
    kind: eventual
    compensation: >-
      The shared asset lifecycle handles permanent objects left unattached and
      detached files awaiting retirement.
  - rule: >-
      Dissolution ends eligible series and cancels later editable meetings in
      its enclosing transaction.
    kind: transactional
    compensation: A failed step rolls the dissolution back.
evidence:
  - >-
    services-committees at 36129c24:
    modules/meetings/aws/api/meetings.routes.ts, meetings.schemas.ts;
    aws/logic/meetings-functions.lambda.ts; aws/lambda/*.ts; services/**;
    ports/**; db/**
  - >-
    services-committees at 36129c24: aws/committees.service.ts (meetings,
    minutes and portal permissions), aws/committees.communications.ts,
    aws/committees.events.ts, aws/committees.metadata.ts
  - 'react-console at baf6dae3: no console or portal page calls these operations'
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-TEN-004
  - 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-DAT-004
  - TC-DAT-007
  - TC-LOG-001
  - TC-LOG-002
  - TC-LOG-003
  - TC-LOG-004
  - TC-LOG-005
  - TC-AVL-002
  - TC-AVL-003
  - TC-AVL-004
  - TC-AVL-005
  - TC-MON-001
  - TC-MON-002
  - TC-MON-003
  - 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
---
# Meeting and Minutes Service

## What This Service Is For

This service holds a committee’s scheduled gatherings and written accounts: recurring timetables, attendance, agendas, papers, notes, minutes and suggested follow-ups. It exposes staff administration, member participation and calendar operations, plus a filtered public meeting read. It performs no inference.

## Boundary

Meeting and minutes concepts have one logical owner here. The committee module supplies roster and settings facts, while decision code implements quorum and approval behind three meeting-addressed routes. The event dispatcher and asset cleanup hosted in this stack also serve the shared macroservice boundary.

## Operations in Words

Staff schedule and close gatherings, maintain attendance, release agendas and packets and take drafts through circulation. Minutes approval follows the decision rule, and correction creates a new revision. Accepted follow-ups stop at a meeting record and task placeholder. Member operations answer invitations and expose authorized projections or calendar feeds; they do not establish built member screens.

## Events and Jobs

Meeting lifecycle changes, circulated minutes and approvals record durable business events. Daily and hourly meeting jobs materialize series and attempt reminders and room work. Shared queue handlers dispatch business events and retire assets. Video attendance code exists without its production delivery entry point.

## Consistency Guarantees

Explicit writes use record locks and supplied versions. Database changes and durable delivery work commit together, while actual delivery and file preparation have separate failure boundaries. Product’s selected e-mail and endpoint suppression switches are still missing; database grant and trigger protections have not been independently certified.
