---
id: STATE-MBR-MEM-006
title: Membership application status
object: DOM-MBR-MEM-004
product_area: membership
module: memberships
revision: 1
status: draft
design_intent: proposed
implementation_evidence: partially-observed
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
states:
  - name: draft
    meaning: The stored engine vocabulary represents an unsubmitted request.
  - name: submitted
    meaning: The request is recorded as submitted to the engine.
  - name: in_review
    meaning: The stored status represents engine review in progress.
  - name: awaiting_applicant
    meaning: The recorded decision asks for further applicant work.
  - name: decided
    meaning: 'Approval, conditional approval or rejection has been recorded.'
  - name: withdrawn
    meaning: The recorded decision withdraws the request.
  - name: closed
    meaning: The recorded decision closes the request.
transitions:
  - from: draft
    to: decided
    trigger: 'Submissions delivers approval, conditional approval or rejection.'
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record decision facts; approved purchase processes continue to order
        placement, while rejection closes pending terms.
      - Acknowledgement follows successful required work.
    who: Submissions engine; the decision handler
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: draft
    to: awaiting_applicant
    trigger: Submissions asks the applicant for revised information.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record the request for applicant changes and acknowledge when the port
        succeeds.
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: draft
    to: withdrawn
    trigger: Submissions delivers withdrawal.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record withdrawal, close pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: draft
    to: closed
    trigger: Submissions delivers closing.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record closing, cancel pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: submitted
    to: decided
    trigger: 'Submissions delivers approval, conditional approval or rejection.'
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record decision facts; approved purchase processes continue to order
        placement, while rejection closes pending terms.
      - Acknowledgement follows successful required work.
    who: Submissions engine; the decision handler
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: submitted
    to: awaiting_applicant
    trigger: Submissions asks the applicant for revised information.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record the request for applicant changes and acknowledge when the port
        succeeds.
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: submitted
    to: withdrawn
    trigger: Submissions delivers withdrawal.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record withdrawal, close pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: submitted
    to: closed
    trigger: Submissions delivers closing.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record closing, cancel pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: in_review
    to: decided
    trigger: 'Submissions delivers approval, conditional approval or rejection.'
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record decision facts; approved purchase processes continue to order
        placement, while rejection closes pending terms.
      - Acknowledgement follows successful required work.
    who: Submissions engine; the decision handler
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: in_review
    to: awaiting_applicant
    trigger: Submissions asks the applicant for revised information.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record the request for applicant changes and acknowledge when the port
        succeeds.
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: in_review
    to: withdrawn
    trigger: Submissions delivers withdrawal.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record withdrawal, close pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: in_review
    to: closed
    trigger: Submissions delivers closing.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record closing, cancel pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: awaiting_applicant
    to: decided
    trigger: 'Submissions delivers approval, conditional approval or rejection.'
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record decision facts; approved purchase processes continue to order
        placement, while rejection closes pending terms.
      - Acknowledgement follows successful required work.
    who: Submissions engine; the decision handler
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: awaiting_applicant
    to: awaiting_applicant
    trigger: Submissions asks the applicant for revised information.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record the request for applicant changes and acknowledge when the port
        succeeds.
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: awaiting_applicant
    to: withdrawn
    trigger: Submissions delivers withdrawal.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record withdrawal, close pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: awaiting_applicant
    to: closed
    trigger: Submissions delivers closing.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record closing, cancel pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: decided
    to: decided
    trigger: 'Submissions delivers approval, conditional approval or rejection.'
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record decision facts; approved purchase processes continue to order
        placement, while rejection closes pending terms.
      - Acknowledgement follows successful required work.
    who: Submissions engine; the decision handler
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: decided
    to: awaiting_applicant
    trigger: Submissions asks the applicant for revised information.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record the request for applicant changes and acknowledge when the port
        succeeds.
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: decided
    to: withdrawn
    trigger: Submissions delivers withdrawal.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record withdrawal, close pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: decided
    to: closed
    trigger: Submissions delivers closing.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record closing, cancel pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: withdrawn
    to: decided
    trigger: 'Submissions delivers approval, conditional approval or rejection.'
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record decision facts; approved purchase processes continue to order
        placement, while rejection closes pending terms.
      - Acknowledgement follows successful required work.
    who: Submissions engine; the decision handler
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: withdrawn
    to: awaiting_applicant
    trigger: Submissions asks the applicant for revised information.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record the request for applicant changes and acknowledge when the port
        succeeds.
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: withdrawn
    to: withdrawn
    trigger: Submissions delivers withdrawal.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record withdrawal, close pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: withdrawn
    to: closed
    trigger: Submissions delivers closing.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record closing, cancel pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: closed
    to: decided
    trigger: 'Submissions delivers approval, conditional approval or rejection.'
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record decision facts; approved purchase processes continue to order
        placement, while rejection closes pending terms.
      - Acknowledgement follows successful required work.
    who: Submissions engine; the decision handler
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: closed
    to: awaiting_applicant
    trigger: Submissions asks the applicant for revised information.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - >-
        Record the request for applicant changes and acknowledge when the port
        succeeds.
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: closed
    to: withdrawn
    trigger: Submissions delivers withdrawal.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record withdrawal, close pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
  - from: closed
    to: closed
    trigger: Submissions delivers closing.
    guard: >-
      The typed application exists and the decision is first, repeated or
      explicitly supersedes the recorded decision.
    side_effects:
      - 'Record closing, cancel pending terms and acknowledge when available.'
    who: Submissions engine
    provenance: observed
    source: >-
      services-membership:modules/applications/services/decisions/decision-handler.ts:transitionOf,
      handleDecision, STATUS_OF
invalid: []
concurrency: >-
  The application is locked during decision recording. Ordering and
  acknowledgement happen after that transaction; failure leaves committed
  decision facts available for retry.
invariants:
  - INV-DOM-MBR-MEM-004-02
  - INV-DOM-MBR-MEM-004-03
  - INV-DOM-MBR-MEM-004-06
evidence:
  - >-
    services-membership at 5994c270:
    modules/applications/db/application-vocabularies.ts;
    services/decisions/decision-handler.ts; contracts/decision-delivered.ts
---

# Membership application status

## The Lifecycle

```mermaid
stateDiagram-v2
  state draft
  state submitted
  state in_review
  state awaiting_applicant
  state decided
  state withdrawn
  state closed
  draft --> decided
  draft --> awaiting_applicant
  draft --> withdrawn
  draft --> closed
  submitted --> decided
  submitted --> awaiting_applicant
  submitted --> withdrawn
  submitted --> closed
  in_review --> decided
  in_review --> awaiting_applicant
  in_review --> withdrawn
  in_review --> closed
  awaiting_applicant --> decided
  awaiting_applicant --> awaiting_applicant
  awaiting_applicant --> withdrawn
  awaiting_applicant --> closed
  decided --> decided
  decided --> awaiting_applicant
  decided --> withdrawn
  decided --> closed
  withdrawn --> decided
  withdrawn --> awaiting_applicant
  withdrawn --> withdrawn
  withdrawn --> closed
  closed --> decided
  closed --> awaiting_applicant
  closed --> withdrawn
  closed --> closed
```

## Transitions Explained

The row uses Submissions status names, but the decision handler does not enforce a progression from draft through review. A first or superseding decision can set its outcome status from any existing status. Repeats leave decision facts unchanged while allowing unfinished ordering or acknowledgement to resume.

## What Cannot Happen

A delivered decision that neither repeats nor supersedes the recorded decision is ignored. Unknown submissions are not created by this handler and receive no acknowledgement.

## Concurrency and Timing

The application is locked during decision recording. Ordering and acknowledgement happen after that transaction; failure leaves committed decision facts available for retry.
