---
id: ATS-CMT-MTG-003
scope: CAP-CMT-MTG-003
product_area: committees
module: meetings
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CMT-MTG-003-01
    title: Creation records the date-specific roster roles
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-01
    preconditions: 'A committee has a chair, four directors, an adviser and a liaison.'
    steps: Save a meeting and retrieve its participants.
    expected: >-
      Seven participants appear with the chair and director voting flags and the adviser and liaison
      roles from the roster.
    negative: false
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/unit/services/snapshot-and-participation.spec.ts#makes
        a seat-holder in a chair position the chair
      - >-
        services-committees:modules/meetings/tests/unit/services/snapshot-and-participation.spec.ts#names
        advisers, liaisons and secretaries by their kind, and observers and guests as guests
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#snapshots
        the committee’s current appointments on the meeting’s date, each a voting member
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0210.spec.ts#CMT-ACC-0210
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/unit/services/snapshot-and-participation.spec.ts#makes
      a seat-holder in a chair position the chair
  - id: ATS-CMT-MTG-003-02
    title: Multiple roster seats produce one participant
    level: unit
    proves:
      - BR-CAP-CMT-MTG-003-02
    preconditions: One contact has chair and director entries; another has voting and non-voting entries.
    steps: Build the participant snapshot.
    expected: 'Each contact appears once, using the chair entry or, absent a chair entry, the voting entry.'
    negative: false
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/unit/services/snapshot-and-participation.spec.ts#keeps
        a contact with two seats once, by the chair seat
      - >-
        services-committees:modules/meetings/tests/unit/services/snapshot-and-participation.spec.ts#keeps
        a contact with a voting and a non-voting seat once, by the voting one
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/unit/services/snapshot-and-participation.spec.ts#keeps
      a contact with two seats once, by the chair seat
  - id: ATS-CMT-MTG-003-03
    title: The roster remains current before the call to order
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-03
    preconditions: A meeting exists before a new director joins and another director leaves.
    steps: Retrieve participants before calling the meeting to order.
    expected: 'The roster changes appear while manually added guests, proxies and corrections remain.'
    negative: false
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to: []
    provenance: proposed
    source: 'services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#D4'
  - id: ATS-CMT-MTG-003-04
    title: Manual additions preserve contact uniqueness
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-04
    preconditions: A meeting is scheduled and a director was appointed after its creation.
    steps: 'Add a guest, add the late appointee, and add the same guest again.'
    expected: The first additions succeed with the selected roles; the duplicate returns participant_exists.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#adds
        a guest with no appointment, non-voting
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0222.spec.ts#CMT-ACC-0222
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#adds
      a guest with no appointment, non-voting
  - id: ATS-CMT-MTG-003-05
    title: A proxy cannot represent an unlisted appointment
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-05
    preconditions: A committee has no rule document and its meeting has participants.
    steps: Add a proxy naming an appointment outside the meeting’s participant list.
    expected: The request is rejected without adding a participant.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#refuses
        a proxy for an appointment that is not at the meeting
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#refuses
      a proxy for an appointment that is not at the meeting
  - id: ATS-CMT-MTG-003-06
    title: Proxy policy distinguishes absent rules from an explicit prohibition
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-06
    preconditions: One committee has no rules; another explicitly forbids proxies.
    steps: Add a proxy for an appointment represented at each meeting.
    expected: The rule-less committee accepts the proxy; the other returns proxies_forbidden.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#adds
        a proxy for an appointment of the meeting when the committee has no rules
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#refuses
        a proxy when the committee’s rules forbid proxies
      - >-
        services-committees:modules/meetings/tests/unit/services/snapshot-and-participation.spec.ts#allows
        proxies when the committee has no rules document
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0223.spec.ts#CMT-ACC-0223
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#adds
      a proxy for an appointment of the meeting when the committee has no rules
  - id: ATS-CMT-MTG-003-07
    title: Proxy representation preserves the holder’s own presence
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-07
    preconditions: A committee explicitly allows proxies and a present director represents an absent member.
    steps: >-
      Record the representation, inspect attendance and attempt another proxy for that absent
      member.
    expected: >-
      The holder retains their own attendance and role, representation is visible on the absent
      member, and duplicate representation is refused.
    negative: false
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to: []
    provenance: proposed
    source: 'services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#D5'
  - id: ATS-CMT-MTG-003-08
    title: Attendance batches validate before committing a complete result
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-08
      - BR-CAP-CMT-MTG-003-09
    preconditions: A meeting has recorded participants and an initial attendance state.
    steps: >-
      Submit valid attendance; then submit duplicate identities, reversed presence times and a
      participant from another meeting.
    expected: Valid entries are retained; each invalid batch is rejected without any partial changes.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#records
        attendance for every participant in one write
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0224.spec.ts#CMT-ACC-0224
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#records
      attendance for every participant in one write
  - id: ATS-CMT-MTG-003-09
    title: Reopening authorises corrections and preserves an append-only audit
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-10
    preconditions: A meeting has been closed.
    steps: >-
      Attempt an ordinary correction, then correct as a manager with explicit reopening; attempt to
      update and delete its audit.
    expected: >-
      The ordinary edit fails, the authorised edit succeeds with actor, subjects, outcome and time
      recorded, and the application cannot alter or delete the audit.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/minutes.integration.spec.ts#refuses
        attendance after the close without reopen
      - >-
        services-committees:modules/meetings/tests/integration/services/minutes.integration.spec.ts#records
        attendance after the close for a manager who reopens it
      - >-
        services-committees:modules/meetings/tests/integration/services/minutes.integration.spec.ts#audits
        each reopened write with its actor, subjects, outcome and time
      - >-
        services-committees:modules/meetings/tests/integration/services/minutes.integration.spec.ts#refuses
        an update of the audit to the application role
      - >-
        services-committees:modules/meetings/tests/e2e/minutes.e2e.spec.ts#refuses attendance after
        the close with 409, meeting_closed
      - >-
        services-committees:modules/meetings/tests/integration/services/minutes.integration.spec.ts#refuses
        a delete of the audit to the application role
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/minutes.integration.spec.ts#refuses
      attendance after the close without reopen
  - id: ATS-CMT-MTG-003-10
    title: Post-close corrections explain their reason
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-11
    preconditions: A held meeting has attendance to correct.
    steps: 'Request a reopened correction without a reason, then provide one.'
    expected: Only the explained correction succeeds and its reason is visible in history.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to: []
    provenance: proposed
    source: 'services-committees:docs/milestones/plans/CMTE-M3-plan.md#D12'
  - id: ATS-CMT-MTG-003-11
    title: Cancellation blocks reopening edits
    level: unit
    proves:
      - BR-CAP-CMT-MTG-003-12
    preconditions: The participant edit rule receives a cancelled meeting.
    steps: Evaluate participant editing with reopening disabled and enabled.
    expected: Both requests are refused.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/unit/services/minutes-rule.spec.ts#refuses every
        edit of a cancelled meeting, reopened or not
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/unit/services/minutes-rule.spec.ts#refuses every
      edit of a cancelled meeting, reopened or not
  - id: ATS-CMT-MTG-003-12
    title: Repeated video delivery records one attendance event
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-13
    preconditions: A meeting has a virtual room and an identifiable participant.
    steps: Deliver an identical joined event twice.
    expected: The participant retains exactly one event with that identity.
    negative: false
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#records
        a joined event on the participant once, however often it is delivered
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#records
      a joined event on the participant once, however often it is delivered
  - id: ATS-CMT-MTG-003-13
    title: Accidental participants can be removed before proceedings start
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-14
    preconditions: A scheduled meeting contains an incorrectly added guest.
    steps: 'Remove the guest, then attempt removal after the call to order.'
    expected: The first removal succeeds and the later removal is refused.
    negative: false
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to: []
    provenance: proposed
    source: 'services-committees:docs/milestones/plans/CMTE-M3-plan.md#D12'
  - id: ATS-CMT-MTG-003-14
    title: Participant updates protect version and identity
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-15
    preconditions: A scheduled meeting and an appointment in another committee exist.
    steps: 'Update a participant with a stale version, then try replacing its contact or appointment.'
    expected: Stale updates return conflict and identity replacements fail request validation.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0222.spec.ts#CMT-ACC-0222
    provenance: test
    source: >-
      react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0222.spec.ts#CMT-ACC-0222
  - id: ATS-CMT-MTG-003-15
    title: Manual additions expose the limits of reference validation
    level: api
    proves:
      - BR-CAP-CMT-MTG-003-16
    preconditions: A scheduled meeting and an appointment in another committee exist.
    steps: >-
      Add a free-text contact with an existing appointment from another committee, then try an
      unknown appointment.
    expected: The mismatched existing references are accepted; the nonexistent appointment is rejected.
    negative: true
    data_needs: >-
      A disposable workspace with dated appointments, distinct contacts and recorded meeting
      participants.
    bound_to:
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0222.spec.ts#CMT-ACC-0222
    provenance: test
    source: >-
      react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0222.spec.ts#CMT-ACC-0222
evidence:
  - >-
    services-committees at 36129c24: participant routes and schemas, participants persistence,
    snapshot, proxy and close rules, participants and reopen audit tables, roster port, CMTE-M3
    record and plan
  - >-
    react-console at baf6dae3: acceptance inventory CAP-CMT-MTG-006, 007 and journeys CMT-ACC-0221
    to 0225, 0255
---

# Maintain meeting participation and attendance: Acceptance Test Set

## Coverage

| Rule | Proved by |
|---|---|
| `BR-CAP-CMT-MTG-003-01` | `ATS-CMT-MTG-003-01` |
| `BR-CAP-CMT-MTG-003-02` | `ATS-CMT-MTG-003-02` |
| `BR-CAP-CMT-MTG-003-03` | `ATS-CMT-MTG-003-03` |
| `BR-CAP-CMT-MTG-003-04` | `ATS-CMT-MTG-003-04` |
| `BR-CAP-CMT-MTG-003-05` | `ATS-CMT-MTG-003-05` |
| `BR-CAP-CMT-MTG-003-06` | `ATS-CMT-MTG-003-06` |
| `BR-CAP-CMT-MTG-003-07` | `ATS-CMT-MTG-003-07` |
| `BR-CAP-CMT-MTG-003-08` | `ATS-CMT-MTG-003-08` |
| `BR-CAP-CMT-MTG-003-09` | `ATS-CMT-MTG-003-08` |
| `BR-CAP-CMT-MTG-003-10` | `ATS-CMT-MTG-003-09` |
| `BR-CAP-CMT-MTG-003-11` | `ATS-CMT-MTG-003-10` |
| `BR-CAP-CMT-MTG-003-12` | `ATS-CMT-MTG-003-11` |
| `BR-CAP-CMT-MTG-003-13` | `ATS-CMT-MTG-003-12` |
| `BR-CAP-CMT-MTG-003-14` | `ATS-CMT-MTG-003-13` |
| `BR-CAP-CMT-MTG-003-15` | `ATS-CMT-MTG-003-14` |
| `BR-CAP-CMT-MTG-003-16` | `ATS-CMT-MTG-003-15` |
