e5bce4df4b
Self-review of the generation marker. MAX(ended_at) alone is wall-clock: an NTP correction between two resets writes a SMALLER boundary, MAX keeps returning the older one, and the next conversation silently reuses the previous generation -- two conversations on one routing key, which is the defect this PR exists to remove. latest_conversation_boundary now returns (count, latest_ended_at) and the marker is 'count:ended_at'. The two halves fail under different conditions -- a backwards clock defeats the timestamp, retention pruning of an old ended row decrements the count -- so a generation repeats only if both happen at once. The pair is deliberately biased toward changing: a spurious change costs one cold prompt-cache bucket, a repeat would merge two conversations. Pinned by test_a_backwards_clock_does_not_reuse_a_generation, which rewrites the second boundary to land before the first and asserts three conversations still resolve to three distinct scopes. Refs #96811