Client sign-off flow
Most status fields are a typed prayer: anyone can change them, and nothing checks. This is the version that holds up when a client says they never approved something, because every step is on record and none of them can be skipped.
Under the hood
Each transition is a single function with explicit pre-conditions (the source state must match) and side-effects (notification, email, audit row, downstream task fanout). No state is implicit. No admin can flip a deliverable to "approved" by editing a free-text field.
The CLIENT_REVISION_REQUESTED branch is the part that earns its keep. It loops the deliverable back to DRAFT for the assignee, preserves the prior approvals as audit history, and flags the deliverable so the next submission shows reviewers exactly what was changed. The discipline pays for itself the first time a client claims something was never approved.