Sparked by another discussion (#3721), it seemed useful to open an issue on transaction expiration.
It has been my longstanding contention that transaction lifetimes should be more deterministic. If a transaction does not confirm within a set period, the mempool should forget it, rather than accumulating garbage and leaving the transaction in limbo.
One proposal bandied about on IRC is to expire any transaction from the memory pool, that does not confirm within X blocks. Proposed value for X is 2 days, 144*2.
It is always the responsibility of the client to retransmit a transaction until it is confirmed. If a client ceases retransmission, and waits X blocks, they have a reasonable chance of presuming the network has forgotten the transaction [assuming the network has mostly upgraded]. That enables the client to recover the dead transaction, including double-spending with a higher fee.
This seems to accomplish two useful goals: preventing the mempool from accumulating garbage, and making transaction lifetime more deterministic [within a certain probability].
Related: mempool superblock redesign (#3723).