---
id: CAP-CMT-MTG-015
title: Stand conflicted voters aside from a decision
feature: FEAT-CMT-MTG-04
product_area: committees
module: meetings
revision: 1
status: draft
product_intent: proposed
implementation_evidence: inconsistent
supersedes:
- react-console acceptance inventory CAP-CMT-DEC-011, 017
- react-console acceptance journeys CMT-ACC-0333, 0335, 0336, 0350
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
- services-committees:docs/milestones/CMTE-M6-disclosures-and-recusals.md#Objective
purpose: A voter with a conflict stands aside from a decision, and staff are prompted when a disclosed interest touches what is being decided.
outcomes:
- Conflicted voters do not vote
- Disclosed interests prompt recusal at the right decision
- Who disclosed what stays private
concepts:
- CON-CMT-MTG-004
actors:
- ACT-CMT-002
- ACT-CMT-005
- ACT-CMT-009
surfaces:
- api
- portal
preconditions:
- The decision is draft or open.
postconditions: []
permissions:
- key: committees.decisions.read
  where_checked: api
  scope: tenant
- key: committees.decisions.manage
  where_checked: api
  scope: tenant
- key: committees.disclosures.read
  where_checked: api
  scope: tenant
- key: committees.portal.participate
  where_checked: api
  scope: record
rules:
- id: BR-CAP-CMT-MTG-015-01
  proved_by: [ATS-CMT-MTG-015-01, ATS-CMT-MTG-015-15, TST-CMT-MTG-055, TST-CMT-MTG-189]
  statement: A recusal is recorded with its reason while a decision is draft or open, for one of its voters, once, and never after that voter has voted.
  kind: validation
  enforced_at:
  - service
  - database
  must_prove: true
  provenance: observed
  source: services-committees:modules/decisions/services/persistence/decisions.ts:recordRecusal
  origin: none
- id: BR-CAP-CMT-MTG-015-02
  proved_by: [ATS-CMT-MTG-010-19, ATS-CMT-MTG-015-02, ATS-CMT-MTG-015-10, TST-CMT-MTG-197]
  statement: A recused voter cannot vote on the decision.
  kind: validation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/decisions/tests/integration/services/decisions.integration.spec.ts#refuses a recused member’s vote, 409 recused
  origin: none
- id: BR-CAP-CMT-MTG-015-03
  proved_by: [ATS-CMT-MTG-015-03, TST-CMT-MTG-194, TST-CMT-MTG-205]
  statement: A recusal that names a disclosure must name one of the recused voter’s own; any other is refused as unknown.
  kind: validation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/decisions/tests/integration/api/recusal-disclosure.integration.spec.ts#answers 400 unknown_disclosure naming the field for another voter’s disclosure
  origin: none
- id: BR-CAP-CMT-MTG-015-04
  proved_by: [ATS-CMT-MTG-014-08, ATS-CMT-MTG-015-04, ATS-CMT-MTG-015-13, TST-CMT-MTG-198]
  statement: A voter is suggested for recusal when one of their accepted or flagged disclosures, for a period not yet ended, names an organization or contact the decision is linked to.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/decisions/tests/integration/services/disclosures.integration.spec.ts#suggests the voter whose accepted disclosure names the decision’s linked organization, and why
  origin: none
- id: BR-CAP-CMT-MTG-015-05
  proved_by: [ATS-CMT-MTG-015-05, TST-CMT-MTG-058, TST-CMT-MTG-193]
  statement: Recusal suggestions are shown only to those who read disclosures, and in the portal a voter sees only their own.
  kind: permission
  enforced_at:
  - api
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/decisions/tests/integration/api/recusal-confidentiality.integration.spec.ts#shows the bookkeeper an open decision’s recusals without suggestions
  origin: none
- id: BR-CAP-CMT-MTG-015-06
  proved_by: [ATS-CMT-MTG-013-08, ATS-CMT-MTG-015-06, ATS-CMT-MTG-015-12, TST-CMT-MTG-057, TST-CMT-MTG-190, TST-CMT-MTG-193]
  statement: The recusals of a confidential decision are hidden exactly as the decision is.
  kind: permission
  enforced_at:
  - api
  - service
  must_prove: true
  provenance: test
  source: services-committees:modules/decisions/tests/integration/api/recusal-confidentiality.integration.spec.ts#answers the bookkeeper 404 for the confidential decision’s recusals
  origin: none
- id: BR-CAP-CMT-MTG-015-07
  proved_by: [ATS-CMT-MTG-015-07, ATS-CMT-MTG-015-14, ATS-CMT-MTG-020-15, TST-CMT-MTG-072]
  statement: A member recuses themselves from the portal with their reason; today the portal refuses a draft decision, though the operation promises draft or open.
  kind: validation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: react-console:acceptance/committees/playwright/journeys/decisions/CMT-ACC-0350.spec.ts#CMT-ACC-0350
  origin: none
- id: BR-CAP-CMT-MTG-015-08
  proved_by: [ATS-CMT-MTG-011-16, ATS-CMT-MTG-015-11]
  statement: A recusal never removes the voter from the frozen voters; the committee’s rules decide how it counts.
  kind: invariant
  enforced_at:
  - database
  must_prove: false
  provenance: observed
  source: services-committees:modules/decisions/db/recusals.table.ts
  origin: none
scenarios:
- id: SC-CAP-CMT-MTG-015-01
  given: A director whose firm is linked to the audit vote
  when: Staff holding the disclosures key read the decision
  then: They see the director suggested for recusal with the reason
  provenance: test
  source: react-console:acceptance/committees/playwright/journeys/decisions/CMT-ACC-0354.spec.ts#CMT-ACC-0354
edge_cases: []
constraints: []
depends_on:
- CAP-CMT-MTG-010
- CAP-CMT-MTG-014
related:
- CAP-CMT-MTG-011
journeys:
- JNY-CMT-MTG-004
open_questions: []
evidence:
- 'services-committees at 36129c24: recusal routes, decisions persistence, disclosure reader port, decision visibility and recusal rules, recusals table, CMTE-M6 record'
- 'react-console at baf6dae3: acceptance inventory CAP-CMT-DEC-011, 017 and journeys CMT-ACC-0333, 0335, 0336, 0350'
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-001
  - 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-04-01, FAS-CMT-MTG-04-02, FAS-CMT-MTG-04-03, FAS-CMT-MTG-04-04, FAS-CMT-MTG-04-05]
suites: [TST-CMT-MTG-055, TST-CMT-MTG-057, TST-CMT-MTG-058, TST-CMT-MTG-072, TST-CMT-MTG-189, TST-CMT-MTG-190, TST-CMT-MTG-193, TST-CMT-MTG-194, TST-CMT-MTG-197, TST-CMT-MTG-198, TST-CMT-MTG-205]
---

# Stand conflicted voters aside from a decision

## Purpose

A voter with a conflict stands aside from a decision, and staff are prompted when a disclosed interest touches what is being decided.

## How It Works

A voter who has a conflict stands aside from a decision before it closes, with their reason and, if they wish, the disclosure behind it. Staff record recusals in the console; a member can recuse themselves in the portal. A voter is recused once, never after voting, and a recused voter cannot vote; the committee’s rules decide whether the recused leave the count or count as absent. The product also suggests recusals: when one of a voter’s accepted or flagged disclosures names an organization or contact the decision is linked to, that voter is suggested with the reason. Because a suggestion reveals what someone disclosed, only staff who read disclosures see suggestions, and in the portal a voter sees only their own. The recusals of a confidential decision are hidden like the decision. Today the portal refuses recusal from a draft decision although the operation describes draft or open; the product should decide which it means.

## Relationships

- Relates to `CAP-CMT-MTG-010` because recusals are part of the decision’s record.
- Relates to `CAP-CMT-MTG-014` because disclosures are the basis of suggestions.
- Relates to `CAP-CMT-MTG-011` because the rules decide how recusals count.
