Two fixes:
1. Divergent-target flush (Codex ID=2962544342): when replyTargetDiverged is true
the flush is skipped to avoid creating a preview in the wrong thread, but the
patch interval was not stopped and any in-flight first sendMessageMattermost
was not awaited. If that send resolved after the divergent delivery returned,
it created a stray preview post with no cleanup path. Fix: always stop the
interval and wait for patchSending to settle (up to 2s) even on the divergent
path, so streamMessageId is populated if the send resolves during this window
and the orphan cleanup below can capture and delete it.
2. Patch-failure retry storm (Codex ID=2962544347): after a patchMattermostPost
failure in the schedulePatch interval, streamMessageId remained set and every
subsequent 200ms tick retried the same failing request, spamming the API until
final delivery. Fix: call stopPatchInterval() in the catch block so retries
stop immediately. The preview stays frozen at its last successful text; deliver()
will patch or replace it when the final reply arrives.