Resolves ApprovalListFilter.orderBy to its effective value — 'created'
unless set — and rejects the one incoherent combination: an after cursor
encodes a position in (createdAt, id) order, where new records only ever
land PAST the cursor; under 'reviewer' order they insert anywhere, so
cursor pages would silently skip or repeat records. Every list()
implementation (both backends, both tenant views) resolves through here;
router.ts maps the throw to a 400 before a store sees the filter.
Resolves ApprovalListFilter.orderBy to its effective value — 'created' unless set — and rejects the one incoherent combination: an
aftercursor encodes a position in (createdAt, id) order, where new records only ever land PAST the cursor; under 'reviewer' order they insert anywhere, so cursor pages would silently skip or repeat records. Every list() implementation (both backends, both tenant views) resolves through here; router.ts maps the throw to a 400 before a store sees the filter.