What went wrong
Channel syncs share a worker. When one store's catalog read took a little over five minutes, a sync queued for another store behind it could be treated as stuck while it was still validly waiting.
That sync was then skipped but left showing as pending, and the store was only read again on its next hourly cadence.
What changed
GNIZDO now treats waiting in the queue separately from a sync that never reached the queue. A sync that is already queued keeps its place for up to an hour and runs normally when the worker reaches it.
If a queued sync still has not started after that, it ends as failed with a clear reason, and the existing limited automatic retry starts a fresh attempt. A sync no longer stays pending indefinitely.
What stays the same
Only one sync runs per store at a time, a sync is never executed twice, and a sync that never ran never changes the confirmed catalog.