# SQLite Runtime Baseline **Status:** complete for the Node 26.1 runtime baseline. SF uses built-in `node:sqlite` and the project-local `.sf/sf.db` as the canonical structured store for planning state, UOK execution state, learning outcomes, schedules, memory extraction queues, and generated projections. ## Runtime Rule - **Node baseline:** 26.1+ - **Canonical database:** `.sf/sf.db` - **SQLite binding:** built-in `node:sqlite` - **Sidecar stores:** not allowed for active SF state Runtime code must not introduce `sql.js`, `better-sqlite3`, `sqlite3` CLI shell-outs, or JSON fallback databases for DB-owned state. If a feature needs ordering, validation, joins, leases, TTLs, or history, put it in `.sf/sf.db`. ## Current Surfaces - **Learning outcomes:** `llm_task_outcomes` - **UOK execution graphs:** `uok_execution_graphs`, `uok_graph_nodes`, `uok_graph_progress` - **UOK coordination:** `uok_kv`, `uok_stream_entries`, `uok_queue_items` - **Memory extraction:** `threads`, `stage1_outputs`, `jobs` - **Schedules:** `schedule_entries` ## Development Rules 1. Use SF query/writer helpers when operating inside the SF extension. 2. Use `node:sqlite` directly only for isolated tooling or package code that cannot import the SF extension runtime. 3. Prefer read-only SQLite handles for monitors and inspection overlays. 4. Do not keep compatibility code for retired JSON or sidecar DB stores unless an explicit migration command owns it. 5. Add behavior tests before changing persistence semantics. ## Verification ```bash npm run typecheck:extensions npx vitest run --config vitest.config.ts \ src/resources/extensions/sf/learning/*.test.mjs \ src/resources/extensions/sf/tests/uok-*.test.mjs ```