An Answer Without a Citation Is a Guess
We run semantic search over seven thousand of our own working sessions. The most important thing it does is refuse to answer. This week we open-sourced it.
Ask an AI assistant what your team decided three weeks ago and it will answer you. It will answer you fluently, in complete sentences, with the calm of a colleague who was in the room. Whether it was in the room is a separate question, and most tools are built so you can never ask it.
That is the defect. Not hallucination, exactly. Confidence without provenance. An answer without a citation is a guess wearing a suit.
The problem is architectural, not behavioral
The popular fix is to ask the model nicely. Add a line to the prompt: please cite your sources. Sometimes it does. Sometimes it invents a source, which is worse than no citation, because it converts a guess into a forgery. A model asked to behave will behave right up until the moment it does not, and you will not be able to tell which moment you are in.
We took the other road. In our retrieval engine, the citation is not a behavior, it is the data path. The synthesis layer can only assemble an answer from chunks that retrieval actually returned, and every chunk carries its address: which session, which turn, which date. The pointer is attached before the model ever sees the text. The model cannot cite what was not retrieved, because there is nothing to cite. It cannot skip the citation, because the citation is the container the content arrives in.
And when retrieval comes back empty, the system says so. That is the whole feature. It is allowed to say: nothing in your corpus answers this.
What we actually run
This is not a thought experiment. We run this engine daily over our own working corpus: 9,616 working sessions of building, debugging, and deciding, indexed down to the turn. The numbers on our site carry dated receipts, and that one does too.
The corpus is where our decisions live. Why we chose one database over another. What broke the last time we touched a subsystem. The exact wording we agreed on and then forgot we agreed on. Before the engine, recovering any of that meant an archaeology session. After, it is a query, and the part that changed how we work is not the speed. It is that every answer arrives with its receipt attached, so a surprising answer is checkable in one click instead of debatable for ten minutes.
Trust calibrates differently when the pointer is right there. You stop asking “is the tool right” and start asking “is the source right,” which is a question humans are actually good at.
The refusal is the feature
Early on, the strongest reaction anyone here had to the system was not about a good answer. It was the first time it declined one. A question about a topic the corpus genuinely did not cover came back with no confident paragraph, no plausible improvisation. Just the honest shape of the gap.
That refusal is worth more than a hundred fluent answers, because it is what makes the fluent answers mean something. A system that always answers is a system whose answers carry no information about whether it knows. A system that can say “nothing here” is making a claim every time it speaks.
We think about verification this way across the whole shop. A test suite that cannot fail proves nothing when it passes. An agent that cannot decline a task tells you nothing by accepting it. And a memory tool that cannot abstain is not remembering, it is performing memory. The abstention is what turns output into evidence.
Why we open-sourced it
This week we published the engine. It is called Marrow, it is Apache-2.0, and it is the same code we run: hybrid semantic and lexical retrieval over Postgres, reranking, and the citation contract described above. It points at your own AI coding history, it runs entirely on your own infrastructure, and there is a demo that stands up a local stack with zero API keys in about a minute. Your corpus never leaves your machine. That is not a privacy policy, it is a network diagram: there is no server of ours to send anything to.
We shipped it because in this market “trust us” is not an architecture, and we would rather show the discipline than describe it. The engine is public. The tests are public. The CI gates that scan every commit are public. If you want to know how we build client systems, you no longer have to take our word for it, which is exactly the point of this essay applied to ourselves.
An answer without a citation is a guess. Here is ours, cited.