---
id: WF-CMT-MTG-013
title: Open Disclosure Obligations and Start Forms
trigger: >-
  The daily decisions job runs at 05:41 UTC, or staff request an obligation’s
  form.
product_area: committees
module: meetings
revision: 1
status: draft
design_intent: proposed
implementation_evidence: partially-observed
inference: []
source_sha:
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
implements:
  - CAP-CMT-MTG-014
moves:
  - STATE-CMT-MTG-007
crosses:
  - SVC-CMT-MTG-decisions
  - SVC-PFM-NOT-communications
idempotency: >-
  Appointment and period uniquely identify an obligation. Form starts send the
  disclosure as the stable external key and reuse a stored submission; receiver
  deduplication is not independently verified.
concurrency: >-
  Obligation creation uses one transaction per workspace. Form creation calls
  outside the transaction, then locks the disclosure and keeps the first stored
  submission; review status is not rechecked after the call.
hops:
  - 'n': 1
    actor_or_service: Decisions jobs
    action: >-
      Calculate the owed period and due date for each current voting appointment
      under workspace settings.
    anchor: >-
      services-committees:modules/decisions/services/rules/disclosure-period.ts:disclosurePeriodOf
    seam: schedule
    on_failure: Record a failed workspace and continue.
    left_inconsistent: Obligations may be delayed until the next daily pass.
    observer: Job results and execution logs.
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/rules/disclosure-period.ts:disclosurePeriodOf
  - 'n': 2
    actor_or_service: Decisions jobs
    action: Insert each new obligation and prepare its due notice.
    anchor: >-
      services-committees:modules/decisions/services/disclosures/disclosures.ts:openDisclosureObligations
    seam: sync
    on_failure: A skipped notice is not retried because the obligation already exists.
    left_inconsistent: A member can owe a disclosure without having been notified.
    observer: Function logs provide the only staff signal.
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/disclosures/disclosures.ts:openDisclosureObligations
  - 'n': 3
    actor_or_service: Decisions API
    action: Start the Submissions form with no database transaction open.
    anchor: >-
      services-committees:modules/decisions/services/disclosures/disclosures.ts:requestDisclosure
    seam: sync
    on_failure: Reject an unavailable engine response.
    left_inconsistent: No submission reference is saved.
    observer: The operation response.
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/disclosures/disclosures.ts:requestDisclosure
  - 'n': 4
    actor_or_service: Decisions API
    action: >-
      Lock the disclosure and store the returned submission and request time,
      retaining an existing first submission.
    anchor: >-
      services-committees:modules/decisions/services/persistence/conflict-disclosures.ts:rewriteDisclosure
    seam: sync
    on_failure: Reject a supplied stale version after the external start.
    left_inconsistent: The external form can exist before its local reference is recorded.
    observer: The operation response.
    provenance: observed
    source: >-
      services-committees:modules/decisions/services/persistence/conflict-disclosures.ts:rewriteDisclosure
branches: []
waits: []
evidence:
  - >-
    services-committees at 36129c24:
    modules/decisions/services/disclosures/disclosures.ts;
    services/rules/disclosure-period.ts;
    services/persistence/conflict-disclosures.ts;
    modules/recruitment/ports/submissions-engine.ts
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-LOG-001
  - TC-LOG-002
  - TC-LOG-003
  - TC-LOG-004
  - TC-LOG-005
  - TC-AVL-004
  - 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
---
# Open Disclosure Obligations and Start Forms

## What It Does

The daily decisions job runs at 05:41 UTC, or staff request an obligation’s form. The production Submissions port reports unavailable. Even with a future receiver, the request has a review race because its final write does not repeat the initial accepted-or-flagged check. Obligation deduplication also means skipped due notices have no daily recovery.

## The Flow

```mermaid
flowchart TD
  H1["Calculate the owed period and due date for each current voting appointment under workspace settings."]

  H2["Insert each new obligation and prepare its due notice."]
  H3["Start the Submissions form with no database transaction open."]
  H4["Lock the disclosure and store the returned submission and request time, retaining an existing first submission"]
  H1 --> H2
  H2 --> H3
  H3 --> H4
```

Calculate the owed period and due date for each current voting appointment under workspace settings. Insert each new obligation and prepare its due notice. Start the Submissions form with no database transaction open. Lock the disclosure and store the returned submission and request time, retaining an existing first submission.

## When Something Fails

Record a failed workspace and continue. Obligations may be delayed until the next daily pass. A skipped notice is not retried because the obligation already exists. A member can owe a disclosure without having been notified. Reject an unavailable engine response. No submission reference is saved. Reject a supplied stale version after the external start. The external form can exist before its local reference is recorded.

## Open Design Questions

The production Submissions port reports unavailable. Even with a future receiver, the request has a review race because its final write does not repeat the initial accepted-or-flagged check. Obligation deduplication also means skipped due notices have no daily recovery.
