---
id: DOM-CMT-MTG-002
title: Minutes
realises: CON-CMT-MTG-002
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-004
custom_fields: none
identity: >-
  Each revision has its own record identity and a number unique within its
  meeting. Initial minutes use revision one; a correction allocates the
  following revision and becomes the meeting’s current pointer.
attributes:
  - name: meeting
    kind: reference
    required: true
    computed: false
    notes: >-
      The parent gathering; initial drafting requires a meeting in progress or
      held.
  - name: revision
    kind: number
    required: true
    computed: false
    notes: >-
      The minutes revision number, starting at one and incremented for
      approved-record corrections.
  - name: body
    kind: reference
    required: false
    computed: false
    notes: >-
      Markdown content stored through the managed asset pipeline, limited to
      2,000,000 bytes; a document reference is reserved but unused, and at most
      one body reference is allowed.
  - name: fingerprint
    kind: text
    required: false
    computed: true
    notes: >-
      A SHA-256 fingerprint of the saved UTF-8 body; it exists exactly when the
      revision has a body reference.
  - name: status
    kind: enum
    required: true
    computed: false
    notes: 'The revision stage: draft, circulated, approved or amended.'
  - name: drafted by
    kind: enum
    required: true
    computed: false
    notes: >-
      The declared author category is user or ai; production saves select user
      and clear the unused AI draft reference.
  - name: circulated at
    kind: date
    required: false
    computed: false
    notes: 'The review-release instant, removed when circulated text returns to draft.'
  - name: approval
    kind: collection
    required: false
    computed: false
    notes: >-
      Approval time and either decision authority or the authorized direct
      caller.
  - name: supersedes
    kind: reference
    required: false
    computed: false
    notes: >-
      An optional reference to the approved revision replaced by this
      correction.
  - name: item note
    kind: collection
    required: false
    computed: false
    notes: >-
      Append-only application notes for agenda items, recording the author and
      time.
  - name: action item
    kind: collection
    required: false
    computed: false
    notes: >-
      A suggested follow-up with title, text, contact, due date and origin,
      followed to acceptance or dismissal and any placeholder task link.
  - name: task link
    kind: collection
    required: false
    computed: false
    notes: >-
      A retained integration reference with no CRM task identity while task
      creation remains unavailable.
relationships:
  - to: DOM-CMT-MTG-001
    cardinality: many-to-one
    ownership: The meeting owns the sequence of revisions and points at its latest one.
    cross_service: false
  - to: DOM-CMT-MTG-003
    cardinality: one-to-many
    ownership: >-
      Approval decisions own their outgoing minutes reference and approval code
      updates that revision when a decision carries.
    cross_service: false
  - to: DOM-CMT-MTG-002
    cardinality: many-to-one
    ownership: >-
      A correction owns its predecessor reference; the declaration does not
      establish a unique successor per predecessor.
    cross_service: false
invariants:
  - id: INV-DOM-CMT-MTG-002-01
    statement: >-
      Initial minutes drafting requires an in-progress or held meeting; closing
      creates missing minutes, though a later cancellation can leave an existing
      draft.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/minutes/minutes-rule.ts:mayDraftMinutesOf;
      services/persistence/meetings.ts:closeMeeting
  - id: INV-DOM-CMT-MTG-002-02
    statement: >-
      The database declares unique meeting revision numbers at least one, and
      creation and correction allocate the sequence.
    enforced_at:
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/minutes.table.ts:minutes_meeting_version_unique
  - id: INV-DOM-CMT-MTG-002-03
    statement: >-
      The service hashes the stored body bytes, and the database declares that a
      body reference and hash are present together.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/minutes.table.ts:minutes_body_hash_check;
      services/minutes/minutes-rule.ts:bodyHashOf
  - id: INV-DOM-CMT-MTG-002-04
    statement: >-
      Only draft bodies are edited; circulation requires held status, a body and
      a circulation timestamp.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/minutes/minutes-rule.ts:circulationRefusal;
      db/minutes.table.ts:minutes_circulated_check
  - id: INV-DOM-CMT-MTG-002-05
    statement: >-
      Approval records time, hash and an approving decision or person; the
      declared approved-record freeze still needs migration verification.
    enforced_at:
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/minutes.table.ts:minutes_approved_check;
      modules/decisions/services/rules/decision-rules.ts:minutesFrozen
  - id: INV-DOM-CMT-MTG-002-06
    statement: Deterministic assembly excludes executive-session note text.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/minutes/minutes-rule.ts:itemSection
  - id: INV-DOM-CMT-MTG-002-07
    statement: >-
      Item-note insertion checks a scheduled, in-progress or held meeting, and
      no application note-edit operation exists.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/meetings/services/persistence/meeting-item-notes.ts:mayRecordNotes
  - id: INV-DOM-CMT-MTG-002-08
    statement: >-
      Acceptance decides a proposed follow-up once and writes one task link;
      only an accepted item may hold a task reference.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/meetings/db/proposed-action-items.table.ts:proposed_action_items_accepted_check;
      services/persistence/proposed-action-items.ts:lockProposed
  - id: INV-DOM-CMT-MTG-002-09
    statement: >-
      The minutes table declares version history with the author for each stored
      change.
    enforced_at:
      - database
    provenance: observed
    source: 'services-committees:modules/meetings/db/minutes.table.ts:minutesVersions'
physical:
  - committees.minutes
  - committees.minutes_versions
  - committees.meeting_item_notes
  - committees.proposed_action_items
  - committees.meeting_task_links
  - >-
    committees.managed_assets (the file pipeline's lifecycle rows for minutes
    bodies)
evidence:
  - >-
    services-committees at 36129c24: modules/meetings/db/minutes.table.ts,
    meeting-item-notes.table.ts, proposed-action-items.table.ts,
    meeting-task-links.table.ts; services/minutes/*.ts;
    services/persistence/minutes.ts, meeting-item-notes.ts,
    proposed-action-items.ts; services/attention/minutes-awaiting-approval.ts;
    ports/task-creator.ts;
    modules/decisions/services/minutes/minutes-approval.ts;
    modules/decisions/services/persistence/minutes-approvals.ts
---
# Minutes

## What It Models

Minutes are the written record prepared from a gathering and eventually approved as its official account. The object includes working item notes and suggested follow-ups because they feed that record. A correction preserves the earlier approved body and creates another revision.

## Identity and Attributes

The revision identity distinguishes an approved account from its replacement draft. Stored content is a managed file reference plus a byte fingerprint. Production assembly uses agenda order, attendance and notes without inference.

## Relationships

A meeting owns its revisions and tracks the newest. An approval decision points at a particular revision, while a correction points at the account it supersedes. Follow-ups retain a task integration link without owning the future CRM task.

## Invariants

Body editing, circulation and approval each have their own guards. Circulated text returns to draft before editing. Accepted and dismissed follow-ups are final application decisions, and confidential session notes are excluded from assembly.

## How It Is Stored and Shared

The meetings service owns minutes, notes and follow-ups. The decisions service writes approval and correction in the shared database boundary. Platform stores bodies, and Queries reads minutes and action-item datasets. Minutes do not declare custom fields.

## Open Design Questions

Product must settle direct approval authority and evidence requirements. Task creation is still a placeholder. Database immutability declarations and the visible attendance correction history require stronger evidence before preparation treats them as guaranteed.
