# Tutorial 4: Human Tasks with OnComplete Flows The approve/reject pattern — the most common human task flow in insurance workflows. ## Concepts Introduced - `WorkflowHumanTask.For()` — define a task with name, type, route, and roles - `.WithPayload()` — data sent to the UI when the task is displayed - `.WithTimeout(seconds)` — optional deadline for the task - `.WithRoles()` — restrict which roles can interact with this task - `.OnComplete(flow => ...)` — sequence executed after user completes the task - `.ActivateTask()` — pause workflow and wait for user action - `.AddTask()` — register a task in the workflow spec (separate from activation) - Re-activation — send the user back to the same task on validation failure ## Approve/Reject Pattern 1. Workflow starts, runs some service tasks 2. `.ActivateTask("Approve")` — workflow pauses 3. User sees the task in their inbox, assigns it, submits an answer 4. `.OnComplete` checks `payload.answer`: - `"approve"` — run confirmation operations, convert to policy - `"reject"` — cancel the application 5. If operations fail, re-activate the same task for correction ## Variants - [C# Fluent DSL](csharp/) - [Canonical JSON](json/) ## Next [Tutorial 5: Sub-Workflows](../05-sub-workflows/) — inline vs fire-and-forget child workflows.