How each refusal comes about
spend.hold: not_enough_points
1 spend.hold(checkout: checkout-1, member: member-2, pts: 1) refused: not_enough_points (move 1 takes 1 from points(member-2): posted 0, held out 0)
spend.hold: key_conflict
1 earn.hold(purchase: purchase-1, member: member-2, pts: 1) done
2 earn.post(purchase: purchase-1) done
3 spend.hold(checkout: checkout-3, member: member-2, pts: 1) done
4 spend.hold(checkout: checkout-3, member: member-2, pts: 2) refused: key_conflict
spend.hold: already_refused
1 spend.hold(checkout: checkout-1, member: member-2, pts: 1) refused: not_enough_points (move 1 takes 1 from points(member-2): posted 0, held out 0)
2 spend.hold(checkout: checkout-1, member: member-2, pts: 1) refused: already_refused
spend.post: key_conflict
1 earn.hold(purchase: purchase-1, member: member-2, pts: 2) done
2 earn.post(purchase: purchase-1) done
3 spend.hold(checkout: checkout-3, member: member-2, pts: 2) done
4 spend.post(checkout: checkout-3) done
5 spend.post(checkout: checkout-3, pts: 1) refused: key_conflict
spend.post: already_voided
1 earn.hold(purchase: purchase-1, member: member-2, pts: 2) done
2 earn.post(purchase: purchase-1) done
3 spend.hold(checkout: checkout-3, member: member-2, pts: 2) done
4 spend.void(checkout: checkout-3) done
5 spend.post(checkout: checkout-3) refused: already_voided
spend.post: expired
1 earn.hold(purchase: purchase-1, member: member-2, pts: 2) done
2 earn.post(purchase: purchase-1) done
3 spend.hold(checkout: checkout-3, member: member-2, pts: 2) done
4 pass 15 minutes spend(checkout-3) expired
5 spend.post(checkout: checkout-3) refused: expired
spend.post: over_hold
1 earn.hold(purchase: purchase-1, member: member-2, pts: 2) done
2 earn.post(purchase: purchase-1) done
3 spend.hold(checkout: checkout-3, member: member-2, pts: 2) done
4 spend.post(checkout: checkout-3, pts: 3) refused: over_hold
spend.post: no_such_hold
1 spend.post(checkout: checkout-1) refused: no_such_hold
spend.void: already_posted
1 earn.hold(purchase: purchase-1, member: member-2, pts: 2) done
2 earn.post(purchase: purchase-1) done
3 spend.hold(checkout: checkout-3, member: member-2, pts: 2) done
4 spend.post(checkout: checkout-3) done
5 spend.void(checkout: checkout-3) refused: already_posted
spend.void: expired
1 earn.hold(purchase: purchase-1, member: member-2, pts: 2) done
2 earn.post(purchase: purchase-1) done
3 spend.hold(checkout: checkout-3, member: member-2, pts: 2) done
4 pass 15 minutes spend(checkout-3) expired
5 spend.void(checkout: checkout-3) refused: expired
spend.void: no_such_hold
1 spend.void(checkout: checkout-1) refused: no_such_hold