crispy-recall 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,237 +1,275 @@
1
1
  # crispy-recall
2
2
 
3
- Searchable memory for your Claude Code and Codex sessions. Local, fast, no daemon.
4
-
5
- **Status:** in development.
6
-
7
- A standalone spin-off of the recall feature from [Crispy](https://github.com/TheSylvester/crispy). See the parent project for the broader multi-agent orchestration GUI.
8
-
9
- ## What's new in 0.2.1
10
-
11
- - **macOS install support.** 0.2.0's native SQLite engine shipped without ever
12
- running on Apple hardware; 0.2.1 fixes the macOS install path and validates it
13
- end-to-end on Apple Silicon. Fixes: a pre-flight macOS-version check (the
14
- bundled llama.cpp embedding binaries need macOS 14+ on arm64, 13.7+ on Intel),
15
- a Node path that stays valid across `brew upgrade node` during in-place
16
- upgrades (it previously pinned a Homebrew Cellar path that a later upgrade
17
- removes), an up-front rejection of Node 23 (no prebuilt SQLite binding) with an
18
- explanation instead of a late failure, and a load-check of the staged SQLite
19
- binding before the installer trusts it. Non-macOS installs are unaffected.
20
- - **`recall install` no longer hangs during setup.** Extraction of the embedding
21
- binaries is now time-boxed with a fallback to the OS unzip tool
22
- (`unzip`/`ditto`/`Expand-Archive`), so a stalled extract can no longer wedge
23
- the installer.
24
-
25
- ## What's new in 0.2.0
26
-
27
- - **Native SQLite engine with real WAL.** The database now runs on
28
- better-sqlite3 with write-ahead logging instead of the previous WebAssembly
29
- binding — which never actually engaged WAL and could silently corrupt the
30
- index when multiple processes wrote at once. That failure mode is eliminated
31
- at the root. `recall doctor` gains a SQLite-binding health section.
32
- **Node.js 22 LTS (≥ 22.16) or 24+ is now required** (Node 23 has no prebuilt
33
- SQLite binding).
34
- - **Git provenance: `--commit` and `--blame`.** `recall --commit <hash>` lists
35
- the session(s) that produced a commit; `recall --blame <path>[:line[-line]]`
36
- traces a file or line range back to the conversations responsible. Matching
37
- is structural (your sessions' actual edits vs the commit's diff), not
38
- timestamp-based. These flags were documented in the skill but missing from
39
- the shipped CLI; they now work as documented.
40
- - **Better semantic retrieval (embedding v3).** Stored messages and queries now
41
- carry the task prefixes the embedding model was trained on, and short turns
42
- (one-line answers, approvals, decisions) are embedded together with their
43
- preceding context so they're finally findable by meaning. Measurably improves
44
- retrieval on the LoCoMo benchmark (recall@5 54.9 → 58.4).
45
- - **Semantic search stays available during migrations.** Upgrading re-embeds
46
- your history in the background; until it finishes, search transparently
47
- blends old- and new-format vectors and tags output with
48
- `(migrating: N% re-embedded)` instead of going dark.
49
- - **Relevance-first ranking.** The hidden age penalty is off by default —
50
- older sessions now rank purely by relevance (previously the right old result
51
- could rank 2× worse just for being old). Pass `--recent` to prefer newer
52
- sessions explicitly.
53
- - **Faster indexing on large databases.** A new index removes a full-table
54
- scan from every embedding batch and end-of-turn catch-up (~0.3 s → ~0.05 s
55
- at ~287K messages). Created automatically on first run.
56
- - **Safe in-place upgrade for existing installs.** `recall install` migrates
57
- an existing database in place: rollback snapshot → WAL conversion →
58
- integrity check with auto-repair → background re-embed. See
59
- [Upgrading from 0.1.x](#upgrading-from-01x).
60
- - **New scripting flags.** `--raw-messages` (full ranked per-message JSON) and
61
- `--no-idf` (keep common words in keyword search), both off by default.
3
+ **Save every session. Recall any conversation. Continue where you left off.**
62
4
 
63
- ## Install
5
+ Each conversation with your agent lands in a transcript on disk, waiting for Claude Code's [startup cleanup (30 days by default)](https://code.claude.com/docs/en/settings) to delete it. recall indexes user and assistant turns as they end — verbatim, on your machine — so your agent can search, read, and continue the conversation even after its transcript is gone.
6
+
7
+ **Local session memory for Claude Code, with Codex support.** Hybrid text and semantic search. Verbatim conversation history.
8
+
9
+ No daemon, no cron, no cloud. A Stop hook and a SQLite file.
64
10
 
65
- Install the command globally, then run the one-time setup:
11
+ ## Quick start
12
+
13
+ Requires Claude Code and either Node.js 22 LTS (`>=22.16`) or Node.js 24+. Install recall in the same environment where you run Claude Code:
66
14
 
67
15
  ```bash
68
16
  npm install -g crispy-recall
69
17
  recall install
70
18
  ```
71
19
 
72
- `recall install` is the resident setup step. It scaffolds `~/.recall/` (the
73
- llama embedding binary, the model, and the SQLite DB), wires a Stop hook into
74
- Claude Code so your transcripts are indexed automatically as sessions end, and
75
- installs the `recall` skill. If Codex is detected it also gets the `recall`
76
- skill (so the agent can search), but not an automatic per-turn hook (yet) —
77
- index Codex history with `recall backfill --vendor codex`. After that, recall
78
- runs passively you only invoke `recall` directly for `status`, `doctor`,
79
- `repair`, or `uninstall`.
80
-
81
- Run it in the environment where you actually use Claude Code: **WSL and
82
- Windows-native are separate installs.** If you use both, run the install in each
83
- — the installer only configures the environment it is invoked in.
84
-
85
- > **macOS: use Node 22 LTS or 24+.** Node 23 has no prebuilt SQLite binding, so
86
- > `npm install -g` would fall back to compiling it and fail without Xcode
87
- > Command Line Tools. macOS 14+ (Apple Silicon) / 13.7+ (Intel) is required for
88
- > the bundled semantic-embedding binaries.
89
-
90
- > **Don't install via `npx`.** recall must stay resident. `npx` runs from an
91
- > ephemeral cache and leaves no `recall` command on your PATH, so follow-up
92
- > commands (`recall status` / `doctor` / `repair` / `uninstall`) and the
93
- > installed skill's command contract have nothing to call. Use the global
94
- > install above.
95
-
96
- Prerequisites: Node 22 LTS (≥ 22.16) or 24+ — Node 23 is unsupported (no
97
- prebuilt SQLite binding) — and Claude Code installed. If Codex is detected
98
- (`~/.codex/` exists), recall installs the `recall` skill into Codex (so the
99
- agent can search) and you can index your Codex history with
100
- `recall backfill --vendor codex`. Real-time per-turn Codex indexing is **not
101
- yet** supported.
102
-
103
- ### Upgrading from 0.1.x
20
+ recall downloads a local embedding runtime and model, sets up a `Stop` hook in Claude Code, installs the recall Agent Skill, and starts indexing the session history still on disk. If Codex is detected, recall sets up the same integration there.
21
+
22
+ ## How to use recall
23
+
24
+ ### Ask your agent
25
+
26
+ **Your agent starts every session from zero until you say the word.**
27
+
28
+ The word is `recall`. Say it in a prompt and your agent goes and gets exactly what it needs: a top-level conversation by UUID, messages by keyword or meaning, or the Claude Code session that wrote the code behind a commit.
29
+
30
+ Use it naturally:
31
+
32
+ | Say this | What your agent can recover |
33
+ |---|---|
34
+ | `Recall where we left off.` | The decisions, unfinished work, and next step from prior sessions. |
35
+ | `Recall we solved this before.` | The earlier fix, even when your new wording doesn't match the transcript. |
36
+ | `Recall <session-uuid> and continue.` | A UUID-backed conversation in a fresh session, centered on the relevant part. |
37
+ | `Recall why this line exists.` | The session behind a commit or line, including alternatives discussed at the time. |
38
+
39
+ The installed skill teaches Claude Code and Codex when and how to search, so your agent can invoke recall without you typing a special command.
40
+
41
+ ### Use the CLI directly
42
+
43
+ Search first:
104
44
 
105
45
  ```bash
106
- npm install -g crispy-recall
107
- recall install # run this FIRST, before any other recall command
46
+ recall "why did we choose this retry policy?"
108
47
  ```
109
48
 
110
- Exit any running Claude/Codex sessions first, then make `recall install` the
111
- first recall command you run after the npm upgrade — it performs a one-time,
112
- in-place migration of your existing database (rollback snapshot → WAL
113
- conversion → integrity check → background re-embed). If a live session is
114
- still holding the database the installer aborts cleanly and asks you to
115
- re-run; re-running is always safe and picks up where it left off.
116
-
117
- What to expect:
118
-
119
- - **Your indexed history is preserved — even without the original
120
- transcripts.** Claude Code deletes session `.jsonl` files after 30 days by
121
- default; the migration never reads them. It works on the database in place,
122
- and the re-embed sources text from the database itself.
123
- - A rollback snapshot is written to `~/.recall/recall.db.pre-upgrade-<stamp>`
124
- (needs free disk roughly equal to your DB size; delete it once you're
125
- satisfied).
126
- - A background re-embed upgrades your vectors to the new format — roughly an
127
- hour per 20K messages on CPU, minutes on GPU. Search works the entire time
128
- (output shows `migrating: N% re-embedded`); watch progress with
129
- `recall status`. It resumes automatically after reboots.
130
- - The migration is one-way: **don't downgrade** to ≤ 0.1.6 afterwards — the
131
- old engine fails closed on the converted database.
132
- - **Avoid `recall repair --full` unless you accept losing older history** — it
133
- rebuilds the index from the transcripts still on disk, which for most
134
- machines means only the last 30 days. Your database is the store of record;
135
- the pre-upgrade snapshot is the rollback path if anything looks wrong.
136
-
137
- ## What it does
138
-
139
- - A **Stop hook** ingests every turn into a local SQLite DB the moment a session ends — no daemon, no background polling.
140
- - The CLI **searches** your history two ways at once: FTS5 full-text and semantic vectors (Nomic Embed Text v1.5, run locally via llama.cpp).
141
- - A **`recall` skill** is dropped into Claude Code so the agent discovers and invokes it on its own — you rarely type `recall` yourself.
142
- - Works in **any project**. Claude Code sessions are indexed automatically; Codex transcripts are searchable too via `recall backfill --vendor codex`.
143
-
144
- ## How an agent uses it
145
-
146
- Two steps. First, search for the relevant session:
49
+ Every result includes a session id and the matched message id. For UUID-based Claude Code results, read the promising result centered on the match:
147
50
 
148
51
  ```bash
149
- recall "the thing you're trying to remember"
52
+ recall <session-uuid> <message-uuid>
150
53
  ```
151
54
 
152
- That returns a table of matching sessions. Then read one, centered on the match:
55
+ Search defaults to the current project's sessions. Expand only when needed:
153
56
 
154
57
  ```bash
155
- recall <session-id> <message-id>
58
+ recall --all "the decision may have happened in another repo"
59
+ recall --project ~/dev/other-repo "the decision"
60
+ recall "the latest release issue" --recent
61
+ ```
62
+
63
+ recall surfaces evidence, not truth. Good agents check recovered context against git HEAD, the current files, and fresh tests before acting on it.
64
+
65
+ ## Why recall?
66
+
67
+ > My agent burned 20 minutes re-diagnosing a failure. The one-line fix sat in 24 prior sessions.
68
+
69
+ So I built crispy-recall — local, verbatim search across my agent's past sessions.
70
+
71
+ Your agent doesn't need to guess what will matter later. It needs a way to search what actually happened once the question becomes clear.
72
+
73
+ ## What makes recall different
74
+
75
+ ### The conversation, not a summary
76
+
77
+ recall keeps the user and assistant conversation word-for-word. It doesn't replace the record with a model's guess about which details might matter later.
78
+
79
+ That distinction matters when you need the exact constraint, command, promise, rejected idea, or one-line fix that a summary would reasonably discard.
80
+
81
+ **`/compact` summarizes. recall quotes.**
82
+
83
+ Auto-memory saves what you knew to keep. recall finds what you didn't know you'd need. They complement each other: one keeps selected facts close; the other searches the verbatim conversation record on demand.
84
+
85
+ Tool calls, tool output, and hidden thinking are intentionally excluded from the searchable conversation. Tool output is re-runnable; the conversation that interpreted it isn't.
86
+
87
+ ### Continue without replaying the session
88
+
89
+ Read a past conversation by UUID-shaped session id:
90
+
91
+ ```text
92
+ Recall fe6cc221-2e63-4928-8417-65ec1587d062 and continue the release.
156
93
  ```
157
94
 
158
- Search and list default to the **current directory's project** from inside one
159
- repo you only see that repo's sessions. Add `--all` to search across every
160
- indexed project (use it for cross-repo questions, or when a scoped search comes
161
- back thin), or `--project <path>` to target a specific repo regardless of where
162
- you are:
95
+ recall reads the indexed conversation instead of replaying an entire raw transcript. Reads can open on the matched message, paginate forward, and combine context from several past sessions. That means your agent can recover the few facts that matter without pouring every old tool result back into its context window.
96
+
97
+ `/resume` dies with the transcript; recall doesn't. recall reads the relevant indexed turns instead of replaying one whole session, and it can combine facts from other sessions.
98
+
99
+ ### From a line of code back to the conversation
100
+
101
+ `git blame` can tell you who changed a line. `recall --blame` can take you back to the conversation that produced it.
163
102
 
164
103
  ```bash
165
- recall --all "the thing you're trying to remember"
104
+ recall --commit 25dd0f8
105
+ recall --blame src/paths.ts:82-84
106
+ recall --blame src/foo.ts:42 src/bar.ts:10-20 --limit 20
166
107
  ```
167
108
 
168
- The skill's frontmatter teaches Claude *when* to reach for this (before
169
- non-trivial tasks, architectural decisions, or work with obvious prior
170
- history), so in practice the agent calls it for you. (Inside the installed skill
171
- the command is written out as `node ~/.recall/bin/recall.js` so it works even
172
- when `recall` isn't on the agent's `PATH` — `$RECALL_BIN` in the skill source is
173
- a placeholder the installer substitutes, not an environment variable you set.)
109
+ Matching is structural: recall compares edits recorded in sessions with commit diffs instead of guessing from timestamps. A commit message summarizes intent; the conversation holds the reasoning, tradeoffs, and rejected alternatives.
110
+
111
+ Commit and blame attribution currently scans Claude Code transcripts. Codex sessions remain searchable by text and meaning, but aren't yet attributed to commits.
112
+
113
+ **`git blame` tells you who. `recall --blame` tells you why.**
114
+
115
+ ### Search for the idea, not just the words
116
+
117
+ You rarely remember the exact phrase an agent used three weeks ago. recall searches two ways at once:
118
+
119
+ - SQLite FTS5 finds exact words and phrases quickly.
120
+ - Local semantic embeddings find the same idea under different wording.
121
+ - Rank fusion combines both result sets.
122
+ - Project scoping keeps everyday searches focused; `--all` crosses repositories when the project itself is the thing you forgot.
123
+
124
+ ```bash
125
+ recall "the mac installer hang we fixed"
126
+ recall --all "why we stopped using the wasm sqlite binding"
127
+ recall --project ~/dev/my-app "booking slot id decision"
128
+ ```
174
129
 
175
- ## Commands
130
+ ### Grep is still the right tool sometimes
176
131
 
177
- | Command | What it does |
132
+ If you know the exact string and the transcript still exists, use grep. recall earns its keep when:
133
+
134
+ - the transcript has already been deleted;
135
+ - your wording doesn't match the original conversation;
136
+ - the answer spans several sessions or repositories;
137
+ - you need to move from a commit or line of code back to the session that produced it; or
138
+ - you want your agent to retrieve the context itself instead of manually hunting through JSONL files.
139
+
140
+ Claude Code deletes transcripts after 30 days by default. The recall index doesn't. You can and often should raise `cleanupPeriodDays`; longer retention keeps more source files, while recall makes the record searchable after those files are gone.
141
+
142
+ **Grep can't search a deleted file.**
143
+
144
+ ## How it works
145
+
146
+ Under the hood, recall is deliberately boring:
147
+
148
+ 1. Stop and SubagentStop hooks index conversation text as turns finish.
149
+ 2. A local llama.cpp embedding model vectorizes it on your machine.
150
+ 3. SQLite stores the text, FTS5 index, vectors, and session metadata in `~/.recall/`.
151
+ 4. A small skill teaches your agent to search first when prior work is likely to matter.
152
+ 5. Search results enter the context only when the agent asks for them.
153
+
154
+ There's no resident daemon, and recall makes no LLM calls of its own. Indexing and search don't consume model tokens; retrieved text costs context tokens only when your agent reads it, like any other local file.
155
+
156
+ Install-time backfill indexes the Claude Code and Codex sessions still present on disk, so recall is useful on day one rather than only after day one.
157
+
158
+ ## Install
159
+
160
+ ### Requirements
161
+
162
+ - Node.js 22 LTS (`>=22.16`) or Node.js 24+
163
+ - Claude Code (required); Codex session indexing and search are also configured when Codex is detected
164
+ - Linux x64/arm64, macOS x64/arm64, or Windows x64
165
+ - macOS 14+ on Apple Silicon or macOS 13.7+ on Intel
166
+ - 500 MB free recommended for installation; upgrading also needs free space for retained rollback snapshots — roughly the database size when upgrading from 0.2.x, and roughly twice that from 0.1.x (which keeps two snapshots)
167
+
168
+ Node 23 is unsupported because no prebuilt SQLite binding is available for it.
169
+
170
+ ```bash
171
+ npm install -g crispy-recall
172
+ recall install
173
+ ```
174
+
175
+ > **Don't use `npx`.** recall installs persistent hooks, a skill, a model, and a command that must remain available after setup.
176
+
177
+ Run the installer in the environment where you use your agent. WSL and Windows-native are separate environments, so install once in each if you use both.
178
+
179
+ The installer:
180
+
181
+ - creates `~/.recall/`;
182
+ - downloads the llama.cpp binary and local embedding model;
183
+ - installs Claude Code and Codex lifecycle hooks when each harness is detected;
184
+ - installs the recall skill and a short AGENTS.md/CLAUDE.md nudge; and
185
+ - backfills the session history that is still on disk.
186
+
187
+ Use `recall doctor` if setup reports a problem. Use `recall install --offline` with pre-staged assets for an offline install.
188
+
189
+ ### Upgrading
190
+
191
+ Close active Claude Code and Codex sessions, then make `recall install` the first recall command you run after upgrading — it applies any pending one-time database migrations attended, before your agent reopens the database:
192
+
193
+ ```bash
194
+ npm install -g crispy-recall
195
+ recall install
196
+ ```
197
+
198
+ - **From 0.1.x**, the installer migrates the wasm database to native SQLite/WAL (writing a `~/.recall/recall.db.pre-upgrade-<stamp>` snapshot) and checks integrity, then runs the retrieval-class migration below.
199
+ - **From 0.2.x**, the installer runs the retrieval-class migration: it reclassifies any subagent (agent-leaf) messages as durable-but-excluded-from-default-search, rebuilds the FTS index, and re-embeds affected rows in the background.
200
+
201
+ Before it changes anything, the retrieval-class migration writes a `~/.recall/recall.db.pre-retrieval-<stamp>` snapshot; a 0.1.x upgrade therefore keeps two retained snapshots (pre-upgrade and pre-retrieval). Keep free disk roughly equal to the current database size — twice that when upgrading from 0.1.x — and delete the snapshots only after you're satisfied.
202
+
203
+ If a live session or a running backfill holds the database, the installer aborts cleanly so you can exit it and rerun `recall install`. Search remains available during migration; use `recall status` to watch progress, and the background re-embed resumes after interruption or reboot.
204
+
205
+ Migration works from `recall.db`, not the source transcripts, so indexed history is preserved even when the original JSONL has already been cleaned up. Your database is the store of record; if old transcripts are gone, `recall repair --full` cannot recreate them. Don't downgrade to `<=0.1.6` after converting the database.
206
+
207
+ ## Command reference
208
+
209
+ | Command | Purpose |
178
210
  |---|---|
179
- | `recall "<query>" [--all] [--project <path>]` | Search past sessions (FTS5 + semantic). Defaults to the current project; `--all` searches every indexed project, `--project` targets one. |
180
- | `recall <session-id> [<message-id>]` | Read a session, optionally centered on a matched message. |
181
- | `recall install` | One-time setup: scaffold `~/.recall/`, wire the Stop hook, install the skill. |
182
- | `recall uninstall` | Reverse the install (skill, hook, CLAUDE.md block). `--purge` also removes `~/.recall/`. |
183
- | `recall status` | DB size, message count, last ingest, embedding gap, active backfill PID, GPU/CPU backend. |
184
- | `recall doctor` | Read-only health check (the install pre-flight suite). `--integrity` runs DB + FTS5 checks. |
185
- | `recall repair --fts \| --vectors \| --full` | Rebuild the FTS index, re-embed vectors, or full reingest from JSONL. |
186
- | `recall backfill [--auto-embed] [--vendor <v>] [--detach]` | Index historical transcripts. |
187
-
188
- Add `--json` to `install`/`uninstall`/`status`/`doctor` for machine-readable
189
- output. `recall install` also takes `--offline` (use a pre-staged binary +
190
- model instead of downloading) and `--no-backfill` / `--auto-backfill` to control
191
- the initial history index. Run `recall --help` for the full flag set.
192
-
193
- ### Commit attribution (`--commit` / `--blame`)
194
-
195
- Find the session(s) that produced a commit, or the session(s) responsible for
196
- the current state of a file or line. Matching is structural — session
197
- Edit/Write/MultiEdit tool calls are compared against the commit's diff via
198
- tri-gram intersection, not clock proximity. `--blame` is HEAD-relative: it runs
199
- `git blame` to find the commits behind the current file (or line range) and
200
- attributes each; sessions overwritten by a later commit won't appear. Results
201
- list top-level sessions and subagent leaves chronologically (oldest first).
211
+ | `recall "<query>"` | Hybrid text + semantic search in the current project. |
212
+ | `recall "<query>" --all` | Search every indexed project. |
213
+ | `recall <session-id> [<message-id>]` | Read a session, optionally centered on a match. IDs are opaque — full stored IDs or literal prefixes (UUIDs, `agent-<hex>` leaves, `codex-jsonl-*` messages) all resolve. |
214
+ | `recall read <session-ref> [<message-ref>]` | Explicit read for any stored ID shape; a failed read exits nonzero and never falls back to search. |
215
+ | `recall search <terms…>` | Force a search when a term would otherwise look like a session/message ID. |
216
+ | `recall --commit <hash>` | Find Claude Code sessions that produced a commit. |
217
+ | `recall --blame <path>[:line[-line]]` | Trace current code back to its producing Claude Code conversations. |
218
+ | `recall install` | Install or upgrade the hooks, skills, local assets, and history index. |
219
+ | `recall backfill [--auto-embed] [--vendor <v>] [--detach]` | Index session transcripts currently on disk, optionally for one vendor or as a detached job. |
220
+ | `recall status` | Show database size, message counts, embedding gap/migration progress, and active backfill state. |
221
+ | `recall doctor [--integrity]` | Run read-only install and database checks. |
222
+ | `recall repair --fts \| --vectors \| --full` | Rebuild FTS5, clear vectors for re-embedding, or fully reingest on-disk transcripts. |
223
+ | `recall statusline [--suggest]` | Print the session-id chip or integration guidance. |
224
+ | `recall uninstall [--purge]` | Remove the integration; `--purge` also deletes recall's data. |
225
+
226
+ Run `recall --help` for the full search and read flag set. Add `--json` to `install`, `uninstall`, `status`, or `doctor` for machine-readable output. Installer options include `--offline`, `--no-backfill`, `--auto-backfill`, `--statusline`, and `--no-statusline`.
227
+
228
+ ### Optional statusline
202
229
 
203
230
  ```bash
204
- recall --commit 25dd0f8 # sessions that produced a commit
205
- recall --blame src/paths.ts:82-84 # sessions behind a line range
206
- recall --blame src/foo.ts:42 src/bar.ts:10-20 --limit 20 # union of specs
231
+ recall install --statusline
207
232
  ```
208
233
 
209
- ## Where things live
234
+ It is off by default: accepting the installer defaults, using `--yes` or a non-interactive install, or upgrading an install that has never enabled it will not opt you in. Once enabled, it stays enabled across upgrades. If Claude Code has no statusline, recall installs a muted line with the current folder and git branch, model, context use, and a `🔗 <session_id>` chip. If you already have a statusline, recall leaves it unchanged and prints paste-ready integration guidance; `recall statusline --suggest` repeats it later.
210
235
 
211
- - `~/.recall/` the DB, model, binary, logs, and `config.json` (the resolved GPU/CPU embedder mode).
212
- - `~/.claude/skills/recall/SKILL.md` — the auto-discovered skill.
213
- - A hook entry in `~/.claude/settings.json`.
236
+ The installed statusline never opens the database. Its only I/O is one guarded `git status` call with a 400 ms timeout; failure simply drops the git segment, and any segment whose input is missing is omitted. For composition with your own statusline, `recall statusline` prints only the bare, uncolored session-id chip. Uninstall removes the line only if recall still owns it, and doctor reports statusline problems as warnings.
214
237
 
215
- `recall uninstall` reverses all three. `recall uninstall --purge` also removes `~/.recall/`.
238
+ > **Warning:** `recall repair --full` is destructive: it replaces the index contents from the transcripts still on disk. If older source transcripts have already been cleaned up, their indexed history cannot be rebuilt. Prefer `--fts` or `--vectors` unless a full reingest is truly necessary.
216
239
 
217
- ## Privacy
240
+ ## Privacy and data
218
241
 
219
- Everything is local. No telemetry. The only data transfer is the one-time
220
- binary + model download at install (from llama.cpp's GitHub releases and
221
- HuggingFace); `recall install` and `recall doctor` also send lightweight
222
- reachability probes to those two hosts. Nothing else leaves your machine. The DB
223
- is plain SQLite open it with any SQLite browser if you want to poke around.
242
+ - Your index lives in `~/.recall/recall.db`.
243
+ - Search and indexing stay on your machine.
244
+ - While a query is being embedded, its text is written to a transient file under `~/.recall/run/query-embed/` (mode 0600) and deleted as soon as the embedding completes.
245
+ - There is no telemetry.
246
+ - The database is plain SQLite and inspectable with ordinary SQLite tools.
247
+ - Network access is limited to downloading the embedding runtime and model when missing, plus host reachability probes during install and doctor checks.
248
+ - `recall uninstall --purge` removes the local store completely.
224
249
 
225
- ## Troubleshooting
250
+ The installed integration is inspectable too: Claude's skill and hook live under `~/.claude/skills/recall/` and `~/.claude/settings.json`. When Codex is detected, recall also uses `~/.codex/skills/recall/` and `~/.codex/hooks.json`.
226
251
 
227
- Run `recall doctor` it reports platform, harness, runtime, disk, network, and
228
- the resolved embedding backend, with remediation hints for anything off.
252
+ The index deliberately outlives source-transcript cleanup. recall doesn't encrypt `recall.db`; treat `~/.recall/` with the same care as your original Claude Code and Codex histories.
229
253
 
230
- ## Attribution
254
+ ## Limitations
231
255
 
232
- Lifted and adapted from the recall subsystem of
233
- [Crispy](https://github.com/TheSylvester/crispy), the Claude Code / Codex GUI.
256
+ - It isn't automatic fact injection into every prompt. Retrieval is pull-based.
257
+ - It isn't a replacement for documentation, tests, or git.
258
+ - It doesn't claim recalled context is still correct.
259
+ - It doesn't preserve tool output or hidden thinking in the searchable conversation.
260
+ - It doesn't yet offer per-session deletion; forgetting is database-level today.
261
+ - Subagent transcripts (Claude Task leaves, Codex child rollouts) are stored durable and readable by explicit ID, but are excluded from default search, lists, and semantic vectors — the parent thread's narration is the canonical memory. There is no search mode that includes them yet.
262
+
263
+ ## Project status
264
+
265
+ crispy-recall is in active development and was spun out of the recall subsystem in [Crispy](https://github.com/TheSylvester/crispy). See [GitHub Releases](https://github.com/TheSylvester/crispy-recall/releases) for version history.
266
+
267
+ Issues and contributions are welcome at [github.com/TheSylvester/crispy-recall](https://github.com/TheSylvester/crispy-recall).
234
268
 
235
269
  ## License
236
270
 
237
271
  MIT — see [LICENSE](./LICENSE).
272
+
273
+ ---
274
+
275
+ **Memory, lazily evaluated.**