---
id: CAP-CMT-MTG-017
title: Forecast who leaves and draft openings for their seats
feature: FEAT-CMT-MTG-05
product_area: committees
module: meetings
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
- react-console acceptance inventory CAP-CMT-REC-007, 008
- react-console acceptance journeys CMT-ACC-0396, 0397, 0421, 0423
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
- services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#D8
purpose: Staff see which seats fall vacant in the months ahead, who cannot be reappointed and who already has a successor, and draft openings from that list.
outcomes:
- Vacancies known before they happen
- Term limits visible before reappointment
- Openings drafted once per seat
concepts:
- CON-CMT-MTG-005
actors:
- ACT-CMT-002
- ACT-CMT-008
surfaces:
- api
preconditions: []
postconditions: []
permissions:
- key: committees.openings.read
  where_checked: api
  scope: tenant
- key: committees.openings.manage
  where_checked: api
  scope: tenant
rules:
- id: BR-CAP-CMT-MTG-017-01
  proved_by: [ATS-CMT-MTG-017-01, ATS-CMT-MTG-017-08, TST-CMT-MTG-229, TST-CMT-MTG-240]
  statement: The forecast lists current seat-holders whose last day, the earlier of their own end and their term’s end unless extended, falls from today through the chosen number of months, 1 to 60 with 12 by default.
  kind: calculation
  enforced_at:
  - api
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/unit/services/forecast-rule.spec.ts#is the earlier of its end and its term’s
  origin: none
- id: BR-CAP-CMT-MTG-017-02
  proved_by: [ATS-CMT-MTG-017-02, TST-CMT-MTG-240]
  statement: A holder is marked term-limited when their consecutive run, the current appointment included, already reaches the limit.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: 'services-committees:modules/recruitment/tests/unit/services/forecast-rule.spec.ts#forecasts Lee: ending 2026-12-31, term-limited after two consecutive terms, Sam to succeed him'
  origin: none
- id: BR-CAP-CMT-MTG-017-03
  proved_by: [ATS-CMT-MTG-017-03, TST-CMT-MTG-240]
  statement: A successor is planned when an appointment to the same seat, or to the same committee and position without a seat, starts within 31 days after the holder’s last day and is neither pending nor declined.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/unit/services/forecast-rule.spec.ts#is one starting 31 days after the last day
  origin: none
- id: BR-CAP-CMT-MTG-017-04
  proved_by: [ATS-CMT-MTG-017-04, TST-CMT-MTG-235, TST-CMT-MTG-240]
  statement: Staff liaisons, pending appointments and open-ended appointments are never forecast.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/integration/services/openings.integration.spec.ts#forecasts neither the staff liaison, nor Riley’s pending appointment, nor the already vacant Eastern Region seat
  origin: none
- id: BR-CAP-CMT-MTG-017-05
  proved_by: [ATS-CMT-MTG-016-15, ATS-CMT-MTG-017-05, ATS-CMT-MTG-017-07, TST-CMT-MTG-156, TST-CMT-MTG-181, TST-CMT-MTG-235]
  statement: Drafting from the forecast makes one draft opening per chosen holder whose seat has no draft or open opening, names those skipped, and needs at least one holder chosen.
  kind: validation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/integration/services/openings.integration.spec.ts#skips a holder whose seat already has an opening, making none twice
  origin: none
- id: BR-CAP-CMT-MTG-017-06
  proved_by: [ATS-CMT-MTG-017-06, TST-CMT-MTG-157]
  statement: Today two holders of one position on a committee without seats get two draft openings for the same position in one request.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: react-console:acceptance/committees/playwright/journeys/recruitment/CMT-ACC-0397.spec.ts#CMT-ACC-0397
  origin: none
- id: BR-CAP-CMT-MTG-017-07
  proved_by: []
  statement: Reading the forecast tells nobody; no term-ending notice is sent.
  kind: policy
  enforced_at:
  - service
  must_prove: false
  provenance: test
  source: 'services-committees:modules/recruitment/tests/integration/services/openings.integration.spec.ts#sends no term-ending notice for the fixtures’ appointments (D8): the forecast is read, nobody is told'
  origin: CMTE-M1 D8 (Andrew 2026-10-19 17:57 ET, services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#Decisions)
scenarios:
- id: SC-CAP-CMT-MTG-017-01
  given: A director in a second term ending 31 December with a successor appointed from 1 January
  when: Staff read the forecast
  then: The director is listed as term-limited with the successor planned and no opening yet
  provenance: test
  source: 'services-committees:modules/recruitment/tests/integration/services/openings.integration.spec.ts#forecasts Lee’s second director term: ending 2026-12-31, term-limited, Sam to succeed him, no opening yet'
edge_cases: []
constraints: []
depends_on:
- CAP-CMT-MTG-016
related: []
journeys:
- JNY-CMT-MTG-005
open_questions: []
evidence:
- 'services-committees at 36129c24: forecast routes, vacancy forecast service, forecast rule and holdings, openings persistence, CMTE-M1 record'
- 'react-console at baf6dae3: acceptance inventory CAP-CMT-REC-007, 008 and journeys CMT-ACC-0396, 0397, 0421, 0423'
controls:
  - 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-004
  - TC-DAT-001
  - TC-DAT-002
  - TC-DAT-003
  - TC-LOG-002
  - TC-LOG-003
  - TC-LOG-004
  - TC-LOG-005
  - TC-PI-001
  - TC-PI-003
  - TC-PI-005
  - TC-PRV-001
  - TC-PRV-002
exercised_by: [FAS-CMT-MTG-05-01, FAS-CMT-MTG-05-02]
suites: [TST-CMT-MTG-156, TST-CMT-MTG-157, TST-CMT-MTG-181, TST-CMT-MTG-229, TST-CMT-MTG-235, TST-CMT-MTG-240]
---

# Forecast who leaves and draft openings for their seats

## Purpose

Staff see which seats fall vacant in the months ahead, who cannot be reappointed and who already has a successor, and draft openings from that list.

## How It Works

Staff read a forecast of the seats falling vacant across all committees over the coming months, twelve by default and up to five years. It lists each serving seat-holder whose appointment ends in that window, says whether they have reached their term limit and so cannot be reappointed without an override, whether a successor is already planned, and whether an opening already exists for the seat. Staff liaisons, pending offers and open-ended appointments are left out. From the forecast, staff choose holders and draft openings for their seats in one step; a seat that already has an opening is skipped and named, so no seat gets two. Reading the forecast tells nobody, in line with Product’s ruling that term endings send no e-mail. On a committee without seats, two people leaving the same position today get two openings, which the product should merge.

## Relationships

- Relates to `CAP-CMT-MTG-016` because the forecast drafts ordinary openings.
