- Shipped
- September 2, 2026 at 8:33 AM UTC
- Author
- Kamo
- Commit
- 6e100e1
A member asked how to set their org up and got the setup checklist back, each step naming the article that explains it. All three links pointed at the same article — "Essential Setup" — and none reached the one named in the link. The knowledge base's hub articles cross-reference their siblings in plain text; the stored bodies carry no link nodes at all, so a title is all that survives into contentPlainText, which is both what gets embedded and what the assistant is shown. Retrieval handed the model a passage naming a dozen articles and the paths of only the three that matched the vector search, under a prompt ordering it to link every source it cites. It stapled the top-ranked path onto all of them, and nothing downstream checked that a link's text matched its target. RagClient now passes on the link targets the RAG service resolves out of those passages, tells the model to use only the paths it was given, and returns them alongside the sources. CitationService takes the last word: link text is the only reliable statement of intent in that output, so it, not the path, decides where a link goes — a link naming a known article is repointed at it, and one that resolves to nothing loses its href rather than opening a 404. The two RAG context builders had drifted into near-duplicates; they are one method now, so the streaming path gets the same link targets.