The background memory/skill review forks a new AIAgent with
conversation_history=messages_snapshot. The forked agent's _session_messages
therefore contains tool messages copied from the prior conversation. The
post-review scan that builds the user-visible 💾 summary walked the entire
_session_messages list, so historical successes (e.g. 'Cron job '...'
created.') were re-surfaced as if they had just happened — sometimes
multiple times across unrelated background-review runs.
Extract the scan into a staticmethod and skip any tool message whose
tool_call_id was already present in messages_snapshot, with a
content-equality fallback for tool messages that lack one.
Fixes#14944