Requires every factual claim in a grounded answer to cite a retrieved authorized chunk, refuse or hedge unsupported statements, and inherit source ACLs so citations never expose hidden documents.
Package status: reference context ready for human review. The contract and test scenarios are complete, but no claim is made that an adopting implementation has passed them.
Decision
Every factual claim in a grounded question-answer response must cite at least one retrieved chunk the caller is authorized to see. When retrieval does not support a claim, the system refuses that claim or marks it as unsupported rather than inventing a source. Citation objects inherit the ACL of the underlying chunk; a user who cannot open a document never receives its identifier, snippet, or title as a citation.
Scope
- Grounded answers over an authorized retrieval set for a single authenticated principal.
- Claim segmentation, citation attachment, unsupported-claim handling, source-visibility redaction, and answer-level refusal.
- Backend answer contract consumed by any client that displays citations.
Outside this block
- Retrieval ranking, chunking strategy, or embedding model choice.
- Prompt-injection defenses for tool or instruction channels, which are a separate control.
Contract
- Each factual sentence or structured claim carries a non-empty
citation_idslist whose members exist in the current retrieval set. - A claim with empty support is omitted, replaced by an explicit hedge, or causes a full
unsupported_answerrefusal when the question requires that fact. - Citation payloads include only fields the principal can already read: no hidden path, owner, or sibling-document leak.
- Citations are bound to chunk identifiers from this turn's retrieval, not to model-recalled URLs.
- The answer records
grounding_statusofcited,hedged, orrefusedfor every claim the policy classified as factual. - Regenerating the answer with the same retrieval set and policy version cannot introduce a new unsourced factual claim.
Implementation
- Classify claims after generation against the retrieval set using span overlap or an approved entailment check; do not trust model-reported citations.
- Strip any citation whose chunk ACL fails for the session identity before serialization.
Failure handling
- If citation validation fails after generation, do not stream the unsourced claim; hedge or refuse the turn.
- If a chunk is revoked between retrieval and render, drop its citations and re-evaluate remaining support.
Verification
- Fixture answers with planted unsupported claims must fail the contract checker.
- ACL tests use two principals on the same corpus and assert citation sets never cross.
The executable-looking examples in this package are fixtures and acceptance contracts. Run
python tools/validate.py from the collection root to check package structure and metadata; then
implement and execute the scenarios in the target repository.
Adoption assumptions
- Names and numeric values in
example.yamlare an adoption profile, not universal defaults. - The adopting team must map actors, data classes, error vocabulary, and ownership to its system.
References
- No external normative source is required; this package defines a project decision for grounded question answering.