The Problem: Some decisions belong to whoever holds a role — any onboarding specialist can clear a candidate. Others belong to a specific relationship — the requester's own line manager. A single hard-coded approval chain can express one of those, not both.
My Solution: Each step names how its actor is resolved: a role queue, a specific user, a dynamic relation such as “the requester's manager”, or the system itself. Steps are typed — form entry, approval with branching outcomes, task trigger, or automatic — and transitions map an action code to the next step. The configuration screen edits a draft version, and activating it makes it the live flow.


