//! Change-detection rules between the source and our DB. //! //! | Event | Signal | //! |--------------------|----------------------------------------------------------------------------------------| //! | New manga | `(source_id, source_manga_key)` not in `manga_sources` | //! | Updated metadata | freshly computed `metadata_hash` differs from the stored one | //! | Dropped manga | `last_seen_at < discover_run_started_at` for N consecutive successful discover runs | //! | New chapter | `(source_id, source_chapter_key)` not in `chapter_sources` | //! | Dropped chapter | present in DB but absent from the latest `fetch_chapter_list` for the same manga | //! //! Dropped is always a soft flag (`dropped_at`), never a row delete — //! restoring is a matter of clearing the flag if the source brings the //! item back. //! //! Scaffold only — implementations land once `repo::crawler` exists.