Review follow-ups (teknium1):
- One kwargs builder, two callers. transcript_append_kwargs() in
gateway/session_transcript.py builds the append_message kwargs, and both
_append_transcript_message and the spool's restart replay call it, so the
restart writer cannot lag the live writer again (display_kind and
display_metadata were added after #84785 was written). fallback_ts applies
only to a message with no timestamp; the live writer passes none, so its
rows are byte-identical.
- A failed replay says what it held back: one INFO line per pass with the
file count per blocked session, so a spool dir that never empties has a
reason in the log.
- seq is per process and ts has one-second resolution; the sort key now
says so where it reads seq.
- Tests fold to three invariants: drop order beats name order (seq breaks a
same-second tie), a replayed row is the row the live writer writes, and a
failed replay holds back that session's later messages only. The two that
already passed on main (a corrupt file is kept; the payload-clock
fallback) are dropped; the fallback is asserted inside the fidelity test.
(cherry picked from commit e2bacb06b3311b00aa354ffce7d53fc15ba44d04)