# ApprovalPolicyStep

## Description

ApprovalPolicyStep represents one ordered step in the routing chain of an `ApprovalPolicy`. Each step carries a `stepOrder` that defines its position in the chain, a human-readable `name`, and a `minimumApprovals` threshold.

## Domain Model Definitions

### Model type

Standard

### Command Definitions

- [createApprovalPolicy](../command/CreateApprovalPolicy.md)
- [updateApprovalPolicy](../command/UpdateApprovalPolicy.md)

### Query Definitions

### Models

- ApprovalPolicyStep

### Invariants

- `stepOrder` is unique within a single `ApprovalPolicy` (no two steps may share a position)
- `stepOrder` is a positive integer and represents a sequential position in the chain
- `name` is required and non-empty
- `minimumApprovals` is a positive integer and defaults to 1 when not supplied
- A step is editable while the parent policy is in `DRAFT`; once the parent transitions to `ACTIVE` or `INACTIVE`, the step is immutable

### Relationships

- **Belongs To ApprovalPolicy**: Each step references exactly one parent `ApprovalPolicy`
- **Has Many ApprovalPolicyStepAssignees**: A step owns one or more assignee rows that name the user or role who must vote on it
- **Used As Template By ApprovalStep**: At request creation time each policy step is copied into an `ApprovalStep` row that then carries runtime status independently
