The dashboard seeds the message thread from the conversation payload and then
paginates backward by id (before: messages[0].id). The seed was ordered by
created_at only, so on an auto-resolve burst where the input_csat survey shares
the exact same second as trailing activity messages, a lower-id activity could
win the tie and become the seed. Backward pagination then never loads the
higher-id survey, so the CSAT bubble is missing from the conversation even
though the rating exists and is counted in reports.
Order the seed by created_at DESC, id DESC: the seed stays the chronologically
latest message (no change for delayed-webhook rows), and same-second ties
resolve to the highest id so the survey is always reachable.