-- Capture each chapter's position in the source site's chapter list so -- the user-facing list can preserve site order: variants of the same -- chapter number (e.g. "Ch.14 : PH" next to "Ch.14 : Official") stay -- adjacent, and non-numeric entries like "notice. : Officials" land -- where the site placed them rather than clustering at the top under -- number = 0. -- -- Lower source_index = closer to the top of the source DOM = newer -- chapter on this site (it renders newest-first). The list query -- reverses this with ORDER BY source_index DESC so the oldest chapter -- appears first in our UI. -- -- NULL is the sentinel for user-uploaded chapters (no source row) and -- for crawled rows that pre-date this migration. The list query keeps -- the existing (number, created_at) tiebreak via NULLS LAST so those -- fall through to the prior behaviour until the next crawler tick -- populates the column. ALTER TABLE chapters ADD COLUMN source_index INTEGER;