#4243 fixed one door. Scribe has three semantic searches over three chunk
tables, and all three collapsed chunk rows to the best one per record — each
of them KNEW which passage earned the hit, and each dropped it. Every surface
downstream then previewed the head of the document instead: a span the search
had already scored lower, with nothing saying so.
Mechanism, one place:
- embeddings.record_best_chunk publishes {id: {index, text}} into `report`.
Carried in `report`, NOT the return value: all three return
list[tuple[float, Record]] and ~30 sites unpack that pair (lesson #4207).
- semantic_search_rules and semantic_search_milestones now select
chunk_index/chunk_text and publish the winner, as notes already did.
semantic_search_milestones gains `report`, which it had no way to take.
- services/text.matched_excerpt is the one choice of span, and
excerpt_fields the one result block. Doors keep their own field names —
the web renders `snippet`, MCP returns `excerpt` — because renaming a
field a frontend reads is a different change from fixing what goes in it.
Surfaces:
- knowledge.query_knowledge, whose own comment calls it "the human's MAIN
search surface", was `(note.body or "")[:200]` on every row alike. Now the
matched passage on a search, the opening on a browse, and `snippet_is`
saying which. KnowledgeView renders that snippet, so this was live.
- search(content_type='milestone') gains `matched` — the plan body stays
out, but the passage that matched comes along, because recognising a plan
means recognising the part you asked about and a description written at
the start need not mention it.
- The auto-inject menu and the write-path prior-art menu put the passage
under their line. Both were title-only, which answers "does this apply?"
for a lesson or snippet (the trigger is IN the title) and not at all for
an issue or dev-log. No fallback to the body's opening: on a menu that is
preamble dressed as a reason, and once indented it cannot be told apart.
Left alone deliberately: the rule arms. A rule hint already renders the rule's
TRIGGER, which is written to answer exactly "does this apply to me" and beats
a matched chunk at it; and that line's budget was measured at #3851. Adding a
passage there would duplicate the trigger and spend the budget twice.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01821k5B3Ysecp9fNYs92Kuy