ADR 0009: "Framework-free" redefined — no framework lock-in + permissive-license-only
Redefine framework-free as no orchestration lock-in plus permissive-license-only; real backends become opt-in extras for install weight, not purity.
Status: accepted · Date: 2026-06-17
Immutable record. Exempt from drift tracking (no
covers). Supersede, don't edit.
Part of the 0002 product direction.
Context
The headline "framework-free / zero-SDK-core / runs offline" mis-describes the actual constraint. The real requirements are: (a) no LangChain-family orchestration lock-in (LangChain / LlamaIndex / Dify / LangGraph), and (b) dependency license hygiene — nothing stricter than Apache-2.0 (exclude GPL/AGPL/LGPL, SSPL, non-commercial, etc.). Mature foundational libraries (torch, numpy, sentence-transformers) are acceptable. "Zero dependencies" was never the point.
Decision
Redefine framework-free = (a) no orchestration-framework lock-in + (b) permissive-license-only (≤ Apache-2.0 permissiveness). Concretely:
- Positioning rewrite: from "zero-SDK / runs offline" to "no framework lock-in +
license-clean + every backend swappable via
Protocol." - Dependency-license gate in CI: every transitive dependency must be permissively licensed; the gate fails otherwise. This operationalizes the constraint and is itself a selling point for compliance-minded users.
- Lean default install: real backends (torch/embeddings) are opt-in via extras
(
[embed], etc.) — a packaging/UX choice about install weight and optional GPU, no longer a purity choice. The offline-deterministic path (BM25 + MockProvider) remains the default test/demo loop, a kept strength rather than a dogma.
Alternatives considered (rejected)
- Absolute zero-SDK core, all real backends in extras for purity (option A): rejected as the rationale — torch/numpy are licensed-and-lock-in acceptable, so purity is not the reason; install-weight is. (The lean-default outcome is kept, for a different reason.)
- Batteries-included default (ship a real CPU embedding in the base install): rejected — a multi-GB default is an adoption barrier for a library under evaluation.
- Tiered
ragspine-core+ragspinedistributions: rejected as premature operational overhead for a single-author v0.1.
Consequences
ADR 0008: Prompts — a packaged PromptRegistry under ragspine/prompts/<locale>/
Externalize prompts into packaged, locale-keyed template files behind a PromptRegistry Protocol, filled from DomainProfile values at runtime.
ADR 0010: Intent parsing — deterministic security gate + pluggable IntentParser
Decouple the always-on, never-pluggable deterministic security gate from a pluggable IntentParser Protocol — deterministic where it matters, flexible where it's safe.