---
id: DOM-CMT-MTG-003
title: Decision
realises: CON-CMT-MTG-003
product_area: committees
module: meetings
revision: 3
status: draft
design_intent: proposed
implementation_evidence: observed
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
owned_by: SVC-CMT-MTG-decisions
readable_by:
  - SVC-CMT-MTG-meetings
  - SVC-CMT-MTG-recruitment
  - SVC-PFM-QRY-queries
lifecycle: STATE-CMT-MTG-006
custom_fields: none
identity: >-
  Drafting allocates a stable decision identity. Opening adds the committee’s
  yearly sequence number; a draft set aside before opening remains unnumbered.
  Snapshot voters, votes and decision recusals use the decision and appointment
  as their uniqueness boundary.
attributes:
  - name: committee
    kind: reference
    required: true
    computed: false
    notes: >-
      The committee making the motion; appointment, removal, seat and term
      targets are checked against it.
  - name: meeting and agenda item
    kind: reference
    required: false
    computed: false
    notes: >-
      The related meeting and optional agenda item for a meeting method;
      asynchronous methods have no meeting.
  - name: kind
    kind: enum
    required: true
    computed: false
    notes: >-
      Motion, resolution, consent item, approval, appointment, removal, charter
      or other selects the applicable consequence behavior.
  - name: title and text
    kind: text
    required: true
    computed: false
    notes: >-
      The name and motion text; the source declares these frozen after leaving
      draft.
  - name: movers
    kind: reference
    required: false
    computed: false
    notes: Appointment references for the mover and seconder.
  - name: method
    kind: enum
    required: true
    computed: false
    notes: >-
      Voice, hands, roll call, unanimous consent or meeting ballot, or an
      asynchronous recorded or secret method.
  - name: number
    kind: text
    required: false
    computed: true
    notes: The committee year and sequence assigned when the draft opens.
  - name: rule snapshot
    kind: collection
    required: false
    computed: true
    notes: >-
      The effective rules and their origin, chosen threshold, authorized seat
      count and roster date captured at opening.
  - name: attendance snapshot
    kind: collection
    required: false
    computed: true
    notes: >-
      The present appointments and represented proxies captured when a meeting
      decision opens.
  - name: status and outcome
    kind: enum
    required: true
    computed: false
    notes: >-
      Lifecycle status records preparation and disposition; result is carried,
      failed or no_quorum and remains attached after supersession.
  - name: tally
    kind: collection
    required: false
    computed: true
    notes: >-
      The entered tally together with deterministic counts, quorum and threshold
      arithmetic and explanation.
  - name: consequence inputs
    kind: collection
    required: false
    computed: false
    notes: >-
      Kind-specific proposed appointments, removals, charter changes or minutes
      approval, declared frozen after opening.
  - name: consequences
    kind: collection
    required: false
    computed: true
    notes: >-
      The committed effect references, including appointed and ended people,
      approved minutes, charter changes and nominations elected or excluded.
  - name: timing
    kind: date
    required: false
    computed: false
    notes: >-
      Opening, asynchronous deadline, reminder attempt, result author and time,
      and optional business effective date.
  - name: amends or rescinds
    kind: reference
    required: false
    computed: false
    notes: >-
      One optional carried predecessor targeted by amendment or rescission,
      never the decision itself.
  - name: confidentiality
    kind: enum
    required: true
    computed: false
    notes: 'The confidential-record flag, independently checked by read authorization.'
  - name: linked records
    kind: collection
    required: false
    computed: false
    notes: >-
      Subject references used for conflict suggestions, including organizations,
      contacts and submissions; their freeze is declared.
  - name: external vote
    kind: reference
    required: false
    computed: false
    notes: >-
      Election and certification references returned by the secret-ballot
      boundary.
  - name: voter
    kind: collection
    required: false
    computed: true
    notes: >-
      One captured voting appointment with contact, seat, position, chair and
      derived-seat standing.
  - name: vote
    kind: collection
    required: false
    computed: false
    notes: >-
      One named appointment’s value, including yes, no, abstain, present,
      recused or absent; insertion records time, staff author and voting
      channel.
  - name: recusal
    kind: collection
    required: false
    computed: false
    notes: >-
      The appointment standing aside, its reason and optional disclosure
      evidence, and its recording authority.
  - name: number counter
    kind: number
    required: true
    computed: true
    notes: One committee counter holding the current year and next number.
relationships:
  - to: DOM-CMT-MTG-001
    cardinality: many-to-one
    ownership: >-
      The decision owns its meeting reference; drafting refuses a draft or
      cancelled gathering, while opening does not repeat that status check.
    cross_service: false
  - to: DOM-CMT-MTG-002
    cardinality: many-to-one
    ownership: >-
      An approval decision owns the reference to the minutes revision its
      consequence can approve.
    cross_service: false
  - to: DOM-CMT-MTG-004
    cardinality: many-to-many
    ownership: >-
      Recusal records can reference the voter’s own disclosure; suggestion
      generation does not persist recusals.
    cross_service: false
  - to: DOM-CMT-MTG-006
    cardinality: one-to-many
    ownership: >-
      Nominations own slate-decision links and the close updates nominations
      elected by its appointment consequences.
    cross_service: false
  - to: DOM-CMT-MTG-003
    cardinality: one-to-many
    ownership: >-
      A later amendment or rescission owns the link to its predecessor, so an
      original may have multiple proposed successors.
    cross_service: false
invariants:
  - id: INV-DOM-CMT-MTG-003-01
    statement: >-
      The service admits only the declared decision transitions, with
      carried-to-superseded as the sole terminal move.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/rules/decision-rules.ts:DECISION_TRANSITIONS;
      db/decisions.table.ts (frozen triggers)
  - id: INV-DOM-CMT-MTG-003-02
    statement: >-
      Opening assigns number and opening time together, and the database
      declares number uniqueness within the committee.
    enforced_at:
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/db/decisions.table.ts:decisions_number_check;
      decisions_number_uidx
  - id: INV-DOM-CMT-MTG-003-03
    statement: >-
      Asynchronous methods omit a meeting and require a deadline at opening;
      meeting methods name a meeting and reject deadlines.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/db/decisions.table.ts:decisions_meeting_method_check;
      services/rules/decision-rules.ts:openingRefusal
  - id: INV-DOM-CMT-MTG-003-04
    statement: >-
      The motion, method, snapshots and consequence inputs are declared frozen
      after draft, but migration enforcement is unverified.
    enforced_at:
      - database
    provenance: unknown
    source: FND-CMT-MTG-056
  - id: INV-DOM-CMT-MTG-003-05
    statement: >-
      The cast operation accepts one vote per frozen eligible appointment while
      open and provides no vote edit; declared database freezing begins once it
      is no longer open.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/db/votes.table.ts:votes_decision_appointment_uq;
      services/persistence/decisions.ts:castVote
  - id: INV-DOM-CMT-MTG-003-06
    statement: >-
      The service refuses a recused voter’s vote and a voted appointment’s
      recusal, and records one decision recusal while draft or open.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/db/recusals.table.ts:recusals_decision_appointment_uidx;
      services/persistence/decisions.ts:recordRecusal
  - id: INV-DOM-CMT-MTG-003-07
    statement: >-
      A decided result includes outcome, tally and recording authority, and
      superseded status retains a carried outcome.
    enforced_at:
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/db/decisions.table.ts:decisions_result_check;
      decisions_superseded_check
  - id: INV-DOM-CMT-MTG-003-08
    statement: >-
      Only the matching decision kind accepts minutes, appointment, removal or
      charter consequence inputs.
    enforced_at:
      - service
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/persistence/decisions.ts:requireConsequenceInputs;
      db/decisions.table.ts:decisions_minutes_kind_check
  - id: INV-DOM-CMT-MTG-003-09
    statement: >-
      Appointment and removal targets are checked against the deciding committee
      when drafted and again when consequences run.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/persistence/decision-targets.ts:requireOwnTargets;
      services/consequences/consequences.ts:applyConsequences
  - id: INV-DOM-CMT-MTG-003-10
    statement: >-
      The source declares the application unable to delete decisions, snapshot
      voters, votes or recusals; its grant enforcement remains unverified.
    enforced_at:
      - database
    provenance: unknown
    source: FND-CMT-MTG-056
  - id: INV-DOM-CMT-MTG-003-11
    statement: >-
      Confidential console records require decision management, and confidential
      portal records require an eligible voter relationship.
    enforced_at:
      - service
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/rules/decision-visibility.ts:consoleDecisionView;
      services/portal/portal-decisions.ts:readable
  - id: INV-DOM-CMT-MTG-003-12
    statement: The decision table declares authored version history for stored changes.
    enforced_at:
      - database
    provenance: observed
    source: >-
      services-committees:modules/decisions/db/decisions.table.ts:decisionVersions
physical:
  - committees.decisions
  - committees.decisions_versions
  - committees.decision_eligible_voters
  - committees.votes
  - committees.recusals
  - committees.committee_decision_counters
  - committees.decisions_query (the decisions dataset's view)
  - committees.votes_query (the vote dataset projection)
evidence:
  - >-
    services-committees at 36129c24: modules/decisions/db/*.table.ts;
    services/persistence/decisions.ts, decision-targets.ts, voting-rosters.ts,
    slated-nominations.ts; services/rules/*.ts;
    services/consequences/consequences.ts; services/portal/portal-decisions.ts;
    lib/governance/decision-engine.ts, decision-rules.ts;
    lib/record-merge/committees-references.ts
  - >-
    services-committees:modules/decisions/db/decisions.table.ts
    (decisions_text_frozen_check, decisions_linked_records_frozen_trigger)
  - >-
    services-committees:modules/decisions/db/decisions.table.ts (header, the
    application role may not delete); modules/tenant-lifecycle/participants.ts
    (purged through committees.purge_tenant_versions)
---
# Decision

## What It Models

A decision is a formal motion and its recorded disposition under the committee’s rules. It combines what members vote on, who may vote, recorded evidence and the effect of a carried result. Disclosures remain a separate concept even when they suggest that a voter should stand aside.

## Identity and Attributes

The stable identity exists before the committee number. Opening captures the governing rule and voter facts so later evaluation does not use a changed roster or bylaw document. Tallies and named votes are separate input methods for the same deterministic result engine.

## Relationships

Meeting methods reference a gathering and optional agenda item. Approval targets a minutes revision; appointment decisions can carry nomination slates. Amendments and rescissions refer to an earlier carried record rather than editing its motion.

## Invariants

The application checks lifecycle, eligibility, recusal, kind-specific inputs and appointment ownership. Database uniqueness and shape checks are visible in declarations. Trigger-based immutability and deletion grants require migration evidence and are not certified here.

## How It Is Stored and Shared

The decisions service owns motions, counters, snapshots, votes and recusals. Consequences share a transaction with closing and invoke owner operations, except for the recorded internal cross-module writes. Queries exposes decisions and votes. This concept declares no custom fields.

## Open Design Questions

Empty rule documents still use defaults, and unsupported rescission reversals remain open product issues. The ballot port has no production implementation. Opening also does not repeat the meeting-status check made during drafting.
