---
id: DOM-CMT-MTG-004
title: Conflict-of-Interest Disclosure
realises: CON-CMT-MTG-004
product_area: committees
module: meetings
revision: 3
status: draft
design_intent: proposed
implementation_evidence: partially-observed
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
owned_by: SVC-CMT-MTG-decisions
readable_by:
  - SVC-CMT-MTG-recruitment
  - SVC-PFM-QRY-queries
lifecycle: STATE-CMT-MTG-007
custom_fields: none
identity: >-
  The disclosure has a stable record identity, while appointment and period
  start uniquely identify the obligation. Staff recognize the holder, committee
  and coverage period rather than use the internal key.
attributes:
  - name: 'appointment, contact and committee'
    kind: reference
    required: true
    computed: false
    notes: >-
      The voting appointment that owes the declaration, with its contact and
      committee references.
  - name: period
    kind: date
    required: true
    computed: false
    notes: >-
      The obligation’s first and last business dates under workspace disclosure
      settings.
  - name: due on
    kind: date
    required: true
    computed: true
    notes: >-
      The computed due date, thirty days after the later of appointment or
      period start and capped at period end.
  - name: status
    kind: enum
    required: true
    computed: false
    notes: >-
      The declared stages are requested, submitted, reviewed, accepted and
      flagged.
  - name: submission and requested at
    kind: reference
    required: false
    computed: false
    notes: >-
      The linked form submission and local time at which a returned start was
      recorded.
  - name: disclosed interests
    kind: collection
    required: false
    computed: false
    notes: >-
      Available reviewed interests naming organizations or contacts and their
      relationship, plus an optional no-conflicts declaration.
  - name: review
    kind: collection
    required: false
    computed: false
    notes: The review author and instant carried by the delivered decision.
  - name: notes
    kind: text
    required: false
    computed: false
    notes: Additional internal commentary on the obligation.
relationships:
  - to: DOM-CMT-MTG-003
    cardinality: many-to-many
    ownership: >-
      Standing declarations supply possible conflict matches for decision
      voters, while each recusal owns any disclosure reference and remains a
      separate explicit action.
    cross_service: false
invariants:
  - id: INV-DOM-CMT-MTG-004-01
    statement: >-
      The database declares at most one obligation for an appointment and period
      start.
    enforced_at:
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/db/conflict-disclosures.table.ts:conflict_disclosures_period_uq
  - id: INV-DOM-CMT-MTG-004-02
    statement: >-
      The database declares an ordered coverage period and the period calculator
      caps the due date at its end.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/db/conflict-disclosures.table.ts:conflict_disclosures_period_check;
      services/rules/disclosure-period.ts:disclosurePeriodOf
  - id: INV-DOM-CMT-MTG-004-03
    statement: >-
      A request reuses a stored submission and sends a stable external start
      key; accepted or flagged status is checked before the call but not again
      at the final write.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/disclosures/disclosures.ts:requestDisclosure
  - id: INV-DOM-CMT-MTG-004-04
    statement: >-
      Standing conflict reads use accepted or flagged declarations whose period
      has not ended.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/ports/disclosure-reader.ts:conflictDisclosureReader;
      db/conflict-disclosures.table.ts:STANDING_DISCLOSURE_STATUSES
  - id: INV-DOM-CMT-MTG-004-05
    statement: >-
      Staff interest reads require the sensitive disclosure permission, and
      portal reads select only the current contact’s declarations.
    enforced_at:
      - api
      - service
    provenance: observed
    source: >-
      services-committees:aws/committees.service.ts:DISCLOSURE_PERMISSIONS;
      modules/decisions/services/disclosures/disclosures.ts:myDisclosures
  - id: INV-DOM-CMT-MTG-004-06
    statement: A cited disclosure must belong to the appointment holder being recused.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/rules/decision-rules.ts:recusalDisclosureRefusal
physical:
  - committees.conflict_disclosures
evidence:
  - >-
    services-committees at 36129c24:
    modules/decisions/db/conflict-disclosures.table.ts;
    services/disclosures/disclosures.ts; services/rules/disclosure-period.ts;
    services/persistence/conflict-disclosures.ts;
    services/attention/disclosures-overdue.ts; ports/disclosure-reader.ts;
    modules/recruitment/services/submissions/handle-submission-decisions.ts;
    aws/committees.submissions.ts (the committees.coi_disclosure subject kind)
---
# Conflict-of-Interest Disclosure

## What It Models

A disclosure joins a member’s duty to declare outside interests with the reviewed declaration for that period. Its purpose is to inform conflict handling without automatically removing voting rights. Submissions owns the form and review process.

## Identity and Attributes

Appointment-period uniqueness makes repeated daily obligation creation safe. Period settings determine the coverage and due date. Reviewed summary data comes from the delivered basis or available revision answers and may remain absent.

## Relationships

A standing interest can match a decision subject and suggest a recusal. The suggestion does not write one. A recorded recusal may cite the holder’s own disclosure, while appointments and committees remain owned by the committee module.

## Invariants

Uniqueness and date checks protect the obligation shape. Permission filters protect sensitive reads. Form start deduplication depends partly on its future receiving contract, and review status has a race between the initial read and final write.

## How It Is Stored and Shared

The decisions service creates and requests obligations. Recruitment’s review handler writes the outcome in the shared database boundary. The registered reviewer-conflict function is intended to read standing declarations, and Queries exposes the sensitive disclosure dataset. No custom fields are declared.

## Open Design Questions

The production form port is unavailable and skipped due notices are lost. The final request write needs a decision about handling concurrent review, and end-to-end Submissions start deduplication remains unproved.
