In a seller-abuse review queue, what goes wrong when cases are worked in expected-loss order rather than arrival order?
answer
- highest value first is not the whole rule
- a static key never lifts old cases
- waiting must raise priority
- a deadline lane preempts the ranking
- expiry is an action, not an absence
basics
~10 sLow-value cases starve. Each day's high-loss arrivals jump the queue, so a cheap case can sit for weeks, breach its time-to-decision target and eventually expire unworked while an honest seller waits in limbo.
solid answer
~40 sRanking by expected loss — roughly score times value at risk — maximises loss prevented per analyst hour, which is the right default. The failure is starvation: the ranking key never rises for an old cheap case, so new arrivals permanently outrank it. The fixes are an ageing term that lifts a case as it approaches its deadline, a deadline lane that preempts everything once the target is breached, and a pre-agreed default action when a case expires unworked, so expiry is a decision rather than an accident. Some teams also reserve a slice of capacity for strict arrival order as a starvation backstop.
code
pseudocode · 16 linestargetDecisionHours = 24
agingWeight = 2.0
priorityKey(case):
exposure = pendingPayout(case) + openOrderValue(case)
baseLoss = case.riskScore * exposure
ageHours = now() - case.flaggedAt
urgency = ageHours / targetDecisionHours
if urgency >= 1.0:
return DEADLINE_LANE // worked oldest first, preempts the ranking
return baseLoss * (1 + agingWeight * urgency)
onShiftEnd(case):
if case.stillOpen and case.ageHours > expiryHours:
applyDefaultActionFor(case.band) // chosen in advance, not improvised
record(case, decision = "expired unworked")go deeper
Recall that a review queue is ranked, not first-come-first-served, and that ranking without an ageing rule leaves some cases waiting indefinitely.
Explain the priority key: risk score times value at risk, an ageing factor that grows with waiting, and a deadline lane once the target is breached.
Show the operational consequence — p95 time to decision, an oldest-open-case level, and an expiry action recorded as a decision with an alarm on its rate.
Name the trade you are making between prevented loss per analyst hour and a bounded wait for honest sellers, and say which one the platform commits to publicly.
## Two orders, two failure modes A human review queue has to be worked in some order, and the two obvious ones fail in opposite directions. | Ordering | What it optimises | How it fails | |---|---|---| | Arrival order (first in, first out) | Fairness and a predictable wait for every seller | An analyst spends 7.5 minutes on a trivial case while a large pending payout waits behind it | | Expected-loss order | Loss prevented per analyst hour | Cheap cases are outranked by every new arrival and never come up | Expected loss is the sensible default key: roughly the risk score multiplied by **value at risk** — pending payout, open orders, the exposure the platform carries if the account really is abusive. Working that order first means the shift's fixed hours buy the most prevented loss. ## Why pure expected-loss order starves the tail The key is **static with respect to waiting**. A case scored yesterday with a small exposure has the same priority tomorrow, and tomorrow brings a fresh batch of arrivals, some of which outrank it. Because the queue is sized to be worked, not emptied, the bottom of the ranking is never reached. Three things follow: - **An honest seller sits in limbo indefinitely.** Their listing is demoted, their payout held, and no one has decided anything. From the seller's side that is indistinguishable from a silent penalty. - **Time to decision at p95 becomes meaningless.** The median case looks healthy while a long tail ages without bound, which is exactly the shape a mean hides. - **Expiry becomes the real policy.** If nothing defines what happens to an unworked case, the queue's overflow behaviour — usually "it stays as it is" — is emitting the platform's action, and nobody chose it. ## The ageing fix Add a term that makes waiting raise priority, and a hard lane for cases at their deadline: 1. Compute the base key from expected loss. 2. Multiply it by an ageing factor that grows with how far the case has travelled toward its time-to-decision target. 3. Once the target is breached, move the case into a **deadline lane** that preempts the ranked queue and is worked oldest first. The ageing weight is the dial between the two pure orders: at zero you have expected-loss order and starvation; very large, you have arrival order and wasted analyst hours. Tune it by watching p95 time to decision and prevented loss per shift together, since moving it trades one against the other. ## Expiry has to be a decision Every case needs a rule for what fires if it reaches its deadline unworked, and that rule should be an action, not a shrug. The usual choices, in increasing severity: release to normal (accept the loss), keep the limit in place while the case ages further, or apply the automatic action for its score band. Two things make it a real decision rather than an accident: - **Record it as a decision**, with the reason "expired unworked", so the volume of expiries is visible in the same place as analyst verdicts. - **Alarm on the rate.** A rising expiry count is the earliest honest signal that the band is sized above the shift, and it appears days before anyone complains. ## Reserving capacity as a backstop Ageing is a soft guarantee — under a heavy enough spike, even an aged case can be outranked. A harder version reserves a fixed slice of the shift (say one analyst-hour in ten) for strict arrival order, so the oldest cases drain at a floor rate whatever the ranking does. It costs a little prevented loss for a bounded worst-case wait, which is usually the right trade when the queue holds decisions about honest sellers. ## What to measure - Time to decision at p50 and **p95**, per band and per ordering lane. - The age of the oldest open case, watched as a level rather than an average. - Expiries per day, by the action that fired. - Prevented loss per analyst hour, so that tightening the ageing weight shows its cost instead of looking free.
- How would you tune the ageing weight?Watch two numbers together: p95 time to decision and prevented loss per analyst hour. Raising the weight pulls old cheap cases forward, which improves p95 and costs prevented loss; lowering it does the reverse. Set the target on p95 first, because that is a commitment to sellers, then take the best prevented loss available under it.
- Why rank on expected loss rather than on the risk score alone?Because analyst hours are the scarce resource and the score alone ignores exposure. A very high score on an account with no pending payout prevents almost nothing, while a moderate score on a large payout carries most of the day's risk. Multiplying the score by value at risk ranks by what a review actually saves.
It is hospital triage rather than a ticket line: the most urgent case goes first, but everyone still has a clock on them, and someone who has waited too long gets seen whatever else walks through the door.
saying these in an interview costs you the question
- Assuming expected-loss order is fair to every seller
- Treating an unworked case as simply not yet decided
- Believing new arrivals cannot permanently outrank older cases
- Reporting only the mean time to decision, never p95
- Leaving the expiry behaviour to whatever the queue happens to do