If your program can’t answer “what stage is this in?” without opening a thread, you don’t have a workflow—you have folklore.
States should match how decisions happen
We name states after operational reality: submitted, incomplete, under review, approved, waitlisted, appealed—not generic buckets like “open.”
Queues turn volume into throughput
- Role-based queues with SLAs and ownership
- Bulk actions for repetitive corrections
- Escalation paths that preserve context
Events beat screenshots for accountability
A state change should emit an event you can replay: who moved it, from where to where, and what evidence was attached. That is how you answer audits without archaeology, and how you debug “it worked on my machine” class issues in production workflows.
When intake is modeled this way, reporting becomes honest: you can see backlog by reason, not just “how many emails arrived today.”

