fix: sync publications incrementally (close 852-row replica gap)
publications were silently omitted from incrementalSync — they only
synced on fullSync (first boot), so every publication added after
the initial sync stayed invisible to the local replica forever.
turso had 4,476 publications, replica had 3,624.
root cause: publications table had no indexed_at column, so there
was no incremental cursor.
- schema: add publications.indexed_at + one-time backfill to now()
- indexer.insertPublication: stamp indexed_at via ON CONFLICT DO UPDATE
(was INSERT OR REPLACE with no timestamp)
- sync.incrementalSync: add publications fetch mirroring documents,
with its own labeled block so a failure falls through to tombstones
- sync_span gains new_pubs attribute alongside new_docs/deleted
- local replica schema + migration gain publications.indexed_at
- fullSync publications SELECT now includes indexed_at column
the schema backfill sets every existing publication's indexed_at to
the deploy timestamp, which means the first post-deploy incremental
sync pulls all 4,476 rows down in one shot (~1 round trip).
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>