---
id: CAP-SUB-SUB-011
title: Complete a stage once on an accountable basis
feature: FEAT-SUB-SUB-03
product_area: submissions
module: submissions
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
- CAP-SUB-REV-008
- CAP-SUB-REV-012
- CAP-SUB-REV-013
source_sha:
  services-submissions: 64236c19be89579ef5897aad7de3925ed3ce03bf
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
- services-submissions:docs/milestones/plans/SUBM-M1-plan.md#D7
- services-submissions:docs/milestones/plans/SUBM-M1-plan.md#S06
- services-submissions:docs/milestones/plans/SUBM-M1-plan.md#S11
- services-submissions:docs/milestones/plans/SUBM-M1-plan.md#D8
purpose: Stage completion turns the configured review count or authorized intervention into one recorded transition.
outcomes:
- Completion rules establish a reproducible basis
- Concurrent final answers produce one transition
- Exceptional completion records accountable intervention
concepts:
- CON-SUB-SUB-003
actors:
- ACT-SUB-003
- ACT-SUB-001
- ACT-SUB-007
- ACT-SUB-008
surfaces:
- console
- api
- job
preconditions: []
postconditions: []
permissions:
- key: submissions.stages.override
  where_checked: api
  scope: tenant
- key: submissions.stages.complete
  where_checked: api
  scope: global
rules:
- id: BR-CAP-SUB-SUB-011-01
  proved_by: [ATS-SUB-SUB-011-01, TST-SUB-SUB-505]
  statement: Concurrent final reviews required by a counting rule are both retained with one stage completion and
    decision, while reviews after an earlier completion obey the late-response policy.
  kind: invariant
  enforced_at:
  - service
  - database
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/integration/services/stage-runs/completion-concurrency.integration.spec.js#records
    both responses, completes the run once, and records one decision
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#SUBM-M1-S06
- id: BR-CAP-SUB-SUB-011-02
  proved_by: [ATS-SUB-SUB-011-02, TST-SUB-SUB-505]
  statement: Repeated completion changes nothing and is refused; database constraints also prevent concurrent open
    runs and multiple current decisions for an application.
  kind: invariant
  enforced_at:
  - service
  - database
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/integration/services/stage-runs/completion-concurrency.integration.spec.js#is
    refused as StaleObject and changes nothing
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#SUBM-M1-S06
- id: BR-CAP-SUB-SUB-011-03
  proved_by: [ATS-SUB-SUB-011-03, TST-SUB-SUB-522]
  statement: An all-assigned stage completes after all remaining live work answers, excludes declined, recused and
    revoked assignments and flags an empty panel as short.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met when
    nobody is pending, with the counts as its basis
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#D7
- id: BR-CAP-SUB-SUB-011-04
  proved_by: [ATS-SUB-SUB-011-04, TST-SUB-SUB-522]
  statement: A count rule completes at its required response count, retains responses from subsequently removed
    reviewers and flags a panel unable to reach that count.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met at the
    minimum, whoever is still pending
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#D7
- id: BR-CAP-SUB-SUB-011-05
  proved_by: [ATS-SUB-SUB-011-05, TST-SUB-SUB-522]
  statement: An any-one rule completes on its first submitted response and takes a rejecting recommendation as non-approval.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met by the
    first response, rejecting when it rejects
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#D7
- id: BR-CAP-SUB-SUB-011-06
  proved_by: [ATS-SUB-SUB-011-06, TST-SUB-SUB-522]
  statement: Unanimous approval fails at the first non-approving response, including an abstention.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met, not
    approving, at the first rejection, others still pending
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#SUBM-M1-S11
- id: BR-CAP-SUB-SUB-011-07
  proved_by: [ATS-SUB-SUB-011-07, TST-SUB-SUB-522]
  statement: A majority rule completes when remaining work cannot change the result, requiring more than half and
    treating a final even split as non-approval.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met, approving,
    when approvals are more than half of those expected, others pending
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#SUBM-M1-S11
- id: BR-CAP-SUB-SUB-011-08
  proved_by: [ATS-SUB-SUB-010-12, ATS-SUB-SUB-011-08, ATS-SUB-SUB-011-12, ATS-SUB-SUB-011-13, ATS-SUB-SUB-011-14, ATS-SUB-SUB-013-12, ATS-SUB-SUB-014-11, ATS-SUB-SUB-015-11, ATS-SUB-SUB-016-15, TST-SUB-SUB-504]
  statement: Completion expires outstanding assignments unless late responses are allowed and atomically advances
    review or records the decision.
  kind: lifecycle
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/integration/services/stage-runs/approval-not-approved.integration.spec.js#advances
    to the next stage on an approving result, whichever choice was made
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#D7
- id: BR-CAP-SUB-SUB-011-09
  proved_by: [ATS-SUB-SUB-011-09, TST-SUB-SUB-251]
  statement: Only administrators can end stages early, recording their reason, identity and current counts with
    any optional decision.
  kind: permission
  enforced_at:
  - api
  - service
  must_prove: true
  provenance: observed
  source: services-submissions:modules/review/services/stage-runs/staff-actions.ts:closeEarly
  origin: services-submissions:docs/milestones/plans/SUBM-M1-plan.md#D8
- id: BR-CAP-SUB-SUB-011-10
  proved_by: [ATS-SUB-SUB-011-10, TST-SUB-SUB-501]
  statement: Requirement stages wait for fulfillment or an authorized waiver; external completion uses a staff-only
    route, while the Commerce participant remains unavailable.
  kind: lifecycle
  enforced_at:
  - api
  - service
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/integration/services/requirements/contributions.integration.spec.js#completes
    the wait with the counts as they stand, the key still short, who and why
  origin: none
  note: The cited record provides historical or proposed rationale; it does not approve every implementation detail
    in this rule.
- id: BR-CAP-SUB-SUB-011-11
  proved_by: [ATS-SUB-SUB-011-16, TST-SUB-SUB-503]
  statement: Ended-stage mutations refuse draft saves, review submissions and assignment or staff actions according
    to their service guards.
  kind: validation
  enforced_at:
  - service
  must_prove: true
  provenance: observed
  source: services-submissions:modules/review/services/responses/response-actions.ts:saveDraft
  origin: none
- id: BR-CAP-SUB-SUB-011-12
  proved_by: [ATS-SUB-SUB-008-13, ATS-SUB-SUB-009-14, ATS-SUB-SUB-011-11, ATS-SUB-SUB-011-15, ATS-SUB-SUB-012-08, ATS-SUB-SUB-013-10, ATS-SUB-SUB-016-13, ATS-SUB-SUB-018-10]
  statement: Re-entering the same stage assigns the next run number for that application and stage.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-submissions:modules/review/tests/integration/services/stage-runs/open-stage-run.integration.spec.js#takes
    the next run_number of that stage for the submission
  origin: none
scenarios:
- id: SC-CAP-SUB-SUB-011-01
  given: The award requires both assigned reviews.
  when: Priya supplies the final response.
  then: Completion occurs immediately and the configured aggregate selects the result.
  provenance: test
  source: react-console:acceptance/submissions/playwright/journeys/review/SUB-ACC-0329.spec.ts#SUB-ACC-0329
edge_cases: []
constraints: []
depends_on:
- CAP-SUB-SUB-010
related:
- CAP-SUB-SUB-013
- CAP-SUB-SUB-014
- CAP-SUB-SUB-008
journeys:
- JNY-SUB-SUB-002
- JNY-SUB-SUB-003
open_questions: []
evidence:
- services-submissions:modules/review/tests/integration/services/stage-runs/completion-concurrency.integration.spec.js#records
  both responses, completes the run once, and records one decision
- services-submissions:modules/review/tests/integration/services/stage-runs/completion-concurrency.integration.spec.js#is
  refused as StaleObject and changes nothing
- services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met when nobody
  is pending, with the counts as its basis
- services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met at the minimum,
  whoever is still pending
- services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met by the first
  response, rejecting when it rejects
- services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met, not approving,
  at the first rejection, others still pending
- services-submissions:modules/review/tests/unit/services/completion/completion-rule.spec.ts#is met, approving,
  when approvals are more than half of those expected, others pending
- services-submissions:modules/review/tests/integration/services/stage-runs/approval-not-approved.integration.spec.js#advances
  to the next stage on an approving result, whichever choice was made
- services-submissions:modules/review/services/stage-runs/staff-actions.ts:closeEarly
- services-submissions:modules/review/tests/integration/services/requirements/contributions.integration.spec.js#completes
  the wait with the counts as they stand, the key still short, who and why
- services-submissions:modules/review/services/responses/response-actions.ts:saveDraft
- services-submissions:modules/review/tests/integration/services/stage-runs/open-stage-run.integration.spec.js#takes
  the next run_number of that stage for the submission
- react-console:acceptance/submissions/playwright/journeys/review/SUB-ACC-0329.spec.ts#SUB-ACC-0329
controls:
  - TC-AVL-001
  - TC-AVL-002
  - TC-AVL-003
  - TC-AVL-004
  - 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-DAT-001
  - TC-DAT-002
  - TC-DAT-003
  - TC-IAM-001
  - TC-IAM-002
  - TC-IAM-003
  - TC-IAM-004
  - TC-IAM-005
  - TC-IAM-006
  - 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-TEN-001
  - TC-TEN-002
  - TC-TEN-003
  - TC-TEN-004
exercised_by: [FAS-SUB-SUB-03-01, FAS-SUB-SUB-03-03, FAS-SUB-SUB-03-05, FAS-SUB-SUB-05-01, FAS-SUB-SUB-05-05]
suites: [TST-SUB-SUB-251, TST-SUB-SUB-501, TST-SUB-SUB-503, TST-SUB-SUB-504, TST-SUB-SUB-505, TST-SUB-SUB-522]
---
# Complete a stage once on an accountable basis

## Purpose

Stage completion turns the configured review count or authorized intervention into one recorded transition.

## How It Works

Each response updates the evidence available to the counting rule. The engine evaluates that evidence while holding the application's and stage's locks in order. When the rule is satisfied, completion records its basis and performs the next configured action. A completed run stays as part of review history. Administrator intervention can close a stage early or waive a requirement with an explanation. Ordinary staff authority does not imply those override powers. Requirement waits also depend on integrations that are not all available in the pinned product.

## Relationships

- `CAP-SUB-SUB-010` connects this outcome with supporting workflow behavior.
- `CAP-SUB-SUB-013` connects this outcome with supporting workflow behavior.
- `CAP-SUB-SUB-014` connects this outcome with supporting workflow behavior.
- `CAP-SUB-SUB-008` connects this outcome with supporting workflow behavior.
