After a successful sync, LastAppliedFilterHash is not written to the database — only LastSyncHash is persisted. On the next coordinator cycle, isFilterChanged computes the current filter hash and compares it against the stored value. Because the stored value is never updated, any source whose filter was changed and synced once will continue to appear as "filter changed" on every subsequent cycle, triggering unnecessary re-syncs indefinitely.
LastAppliedFilterHash should be included in the status update written on successful sync completion.
After a successful sync, LastAppliedFilterHash is not written to the database — only LastSyncHash is persisted. On the next coordinator cycle, isFilterChanged computes the current filter hash and compares it against the stored value. Because the stored value is never updated, any source whose filter was changed and synced once will continue to appear as "filter changed" on every subsequent cycle, triggering unnecessary re-syncs indefinitely.
LastAppliedFilterHash should be included in the status update written on successful sync completion.