---
id: ATS-CMT-MTG-002
scope: CAP-CMT-MTG-002
product_area: committees
module: meetings
revision: 1
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CMT-MTG-002-01
    title: Unsupported recurrence is explained and rejected
    level: unit
    proves:
      - BR-CAP-CMT-MTG-002-01
    preconditions: The recurrence parser and series endpoint are available.
    steps: >-
      Submit annual recurrence, missing start hours, set-position rules, ordinal-free monthly
      weekdays, and a count combined with an end; expand valid schedules.
    expected: Invalid schedules return a reason; supported schedules produce the specified dates.
    negative: true
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to:
      - >-
        services-committees:modules/meetings/tests/unit/services/recurrence-rule.spec.ts#refuses a
        yearly rule
      - >-
        services-committees:modules/meetings/tests/unit/services/recurrence-rule.spec.ts#refuses a
        rule without a start hour
      - >-
        services-committees:modules/meetings/tests/unit/services/recurrence-rule.spec.ts#refuses
        BYSETPOS
      - >-
        services-committees:modules/meetings/tests/unit/services/recurrence-rule.spec.ts#expands the
        second Tuesday of every month
      - >-
        services-committees:modules/meetings/tests/e2e/meetings.e2e.spec.ts#refuses a series whose
        recurrence rule it cannot read with 400
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0218.spec.ts#CMT-ACC-0218
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/unit/services/recurrence-rule.spec.ts#refuses a
      yearly rule
  - id: ATS-CMT-MTG-002-02
    title: Duration and date boundaries are checked
    level: api
    proves:
      - BR-CAP-CMT-MTG-002-02
    preconditions: An active committee is available.
    steps: 'Create series lasting zero, one, 1,440 and 1,441 minutes; submit an end before the start.'
    expected: 'One and 1,440 minutes are accepted; out-of-range durations and reversed dates are rejected.'
    negative: true
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to:
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0218.spec.ts#CMT-ACC-0218
    provenance: test
    source: >-
      react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0218.spec.ts#CMT-ACC-0218
  - id: ATS-CMT-MTG-002-03
    title: Generating a monthly calendar twice adds no duplicate
    level: api
    proves:
      - BR-CAP-CMT-MTG-002-03
    preconditions: A board has dated appointments.
    steps: Save a second-Tuesday schedule and generate its occurrences a second time.
    expected: The first generation creates the expected window; the repeat creates no new occurrence.
    negative: false
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#creates
        one meeting per occurrence of the window, on the second Tuesdays
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#creates
        nothing when it runs again
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0217.spec.ts#CMT-ACC-0217
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#creates
      one meeting per occurrence of the window, on the second Tuesdays
  - id: ATS-CMT-MTG-002-04
    title: A named workspace’s daily run isolates work and reports failures
    level: api
    proves:
      - BR-CAP-CMT-MTG-002-04
    preconditions: Two workspaces contain series; one series belongs to a committee dissolved after setup.
    steps: Invoke the daily handler for the first workspace.
    expected: >-
      Eligible series are generated, the dissolved committee’s series is reported as failed, and the
      second workspace receives no meetings.
    negative: false
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings-jobs-tenant.integration.spec.ts#materialises
        both of the named tenant’s series, each over the same window
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings-jobs-tenant.integration.spec.ts#answers
        one tenant run, none failed, and names the series of the dissolved committee
      - >-
        services-committees:modules/meetings/tests/unit/services/meetings-jobs-tenant.spec.ts#carries
        every tenant’s failed_series_ids to the daily answer
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings-jobs-tenant.integration.spec.ts#materialises
      both of the named tenant’s series, each over the same window
  - id: ATS-CMT-MTG-002-05
    title: A series edit preserves completed occurrences
    level: api
    proves:
      - BR-CAP-CMT-MTG-002-05
    preconditions: A series contains future meetings and held and cancelled occurrences.
    steps: Move the series start time one hour earlier.
    expected: >-
      Future draft and scheduled occurrences change time; held and cancelled meetings retain their
      details.
    negative: false
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to:
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#rewrites
        the future unheld occurrences to the new time
      - >-
        services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#leaves
        the held and the cancelled occurrence as they were when the series is edited
    provenance: test
    source: >-
      services-committees:modules/meetings/tests/integration/services/meetings.integration.spec.ts#rewrites
      the future unheld occurrences to the new time
  - id: ATS-CMT-MTG-002-06
    title: Calling follows the committee’s lead time
    level: api
    proves:
      - BR-CAP-CMT-MTG-002-06
    preconditions: The committee uses the initial thirty-day lead time.
    steps: 'Create a monthly schedule, then run the daily process before and at the calling boundary.'
    expected: >-
      Distant occurrences remain drafts; at the boundary each becomes scheduled and the calling side
      effects permitted by policy occur.
    negative: false
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to: []
    provenance: proposed
    source: 'services-committees:docs/milestones/CMTE-M3-meetings-and-minutes.md#D3'
  - id: ATS-CMT-MTG-002-07
    title: Resuming restores eligible dates
    level: api
    proves:
      - BR-CAP-CMT-MTG-002-07
    preconditions: An active monthly schedule has future occurrences.
    steps: 'Pause the series, then resume it.'
    expected: Pausing cancels future occurrences; resuming restores the remaining eligible dates.
    negative: false
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to: []
    provenance: proposed
    source: 'services-committees:docs/milestones/plans/CMTE-M3-plan.md#D12'
  - id: ATS-CMT-MTG-002-08
    title: An individually moved meeting survives a series edit
    level: api
    proves:
      - BR-CAP-CMT-MTG-002-08
    preconditions: Staff moved the March occurrence from Tuesday to Wednesday.
    steps: Change the recurring start hour.
    expected: The March meeting retains its individually chosen date and time.
    negative: false
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to: []
    provenance: proposed
    source: 'services-committees:docs/milestones/plans/CMTE-M3-plan.md#D12'
  - id: ATS-CMT-MTG-002-09
    title: Dissolved committees cannot acquire a series
    level: api
    proves:
      - BR-CAP-CMT-MTG-002-09
    preconditions: A committee has been dissolved.
    steps: Attempt to save a recurring schedule for that committee.
    expected: The request returns committee_dissolved and stores neither a series nor an occurrence.
    negative: true
    data_needs: 'A disposable workspace containing a committee, appointments and a controlled current date.'
    bound_to:
      - >-
        react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0218.spec.ts#CMT-ACC-0218
    provenance: test
    source: >-
      react-console:acceptance/committees/playwright/journeys/meetings/CMT-ACC-0218.spec.ts#CMT-ACC-0218
evidence:
  - >-
    services-committees at 36129c24: series routes and schemas, series persistence, recurrence rule,
    meetings jobs, series table, CMTE-M3 record and plan
  - >-
    react-console at baf6dae3: acceptance inventory CAP-CMT-MTG-005 and journeys CMT-ACC-0217 to
    0220, 0253
---

# Maintain a committee’s recurring meeting schedule: Acceptance Test Set

## Coverage

| Rule | Proved by |
|---|---|
| `BR-CAP-CMT-MTG-002-01` | `ATS-CMT-MTG-002-01` |
| `BR-CAP-CMT-MTG-002-02` | `ATS-CMT-MTG-002-02` |
| `BR-CAP-CMT-MTG-002-03` | `ATS-CMT-MTG-002-03` |
| `BR-CAP-CMT-MTG-002-04` | `ATS-CMT-MTG-002-04` |
| `BR-CAP-CMT-MTG-002-05` | `ATS-CMT-MTG-002-05` |
| `BR-CAP-CMT-MTG-002-06` | `ATS-CMT-MTG-002-06` |
| `BR-CAP-CMT-MTG-002-07` | `ATS-CMT-MTG-002-07` |
| `BR-CAP-CMT-MTG-002-08` | `ATS-CMT-MTG-002-08` |
| `BR-CAP-CMT-MTG-002-09` | `ATS-CMT-MTG-002-09` |
