---
id: CAP-CMT-MTG-016
title: Advertise a committee opening and see who is interested
feature: FEAT-CMT-MTG-05
product_area: committees
module: meetings
revision: 1
status: draft
product_intent: proposed
implementation_evidence: inconsistent
supersedes:
- react-console acceptance inventory CAP-CMT-REC-001 to 006, 009, 010, 020, 021
- react-console acceptance journeys CMT-ACC-0390 to 0395, 0398 to 0402, 0404, 0414, 0415, 0416, 0422, 0424
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
- services-committees:docs/milestones/CMTE-M5-openings-and-nominations.md#Objective
- services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#D1
- services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#D5
purpose: Staff advertise places on a committee, the right audience sees them, interested members say so, and the opening closes when its places are filled.
outcomes:
- Vacancies advertised to the right audience
- Interest recorded in one place
- Openings that close themselves when filled
concepts:
- CON-CMT-MTG-005
actors:
- ACT-CMT-002
- ACT-CMT-008
- ACT-CMT-005
- ACT-CMT-010
- ACT-CMT-011
surfaces:
- api
- portal
- job
preconditions:
- The committee exists and is not dissolved.
postconditions: []
permissions:
- key: committees.openings.read
  where_checked: api
  scope: tenant
- key: committees.openings.manage
  where_checked: api
  scope: tenant
- key: committees.rosters.read
  where_checked: api
  scope: tenant
- key: committees.portal.participate
  where_checked: api
  scope: record
rules:
- id: BR-CAP-CMT-MTG-016-01
  statement: An opening is made for a live committee, for one of its seats, a position or any seat, offering 1 to 100 places with an optional window whose end is not before its start; a seat’s position becomes the opening’s.
  kind: validation
  enforced_at:
  - api
  - service
  - database
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/integration/services/openings.integration.spec.ts#refuses a seat of another committee
  origin: none
- id: BR-CAP-CMT-MTG-016-02
  statement: An opening goes from draft to open by publishing, from open to closed by staff, from open to filled when its places are taken, and from draft or open to cancelled; it changes only while draft or open, and closed, filled and cancelled are final.
  kind: lifecycle
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/unit/services/opening-lifecycle.spec.ts#answers the whole grid of statuses and actions as the table says
  origin: none
- id: BR-CAP-CMT-MTG-016-03
  statement: Every change of an opening is made at the version read.
  kind: policy
  enforced_at:
  - api
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/integration/services/openings.integration.spec.ts#refuses a replace against a stale version
  origin: none
- id: BR-CAP-CMT-MTG-016-04
  statement: Publishing an opening tells the committee’s chair and staff liaison once each and records that it was published.
  kind: policy
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/integration/services/openings.integration.spec.ts#tells the committee’s chair (its President) and its staff liaison, once each
  origin: none
- id: BR-CAP-CMT-MTG-016-05
  statement: An open opening counts each seat-holder appointment that starts on what it offers once, and becomes filled when its places are taken; a pending offer, another seat, a staff liaison or a repeated report fills nothing.
  kind: calculation
  enforced_at:
  - service
  - job
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/unit/services/fill-rule.spec.ts#counts the appointment and makes a one-place opening full
  origin: none
- id: BR-CAP-CMT-MTG-016-06
  statement: 'Outside the console an opening is shown only while it is open and before its application deadline, as the committee’s directory listing allows: to anyone when public, to portal users when authenticated, and to nobody when none.'
  kind: permission
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/e2e/openings.e2e.spec.ts#shows anyone, through the public route, the public board’s opening alone
  origin: none
- id: BR-CAP-CMT-MTG-016-07
  statement: A portal member says they are interested in an opening the portal shows them once, and saying it again replaces the note.
  kind: invariant
  enforced_at:
  - service
  - database
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/e2e/openings.e2e.spec.ts#keeps one interest when it is said again, with the new note
  origin: none
- id: BR-CAP-CMT-MTG-016-08
  statement: Today an open opening whose deadline has passed stays open, fillable and in the forecast, and an opening fills before its window opens.
  kind: policy
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: react-console:acceptance/committees/playwright/journeys/recruitment/CMT-ACC-0399.spec.ts#CMT-ACC-0399
  origin: none
- id: BR-CAP-CMT-MTG-016-09
  statement: Dissolving a committee cancels its draft and open openings and takes them off the website and the portal.
  kind: lifecycle
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/integration/services/dissolved-recruitment.integration.spec.ts#cancels the published and the draft opening
  origin: CMTE-M1 D5 (Andrew 2026-10-19 17:53 ET, services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#Decisions)
- id: BR-CAP-CMT-MTG-016-10
  statement: 'An edit saves what it carries and keeps what it does not: a text-only edit keeps the seat, places and window, and a field sent empty is cleared.'
  kind: policy
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/integration/services/edits.integration.spec.ts#keeps the seat, position, places, window and link the text-only edit did not carry
  origin: CMTE-M1 D1 (Andrew 2026-10-19 17:45 ET, services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#Decisions)
- id: BR-CAP-CMT-MTG-016-11
  statement: Openings and interests of one association are invisible to another.
  kind: permission
  enforced_at:
  - database
  must_prove: true
  provenance: test
  source: services-committees:modules/recruitment/tests/integration/services/openings.integration.spec.ts#answers it from another tenant as one that does not exist
  origin: none
- id: BR-CAP-CMT-MTG-016-12
  statement: Opening permissions are checked across the whole association; a grant limited to one organizational unit does not reach them.
  kind: permission
  enforced_at:
  - api
  must_prove: true
  provenance: test
  source: react-console:acceptance/committees/playwright/journeys/recruitment/CMT-ACC-0404.spec.ts#CMT-ACC-0404
  origin: CMTE-M1 D11 (Andrew 2026-10-19 18:05 ET, services-committees:docs/milestones/CMTE-M1-committees-seats-and-rosters.md#Decisions)
- id: BR-CAP-CMT-MTG-016-13
  statement: The links to a Volunteers opportunity and a Submissions process are only stored; nothing calls either service yet.
  kind: policy
  enforced_at:
  - service
  must_prove: false
  provenance: observed
  source: services-committees:modules/recruitment/db/openings.table.ts
  origin: none
scenarios:
- id: SC-CAP-CMT-MTG-016-01
  given: A two-place board opening published on the website
  when: A member says they are interested and two directors are appointed
  then: The opening reads filled and leaves the website
  provenance: test
  source: react-console:acceptance/committees/playwright/journeys/recruitment/CMT-ACC-0391.spec.ts#CMT-ACC-0391
edge_cases: []
constraints: []
depends_on: []
related:
- CAP-CMT-MTG-017
- CAP-CMT-MTG-018
- CAP-CMT-MTG-019
journeys:
- JNY-CMT-MTG-005
open_questions:
- OQ-CMT-MTG-002
- OQ-CMT-MTG-006
evidence:
- 'services-committees at 36129c24: openings routes and schemas, openings, interests and portal persistence, opening lifecycle, fill rule and subscriber, notices, dissolved recruitment, openings and interests tables, CMTE-M1 and CMTE-M5 records'
- 'react-console at baf6dae3: acceptance inventory CAP-CMT-REC-001 to 006, 009, 010, 020, 021 and the recruitment journeys cited'
controls:
  - 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-004
  - TC-DAT-001
  - TC-DAT-002
  - TC-DAT-003
  - TC-DAT-004
  - TC-LOG-002
  - TC-LOG-003
  - TC-LOG-004
  - TC-LOG-005
  - TC-AVL-004
  - TC-AVL-005
  - TC-MON-001
  - TC-MON-002
  - TC-PI-001
  - TC-PI-002
  - TC-PI-003
  - TC-PI-004
  - TC-PI-005
  - TC-PRV-001
  - TC-PRV-002
---

# Advertise a committee opening and see who is interested

## Purpose

Staff advertise places on a committee, the right audience sees them, interested members say so, and the opening closes when its places are filled.

## How It Works

Staff create an opening on a committee: for a particular seat, for a position, or for any seat, with how many places it offers, when it opens and closes for applications, and what it says. A draft is seen only by staff. Publishing it advertises it, tells the committee’s chair and staff liaison, and shows it outside the console as the committee’s directory listing allows: to anyone on the website, to signed-in portal users, or to nobody. A portal member can say they are interested, once, with a note they can replace. Staff close an opening by hand or cancel it; it closes itself as filled when enough seat-holders start on what it offers. Dissolving a committee cancels its openings. An edit saves only what it carries, and every change is made against the version read. Today an opening ignores its own window: it stays open past its deadline and fills before it opens, which Product should decide. Recruiting through Volunteers and applying through Submissions are only referenced so far.

## Relationships

- Relates to `CAP-CMT-MTG-017` because the forecast drafts openings.
- Relates to `CAP-CMT-MTG-018` because nominations may name an opening.
- Relates to `CAP-CMT-MTG-019` because seat applications decided in Submissions belong to an opening.
