S-1 — Indexed content: frozen version bodies + title/human-id metadata of non-disposed
versions; drafts searchable by metadata only (content becomes searchable when frozen —
when it is authoritative). Disposal deletes rows synchronously (the real SearchPurge,
REQ-SRCH-011, closing the ADR-0042 no-op hook).
S-2 — Population: a SearchIndexHandler on the ADR-0034 domain events, in-transaction
(reads the frozen blob via ContentStore); async/outbox indexing deferred until non-text
extraction makes it heavy (REQ-SRCH-002's retryability revisited then).
S-3 — Schema: one scope-keyed search_index table, FORCE RLS like content
(REQ-SRCH-004, separation-suite covered), per-document-language tsconfig (english/german),
GIN index, snippet source column; rebuildable via POST /api/admin/search/reindex
(MANAGE_SYSTEM_SETTINGS-gated; REQ-SRCH-009).
S-4 — Surface:GET /api/search?q= under runAs (RLS filters; websearch_to_tsquery,
ranked, snippets, limit 20) + a navbar quick-search with a results page.