//! 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.
