data._id, MessageDraft.id, its
deriveId callback, and the generated fallback; or an existing id changed its topic, ordering key,
or filter attributes between revisions. Either change can leave an old row behind or make a
subscription filter stop receiving the row mid-life.
Fix — use one id source throughout a materialized route, and keep each row’s resolved identity
and attributes stable for its whole lifetime.