Findings from a full review of the Meilisearch implementation:
- Give the indexer its own 2m HTTP timeout instead of reusing the 800ms
search-path timeout_ms, so large document uploads to a non-loopback
Meilisearch stop timing out.
- Delete superseded indexes after a rebuild (previous active + leftover
<prefix>_rebuild_* partials); every rebuild previously leaked a full
copy of the catalog on the Meilisearch instance.
- Cache the index state row + pending count for 3s on the search hot
path (was two Postgres round trips per search request); a failed
search invalidates the cache immediately.
- Swap the active-index pointer before marking outbox events processed
so a crash between the two replays events instead of losing them.
- End pagination only on a short page; estimatedTotalHits is an
estimate and could truncate results.
- Latch the startup-resolved provider process-wide so package-level
enqueue helpers stop querying server_settings in write transactions.
- Surface dead-lettered outbox events in the admin status + web UI.
- Remove unwired provider config knobs, dedupe the manga-chapter
exclusion predicate, split the vector cache onto its own mutex, real
rebuild progress percentages, and expand client/coalesce test
coverage.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>