Flow LedgerOperations notes / 2026

Exceptions / Field brief

Design an Exception Queue That Can Actually Empty

An exception queue needs ownership, context, priority, and a return path or it becomes permanent storage for unresolved work.

A queue diagram with intake, queue, decision, and an exception return path
Working diagram. Start with the decision, then add the system.

Exception queues are easy to create. A workflow reaches a condition it cannot handle, so the system marks the case for review. The design appears safe because the unusual item did not continue automatically. The hard question comes next: how does the queue empty?

Many queues answer that question poorly. Items arrive with a generic error, no clear owner, and no time boundary. Reviewers must reconstruct the original request, search other systems, and guess which rule failed. Easy cases leave first. Difficult cases age until a customer asks for an update or a manager requests a cleanup.

Store the reason, not only the state

“Needs review” is a state. It is not a reason. The queue record should say which test failed, what value caused the failure, what evidence was available, and what decision is now required. It should also keep the important source references so that the reviewer does not have to repeat the original work.

Use a small set of specific exception classes. Examples include missing evidence, conflicting evidence, policy ambiguity, duplicate request, unavailable dependency, and system failure. Do not make the list so detailed that people choose a random value. The class should help route the case and explain the next action.

Give ownership to a role

A queue assigned to “operations” is not owned. Assign each class to a role that has both the knowledge and authority to resolve it. Name a backup role for absences. When the exception needs a policy decision, route it to the policy owner rather than asking an operator to invent a rule.

Ownership must persist while the case is waiting. A dependency can block action, but it does not remove responsibility. The owner still watches the clock, records contact attempts, and escalates when the wait crosses the agreed boundary.

Separate priority from age

Oldest-first processing is simple, but age is not the only risk. A recently blocked payroll change can be more urgent than an older request for an optional report. Define priority from consequence, deadline, affected people, and recoverability. Then show age inside each priority group.

Do not allow “urgent” to become a manual escape hatch. Record why a case has higher priority and who applied the classification. Review the pattern later. Repeated urgent cases can show that the normal workflow has the wrong service level or an upstream team is submitting work too late.

Define the return path

Resolution is not the same as closure. After a reviewer supplies missing information or makes a decision, the case must return to a known point in the workflow. Restarting from the beginning can duplicate completed work. Returning too far forward can skip a control that depends on the new information.

Record the re-entry step for each exception class. Then run the normal validations again from that point. If a reviewer can override a validation, store the reason, authority, and time of the override. The audit trail should show both the original failure and the approved disposition.

Learn from the queue

Measure arrivals, departures, age, repeat cases, resolution reasons, and reopenings. A falling queue can still be unhealthy if reviewers close cases without solving them. Reopenings and repeated exceptions are useful countermeasures to that false improvement.

Review the largest exception classes with the teams that create and resolve them. Some exceptions need clearer request forms. Some need better system integration. Some reveal a policy that cannot be applied consistently. Fixing the source is usually more valuable than adding reviewers.

An exception queue is part of the workflow, not a warehouse beside it. It is healthy when every case arrives with context, belongs to a capable owner, has a meaningful clock, and follows a defined path back into the work.