---
id: WF-SUB-SUB-019
title: Name contributors and collect their contributions
trigger: The flow starts with a contributor nomination or contributor response command.
product_area: submissions
module: submissions
revision: 2
status: draft
design_intent: confirmed
implementation_evidence: observed
inference: []
source_sha:
  services-submissions: 64236c19be89579ef5897aad7de3925ed3ce03bf
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
implements:
  - CAP-SUB-SUB-016
  - CAP-SUB-SUB-012
origin: >-
  Contributors addendum decisions C-01 to C-06, standing under the Reviews
  Architecture §10.1
moves:
  - STATE-SUB-SUB-014
  - STATE-SUB-SUB-015
  - STATE-SUB-SUB-006
  - STATE-SUB-SUB-007
crosses:
  - SVC-SUB-SUB-intake
  - SVC-SUB-SUB-review
idempotency: >-
  Invitations use transactionally recorded keys. Uniqueness protects a live
  request per slot and a live response per request.
concurrency: >-
  Commands lock application, open run and request in that order. Concurrent
  submissions reevaluate and complete the requirement stage once.
hops:
  - 'n': 1
    actor_or_service: Intake API
    action: >-
      Check slot eligibility, requirement timing and contributor identity,
      including unique contact matching and exceptional-request authority.
    anchor: >-
      services-submissions:modules/intake/services/contributions/naming.ts:namingProblems
    seam: sync
    on_failure: Return the naming problems.
    left_inconsistent: No contribution request is created.
    observer: The applicant side or staff.
    provenance: observed
    source: >-
      services-submissions:modules/intake/services/contributions/naming.ts:namingProblems
  - 'n': 2
    actor_or_service: Intake API
    action: >-
      Create the slotted request with hashed link credentials and reminder
      dates, request its invitation and recuse an assigned contributor.
    anchor: >-
      services-submissions:modules/intake/services/contributions/requests.ts:createContributionRequest
    seam: sync
    on_failure: Abort request creation on failure.
    left_inconsistent: Platform sends the committed invitation asynchronously.
    observer: 'The contributor, by email.'
    provenance: observed
    source: >-
      services-submissions:modules/intake/services/contributions/requests.ts:createContributionRequest
  - 'n': 3
    actor_or_service: Contributor door
    action: >-
      Authorize the link or signed-in contributor and support draft, attachment,
      submission, decline, amendment and withdrawal commands.
    anchor: >-
      services-submissions:modules/intake/services/contributions/contributor.ts:contributorContext
    seam: sync
    on_failure: Give the same neutral response for unusable links.
    left_inconsistent: A refused command preserves the contribution records.
    observer: Contributing person
    provenance: observed
    source: >-
      services-submissions:modules/intake/services/contributions/contributor.ts:contributorContext
  - 'n': 4
    actor_or_service: Review module
    action: >-
      Recalculate contribution satisfaction after submission and complete an
      eligible waiting run atomically.
    anchor: >-
      services-submissions:modules/review/services/requirements/contributions.ts:evaluateOpenContributionsRun
    seam: sync
    on_failure: Abort contribution submission if run completion fails.
    left_inconsistent: No response is committed with a partially completed requirement run.
    observer: 'The applicant, told of the receipt.'
    provenance: observed
    source: >-
      services-submissions:modules/review/services/requirements/contributions.ts:evaluateOpenContributionsRun
  - 'n': 5
    actor_or_service: Review API
    action: Record an administrative requirement waiver with its reason.
    anchor: >-
      services-submissions:modules/review/services/stage-runs/staff-actions.ts:waiveRequirement
    seam: sync
    on_failure: Reject callers without administrative authority.
    left_inconsistent: No waiver is saved on refusal.
    observer: The administrator.
    provenance: observed
    source: >-
      services-submissions:modules/review/services/stage-runs/staff-actions.ts:waiveRequirement
evidence:
  - >-
    services-submissions at 64236c19:
    modules/intake/services/contributions/*.ts;
    modules/intake/aws/api/contributions.routes.ts;
    modules/review/services/requirements/contributions.ts;
    modules/definitions/contracts/contribution-requirements.ts.
controls:
  - TC-AVL-001
  - TC-AVL-002
  - TC-AVL-003
  - TC-AVL-004
  - TC-AVL-005
  - TC-AZ-001
  - TC-AZ-002
  - TC-AZ-003
  - TC-AZ-004
  - TC-AZ-005
  - TC-AZ-006
  - TC-CRY-001
  - TC-CRY-002
  - TC-CRY-003
  - TC-CRY-004
  - TC-DAT-001
  - TC-DAT-002
  - TC-DAT-003
  - TC-IAM-001
  - TC-IAM-002
  - TC-IAM-003
  - TC-IAM-004
  - TC-IAM-005
  - TC-LOG-001
  - TC-LOG-002
  - TC-LOG-003
  - TC-LOG-004
  - TC-LOG-005
  - TC-PI-001
  - TC-PI-002
  - TC-PI-003
  - TC-PI-004
  - TC-PI-005
  - TC-PRV-001
  - TC-PRV-002
  - TC-SEC-001
  - TC-SEC-002
  - TC-SEC-003
  - TC-SEC-004
  - TC-TEN-001
  - TC-TEN-002
  - TC-TEN-003
  - TC-TEN-004
---

# Name contributors and collect their contributions

## What It Does

Naming contributors creates private request links and schedules reminders. Contribution submission can complete a waiting requirement stage within the same transaction.

## The Flow

```mermaid
flowchart TD
  H1["Intake API"]
  H2["Intake API"]
  H3["Contributor door"]
  H4["Review module"]
  H5["Review API"]
  H1 --> H2
  H2 --> H3
  H3 --> H4
  H4 --> H5
```

## When Something Fails

Return the naming problems. No contribution request is created. Abort request creation on failure. Platform sends the committed invitation asynchronously. Give the same neutral response for unusable links. A refused command preserves the contribution records. Abort contribution submission if run completion fails. No response is committed with a partially completed requirement run. Reject callers without administrative authority. No waiver is saved on refusal.

## Open Design Questions

Invitations use transactionally recorded keys. Uniqueness protects a live request per slot and a live response per request. Commands lock application, open run and request in that order. Concurrent submissions reevaluate and complete the requirement stage once.
