de0f20ff05
When the per-session pending transcript queue hits _MAX_PENDING_PER_SESSION (200) while the session DB is broken, the gateway previously popped the oldest message and discarded it permanently — silent user data loss during live operation (#78182). The on-disk pending spool only ran at shutdown via flush_pending_to_file. Extend that existing spool machinery for runtime drops: - gateway/shutdown_flush.py: add spool_dropped_transcript_message() and drain_transcript_spool(), reusing _get_flush_dir/_write_payload (same atomic-JSON pending_messages/ spool format). recover_pending_to_db() now also replays transcript_cap_drop payloads left over across restarts. - gateway/session.py: on cap eviction, spool the dropped message and log a WARNING that includes the spool path; if spooling fails, degrade to the previous drop-and-warn behavior. On the next fully successful transcript flush for that session, drain and replay spooled messages in drop order; replay failures keep the spool files for the next attempt. - tests/gateway/test_pending_queue_spool.py: drop→spool→drain roundtrip, per-session drain isolation, spool-failure degradation, replay-failure retention, and spool primitive ordering/reason filtering. No new config; extends existing flush_pending_to_file infrastructure per AGENTS.md guidance. Refs #82616, #78182