reduce write amplification, fix search ranking
- conditional FTS trigger: only fires when handle/display_name
actually change (was: every UPDATE, even labels-only)
- chunk handleDelete into batches of 200 with 100ms pauses
(was: all 10k DIDs in one transaction)
- bulk-enrich.py: WRITE_BATCH=50, WRITE_PAUSE=0.2
(was: 500/0 — hammered turso with no breathing room)
- refreshModeration: skip no-op updates when labels/hidden
unchanged, add correlation logging (skipped, ms)
- search: 3-tier ranking (exact handle → handle prefix → FTS)
fixes jay.bsky.team being buried under offor-jay.bsky.social
- tombstones table for deletion propagation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>