RAGSpine
Decisions (ADR)

Decisions (ADR)

The architecture decision records behind RAGSpine — immutable, append-only, and superseded rather than edited.

An Architecture Decision Record (ADR) captures one significant decision: the context that forced it, the decision itself, the alternatives that were rejected, and the consequences that follow. RAGSpine keeps its ADRs as immutable historical records.

How ADRs work here

  • One decision per file. Each record is a single, self-contained choice (docs/adr/NNNN-kebab-title.md in the repo).
  • Append-only and immutable. An ADR is never edited after it is accepted. To reverse a decision, you add a new ADR that supersedes the old one — the history stays intact and auditable.
  • Supersede, don't edit. This is why a record can describe an older path (for example, pre-src/ layout file locations) without being "wrong": it documents the decision as it stood at the time.
  • Exempt from drift tracking. Because they are historical, ADRs carry no covers frontmatter and are not checked by scripts/check_doc_drift.py.

The through-line

The recurring principle across these decisions is to separate guarantees from flexibility: invariants (anti-fabrication, provenance, source isolation, dependency licensing, the security gate) are hard, deterministic, and non-pluggable, while everything else (domain, language, LLM, embedding, reranker, parsing strategy) is soft — config- or Protocol-driven.

The records

ADR 0002 is the umbrella product-direction record; it indexes the eight per-decision ADRs (0003–0010) settled in the same design interview.

#TitleSummaryStatus
0001Deterministic dual-channel over a single LLM pathTwo deterministic channels (structured numeric + narrative RAG); the LLM is confined to synthesis, never to inventing facts.accepted
0002Product direction: a general-purpose, license-clean, framework-unlocked RAG libraryThe umbrella north star; separates hard invariants from soft, config-/Protocol-driven flexibility and indexes ADRs 0003–0010.accepted
0003Audience: a general-purpose OSS library for others to build onThe primary audience is developers building their own RAG on top of RAGSpine; finance becomes one example domain, not the identity.accepted
0004Full generality: DomainProfile and arbitrary-dimension factsGeneralize fully — CompanyProfile becomes DomainProfile; the structured channel becomes a typed-fact store with arbitrary user-defined dimensions.accepted
0005Lean core; quarantine dormant capability as experimental/extrasShip only what runs in the default offline path; move OCR, real vector, and the verifier into clearly-labeled experimental modules/extras.accepted
0006Quality bar: invariants as property tests, plus one real retrieval benchmarkDefine quality as guarantees (invariants proven by property tests), plus one real labeled retrieval benchmark; punt domain accuracy to the user's data.accepted
0007Multilingual: architect for five, ship two; the rest as locale packsThread a locale seam through every layer; ship and test Chinese + English in core; Japanese / Italian / German ship as community locale packs.accepted
0008Prompts: a packaged PromptRegistry under ragspine/prompts/<locale>/Externalize prompts into packaged, locale-keyed template files behind a PromptRegistry Protocol, filled from DomainProfile at runtime.accepted
0009"Framework-free" redefined: no framework lock-in + permissive-license-onlyRedefine framework-free as no orchestration lock-in plus permissive-license-only (≤ Apache-2.0); real backends are opt-in extras for weight, not purity.accepted
0010Intent parsing: deterministic security gate + pluggable IntentParserDecouple the always-on, never-pluggable deterministic security gate from a pluggable IntentParser Protocol.accepted
0011Adopt the python-project-standard; migrate to src/ layout, keep the restAdopt the house standard as governing philosophy; align the one bounded structural invariant (src/ragspine/ layout) and accept four documented divergences.accepted

On this page