18acd9f6e8
Slice 3 of search-core. Search results now show WHY they matched: a ts_headline body fragment with matched terms highlighted. The API returns U+E000/U+E001 sentinels around matches (NOT HTML); the client tokenises them into escaped <mark> React elements, so untrusted email content can never inject markup (no dangerouslySetInnerHTML). Subtle accent tint. Only when there's a free-text query (browse unchanged); projection branched (no DB function in a ternary) for unambiguous EF translation. Verified: build + all 40 tests; ts_headline output shape in raw Postgres; and the ranked+headline EF query proven to translate + execute against a live Postgres via a throwaway test (removed). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>