Skip to content

How it holds the line

CiteNexus makes one promise: no ungrounded claim. Not “zero hallucination” — we won’t pretend the model never errs. We guarantee it never asserts what the evidence doesn’t support. Three steps stand between a question and an answer you can defend.

  1. Ground. The answer is generated at temperature 0 from retrieved passages only. The answer is written in the language you asked for; the quote stays verbatim in the source’s own language, so an English answer can carry a Telugu citation.
  2. Verify. A grounding gate runs per atomic claim. Anything unsupported is dropped before it reaches you — see the mechanism below, or the faithfulness gate for the full story of what the old predicate let through.
  3. Cite or abstain. A surviving claim resolves to a document, a page, and the verbatim passage. If nothing supports the question, CiteNexus emits the single pinned refusal string — identical in every port — rather than guessing.

Those three steps sit inside a longer pipeline — retrieve, fuse, rerank, ground, apply the authority floor, check for conflicts, then generate and gate. For where each stage runs and which module implements it, see How it works.

The gate is not a bag-of-words check, and the difference is the whole guarantee. Set containment — “every word of the claim appears somewhere in the passage” — is closed under two meaning-changing edits:

  • Reordering. “The Customer shall indemnify the Supplier” and “The Supplier shall indemnify the Customer” are the same token set and opposite obligations.
  • Deletion. not is just a token, so dropping a negation yields a strict subset — and passes.

Measured in spikes/library-stress/: that predicate accepted 9 of 9 deliberately false answers. What ships instead (ADR-0009) requires:

  1. the claim’s tokens to appear in the passage in order, preserving multiplicity, within a bounded interior gap; and
  2. every polarity marker inside the matched span to survive into the claim — drop one of two negations and it is rejected.

It is strictly narrower than the old predicate: anything it accepts, the old one accepted too, so it can only reduce what passes. Its cost is over-refusal, not under-refusal.

The pinned algorithms are byte-for-byte identical

Section titled “The pinned algorithms are byte-for-byte identical”

The deterministic pieces aren’t re-implemented per language and hoped to match — they’re pinned by a shared conformance/ suite of golden vectors. Tokenization (v1 and v2), BM25, RRF, the chunker, the language-fallback chain, EU-id derivation and the frozen gate predicate produce identical bytes in Go, JavaScript and Python, and the hermetic ask() demo below produces the same decision, answer and cited passage in all three.

Here is the hermetic flow, over the conformance corpus:

corpus := []answer.Doc{
{DocumentID: "nda", Text: "The employee shall not disclose confidential information."},
{DocumentID: "leave", Text: "Employees are entitled to thirty days of annual leave."},
{DocumentID: "termination", Text: "The contract termination clause requires ninety days written notice."},
}
// Grounded → answered, cited to "nda".
answered := answer.Ask(corpus, "Can the employee disclose confidential information?", answer.DefaultTopK)
// Unsupported → the pinned refusal.
refused := answer.Ask(corpus, "What is the capital of France?", answer.DefaultTopK)

Higher-level structure — graph and wiki — is navigation over evidence, never a citation itself. Every hit resolves down to a cited Evidence Unit before an answer is generated. You can browse the map, but the answer is always anchored to a real passage.

What this protects is the content of a citation, not the topology of the graph: an edge or a wiki link is a route to evidence, and is never itself quoted as a fact.