clawmem 0.14.0 → 0.15.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
@@ -114,8 +114,8 @@ After installing, here's the full journey from zero to working memory:
114
114
  | Step | What | How | Details |
115
115
  |------|------|-----|---------|
116
116
  | **1. Bootstrap** | Create a vault, index your first collection, embed, install hooks and MCP | `clawmem bootstrap ~/notes --name notes` | One command does it all. Or run each step manually (see below). |
117
- | **2. Choose models** | Pick embedding + reranker models based on your hardware | 16GB+ VRAM → SOTA stack (zembed-1 + zerank-2 sidecar). Less → QMD native combo. No GPU → cloud embedding or CPU fallback. | [GPU Services](#gpu-services) |
118
- | **3. Download models** | Get the model files for your chosen stack (GGUFs for embedding/LLM/default-reranker; the zerank-2 SOTA reranker builds its own sidecar artifact) | `wget` from HuggingFace, let `node-llama-cpp` auto-download the QMD native models, or run the sidecar recipe | [Embedding](#embedding), [LLM Server](#llm-server), [Reranker Server](#reranker-server) |
117
+ | **2. Choose models** | Pick embedding + reranker models based on your hardware | 16GB+ VRAM → SOTA stack (zembed-1 + zerank-2 sidecar). Less → QMD native combo. No GPU → cloud embedding or CPU fallback. | [Inference services](docs/guides/inference-services.md) |
118
+ | **3. Download models** | Get the model files for your chosen stack (GGUFs for embedding/LLM/default-reranker; the zerank-2 SOTA reranker builds its own sidecar artifact) | `wget` from HuggingFace, let `node-llama-cpp` auto-download the QMD native models, or run the sidecar recipe | [Inference services](docs/guides/inference-services.md) |
119
119
  | **4. Start services** | Run GPU servers (if using dedicated GPU) and background services. Optionally enable the v0.8.2 background maintenance workers in the watcher unit so consolidation + deductive synthesis run automatically. | `llama-server` for each model. systemd units for watcher + embed timer. Drop-in for the watcher to enable workers + tune intervals + set the quiet window. | [systemd services](docs/guides/systemd-services.md), [background workers](docs/guides/systemd-services.md#background-maintenance-workers-v082) |
120
120
  | **5. Decide what to index** | Add collections for your projects, notes, research, and domain docs | `clawmem collection add ~/project --name project` | The more relevant markdown you index, the better retrieval works. See [building a rich context field](docs/introduction.md#building-a-rich-context-field). |
121
121
  | **6. Connect your agent** | Hook into Claude Code, OpenClaw, Hermes, or any MCP client | `clawmem setup hooks && clawmem setup mcp` for Claude Code. `clawmem setup openclaw` for OpenClaw. Copy `src/hermes/` to Hermes plugins for Hermes. | [Integration](#integration) |
@@ -303,193 +303,21 @@ vault_sync(vault="work", content_root="~/work/docs")
303
303
 
304
304
  **Single-vault users:** No action needed. Everything works without configuration. The `vault` parameter is always optional and ignored when no vaults are configured.
305
305
 
306
- ### GPU Services
306
+ ### Inference services (GPU, in-process, or cloud)
307
307
 
308
- ClawMem uses three inference services — embedding, LLM, and reranker. In the **default** stack all three run as `llama-server` (llama.cpp) instances, each with an in-process `node-llama-cpp` fallback (auto-downloads on first use), so ClawMem works without a dedicated GPU. (The **SOTA** reranker is the exception — it is a transformers sidecar, see [Reranker Server](#reranker-server).) `node-llama-cpp` auto-detects the best available backend — Metal on Apple Silicon, Vulkan where available, CPU as last resort. With GPU acceleration (Metal/Vulkan), in-process inference is fast for these small models (0.3B–1.7B); on CPU-only systems it is significantly slower. For production use, run the servers via [systemd services](docs/guides/systemd-services.md) to prevent silent fallback.
308
+ ClawMem uses three inference services — **embedding**, **LLM** (query expansion / intent / A-MEM), and **reranker**. In the **default** stack all three run as `llama-server` instances, each with an in-process `node-llama-cpp` fallback that auto-downloads on first use, so ClawMem works without a dedicated GPU (Metal on Apple Silicon, Vulkan where available, CPU as last resort). The `bin/clawmem` wrapper points at `localhost:8088/8089/8090`. **Always run via `bin/clawmem`** it sets the endpoints.
309
309
 
310
- **GPU with VRAM to spare (16GB+, recommended):** ZeroEntropy's distillation-paired stack delivers best retrieval quality — total ~16GB VRAM.
310
+ **Choose a stack:**
311
311
 
312
- | Service | Port | Model | VRAM | Purpose |
312
+ | Stack | Models | VRAM | License | When |
313
313
  |---|---|---|---|---|
314
- | Embedding | 8088 | [zembed-1-Q4_K_M](https://huggingface.co/Abhiray/zembed-1-Q4_K_M-GGUF) | ~4.4GB | SOTA embedding (2560d, 32K context). Distilled from zerank-2 via zELO. |
315
- | LLM | 8089 | [qmd-query-expansion-1.7B-q4_k_m](https://huggingface.co/tobil/qmd-query-expansion-1.7B-gguf) | ~2.2GB | Intent classification, query expansion, A-MEM |
316
- | Reranker | 8090 | [zerank-2 seq-cls sidecar](extras/rerankers/zerank-2-seq/) | ~9GB (bf16) | SOTA reranker. NDCG@10 ahead of Cohere rerank-3.5. Optimal pairing with zembed-1. |
314
+ | **QMD native** (default) | EmbeddingGemma-300M + qmd-query-expansion-1.7B + qwen3-reranker-0.6B | ~4 GB, or in-process | **Permissive commercial OK** | Any GPU or none; commercial use; zero-config start |
315
+ | **z / SOTA** | zembed-1 + qmd-query-expansion-1.7B + zerank-2 seq-cls **sidecar** | ~16 GB | **CC-BY-NC-4.0 — non-commercial only** | 16 GB+ GPU and non-commercial; best recall |
316
+ | **Cloud embedding** | Jina / OpenAI / Voyage / Cohere (embedding only) | none | provider ToS | No local GPU for embedding; LLM + reranker stay local |
317
317
 
318
- **The SOTA reranker is a sidecar, not a GGUF.** It is served by the [zerank-2 seq-cls sidecar](extras/rerankers/zerank-2-seq/) (transformers, bf16). The previously-listed `zerank-2-Q4_K_M` GGUF is **deprecated** llama.cpp's converter drops zerank's score head, so under `--reranking` it produces near-zero, uninformative scores (final ordering stays RRF-dominated). See the [sidecar README](extras/rerankers/zerank-2-seq/) and [Reranker Server](#reranker-server).
318
+ **Heads-up before you serve:** the zerank-2 **GGUF is deprecated and inert** — llama.cpp drops its score head, so the SOTA reranker must run as the [seq-cls sidecar](extras/rerankers/zerank-2-seq/), not a GGUF (verify with `clawmem rerank-health`). zembed-1 / reranking need `-ub` = `-b` (non-causal attention). Changing embedding dimensions requires `clawmem embed --force`. Set `CLAWMEM_NO_LOCAL_MODELS=true` to fail fast instead of silent CPU fallback.
319
319
 
320
- **Important:** zembed-1 uses non-causal attention `-ub` must equal `-b` on llama-server (e.g. `-b 2048 -ub 2048`). See [Embedding](#embedding) for details.
321
-
322
- **License:** zembed-1 and zerank-2 are released under **CC-BY-NC-4.0** — non-commercial only. The QMD native models below have no such restriction.
323
-
324
- **No dedicated GPU / GPU without VRAM to spare:** The QMD native combo — total ~4GB VRAM, also runs via `node-llama-cpp` (Metal on Apple Silicon, Vulkan where available, CPU as last resort). Fast with GPU acceleration; significantly slower on CPU-only.
325
-
326
- | Service | Port | Model | VRAM | Purpose |
327
- |---|---|---|---|---|
328
- | Embedding | 8088 | [EmbeddingGemma-300M-Q8_0](https://huggingface.co/ggml-org/embeddinggemma-300M-GGUF) | ~400MB | Vector search, indexing, context-surfacing (768d, 2K context) |
329
- | LLM | 8089 | [qmd-query-expansion-1.7B-q4_k_m](https://huggingface.co/tobil/qmd-query-expansion-1.7B-gguf) | ~2.2GB | Intent classification, query expansion, A-MEM |
330
- | Reranker | 8090 | [qwen3-reranker-0.6B-Q8_0](https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF) | ~1.3GB | Cross-encoder reranking (query, intent_search) |
331
-
332
- The `bin/clawmem` wrapper defaults to `localhost:8088/8089/8090`. If a server is unreachable (transport error like ECONNREFUSED/ETIMEDOUT), ClawMem sets a 60-second cooldown and falls back to in-process inference via `node-llama-cpp` (auto-downloads the QMD native models on first use, uses Metal/Vulkan/CPU depending on hardware). HTTP errors (400/500) and user-cancelled requests do not trigger cooldown — the remote server is retried normally on the next call. With GPU acceleration the fallback is fast; on CPU-only it is significantly slower. ClawMem always works either way, but **if you're running dedicated GPU servers, use [systemd services](docs/guides/systemd-services.md) to ensure they stay up**.
333
-
334
- To prevent fallback and fail fast instead, set `CLAWMEM_NO_LOCAL_MODELS=true`.
335
-
336
- #### Remote GPU (optional)
337
-
338
- If your GPU lives on a separate machine, point the env vars at it:
339
-
340
- ```bash
341
- export CLAWMEM_EMBED_URL=http://gpu-host:8088
342
- export CLAWMEM_LLM_URL=http://gpu-host:8089
343
- export CLAWMEM_LLM_MODEL=qwen3
344
- export CLAWMEM_RERANK_URL=http://gpu-host:8090
345
- ```
346
-
347
- For remote setups, set `CLAWMEM_NO_LOCAL_MODELS=true` to prevent `node-llama-cpp` from auto-downloading multi-GB model files if a server is unreachable.
348
-
349
- #### No Dedicated GPU (in-process inference)
350
-
351
- All three QMD native models run locally without a dedicated GPU. `node-llama-cpp` auto-downloads them on first use (~300MB embedding + ~1.1GB LLM + ~600MB reranker) and auto-detects the best backend — **Metal on Apple Silicon** (fast, uses integrated GPU), **Vulkan where available** (fast, uses discrete or integrated GPU), or **CPU as last resort** (significantly slower). With Metal or Vulkan, in-process inference handles these small models well; CPU-only is functional but noticeably slower.
352
-
353
- Alternatively, use a [cloud embedding provider](#option-c-cloud-embedding-api) if you prefer not to run models locally.
354
-
355
- ### Embedding
356
-
357
- ClawMem calls the OpenAI-compatible `/v1/embeddings` endpoint for all embedding operations. This works with local llama-server instances and cloud providers alike.
358
-
359
- #### Option A: GPU with VRAM to spare (recommended)
360
-
361
- Use [zembed-1-Q4_K_M](https://huggingface.co/Abhiray/zembed-1-Q4_K_M-GGUF) — SOTA retrieval quality, distilled from zerank-2 via [ZeroEntropy's zELO methodology](https://docs.zeroentropy.dev). **CC-BY-NC-4.0** — non-commercial only.
362
-
363
- - Size: 2.4GB, Dimensions: 2560, VRAM: ~4.4GB, Context: 32K tokens
364
-
365
- ```bash
366
- wget https://huggingface.co/Abhiray/zembed-1-Q4_K_M-GGUF/resolve/main/zembed-1-Q4_K_M.gguf
367
-
368
- # -ub must match -b for non-causal attention
369
- llama-server -m zembed-1-Q4_K_M.gguf \
370
- --embeddings --port 8088 --host 0.0.0.0 \
371
- -ngl 99 -c 8192 -b 2048 -ub 2048
372
- ```
373
-
374
- #### Option B: No GPU / GPU without VRAM to spare
375
-
376
- Use [EmbeddingGemma-300M-Q8_0](https://huggingface.co/ggml-org/embeddinggemma-300M-GGUF) — the QMD native embedding model. Only 300MB, runs on CPU or any GPU.
377
-
378
- - Size: 314MB, Dimensions: 768, VRAM: ~400MB (or CPU), Context: 2048 tokens
379
-
380
- ```bash
381
- wget https://huggingface.co/ggml-org/embeddinggemma-300M-GGUF/resolve/main/embeddinggemma-300M-Q8_0.gguf
382
-
383
- # On GPU (add -ngl 99):
384
- llama-server -m embeddinggemma-300M-Q8_0.gguf \
385
- --embeddings --port 8088 --host 0.0.0.0 \
386
- -ngl 99 -c 2048 --batch-size 2048
387
-
388
- # On CPU (omit -ngl):
389
- llama-server -m embeddinggemma-300M-Q8_0.gguf \
390
- --embeddings --port 8088 --host 0.0.0.0 \
391
- -c 2048 --batch-size 2048
392
- ```
393
-
394
- For multilingual corpora, the SOTA zembed-1 (Option A) supports multilingual out of the box. For a lightweight alternative: [granite-embedding-278m-multilingual-Q6_K](https://huggingface.co/bartowski/granite-embedding-278m-multilingual-GGUF) (314MB, set `CLAWMEM_EMBED_MAX_CHARS=1100` due to 512-token context).
395
-
396
- #### Option C: Cloud Embedding API
397
-
398
- Alternatively, use a cloud embedding provider instead of running a local server. Any provider with an OpenAI-compatible `/v1/embeddings` endpoint works.
399
-
400
- **Configuration:** Copy `.env.example` to `.env` and set your provider credentials:
401
-
402
- ```bash
403
- cp .env.example .env
404
- # Edit .env:
405
- CLAWMEM_EMBED_URL=https://api.jina.ai
406
- CLAWMEM_EMBED_API_KEY=jina_your-key-here
407
- CLAWMEM_EMBED_MODEL=jina-embeddings-v5-text-small
408
- ```
409
-
410
- Or export them in your shell. **Precedence:** shell environment > `.env` file > `bin/clawmem` wrapper defaults.
411
-
412
- | Provider | `CLAWMEM_EMBED_URL` | `CLAWMEM_EMBED_MODEL` | Dimensions | Notes |
413
- |---|---|---|---|---|
414
- | Jina AI | `https://api.jina.ai` | `jina-embeddings-v5-text-small` | 1024 | 32K context, task-specific LoRA adapters |
415
- | OpenAI | `https://api.openai.com` | `text-embedding-3-small` | 1536 | 8K context, Matryoshka dimensions via `CLAWMEM_EMBED_DIMENSIONS` |
416
- | Voyage AI | `https://api.voyageai.com` | `voyage-4-large` | 1024 | 32K context |
417
- | Cohere | `https://api.cohere.com` | `embed-v4.0` | 1024 | 128K context |
418
-
419
- Cloud mode auto-detects your provider from the URL and sends the right parameters (Jina `task`, Voyage/Cohere `input_type`, OpenAI `dimensions`). Batch embedding (50 fragments/request), server-side truncation, adaptive TPM-aware pacing, and retry with jitter are all handled automatically. Set `CLAWMEM_EMBED_TPM_LIMIT` to match your provider tier (default: 100000). See [docs/guides/cloud-embedding.md](docs/guides/cloud-embedding.md) for full details.
420
-
421
- **Note:** Cloud providers handle their own context window limits — ClawMem skips client-side truncation when an API key is set. Local llama-server truncates at `CLAWMEM_EMBED_MAX_CHARS` (default: 6000 chars).
422
-
423
- #### Verify and embed
424
-
425
- ```bash
426
- # Verify endpoint is reachable
427
- curl $CLAWMEM_EMBED_URL/v1/embeddings \
428
- -H "Content-Type: application/json" \
429
- -H "Authorization: Bearer $CLAWMEM_EMBED_API_KEY" \
430
- -d "{\"input\":\"test\",\"model\":\"$CLAWMEM_EMBED_MODEL\"}"
431
-
432
- # Embed your vault
433
- ./bin/clawmem embed
434
- ```
435
-
436
- ### LLM Server
437
-
438
- Intent classification, query expansion, and A-MEM extraction use [qmd-query-expansion-1.7B](https://huggingface.co/tobil/qmd-query-expansion-1.7B-gguf) — a Qwen3-1.7B finetuned by QMD specifically for generating search expansion terms (hyde, lexical, and vector variants). ~1.1GB at q4_k_m quantization, served via `llama-server` on port 8089.
439
-
440
- **Without a server:** If `CLAWMEM_LLM_URL` is unset, `node-llama-cpp` auto-downloads the model on first use.
441
-
442
- **Performance (RTX 3090):**
443
- - Intent classification: **27ms**
444
- - Query expansion: **333 tok/s**
445
- - VRAM: ~2.2-2.8GB depending on quantization
446
-
447
- **Qwen3 /no_think flag:** Qwen3 uses thinking tokens by default. ClawMem appends `/no_think` to all prompts automatically to get structured output in the `content` field.
448
-
449
- **Intent classification:** Uses a dual-path approach:
450
- 1. **Heuristic regex classifier** (instant) — handles strong signals (why/when/who keywords) with 0.8+ confidence
451
- 2. **LLM refinement** (27ms on GPU) — only for ambiguous queries below 0.8 confidence
452
-
453
- **Server setup:**
454
-
455
- ```bash
456
- # Download the finetuned model
457
- wget https://huggingface.co/tobil/qmd-query-expansion-1.7B-gguf/resolve/main/qmd-query-expansion-1.7B-q4_k_m.gguf
458
-
459
- # Start llama-server for LLM inference
460
- llama-server -m qmd-query-expansion-1.7B-q4_k_m.gguf \
461
- --port 8089 --host 0.0.0.0 \
462
- -ngl 99 -c 4096 --batch-size 512
463
- ```
464
-
465
- ### Reranker Server
466
-
467
- Cross-encoder reranking for `query` and `intent_search` pipelines on port 8090. ClawMem calls the `/v1/rerank` endpoint (or falls back to scoring via `/v1/completions` for compatible servers).
468
-
469
- Scores each candidate against the original query (cross-encoder architecture). `query` pipeline: 4000 char context per doc (deep reranking); `intent_search`: 200 char context per doc (fast reranking).
470
-
471
- **GPU with VRAM to spare (recommended):** the **[zerank-2 seq-cls sidecar](extras/rerankers/zerank-2-seq/)** (bf16, ~9GB VRAM). zerank-2's NDCG@10 is ahead of Cohere rerank-3.5 and Gemini 2.5 Flash. Optimal pairing with zembed-1 (same distillation architecture via zELO). **CC-BY-NC-4.0** — non-commercial only.
472
-
473
- zerank-2 is **not** servable as a llama.cpp GGUF — its CrossEncoder/LogitScore head is dropped by the GGUF converter (the model becomes a headless causal LM that produces near-zero, uninformative scores under `--reranking`, leaving final ordering RRF-dominated). The sidecar serves the real head via transformers, with a reproducible correctness gate:
474
-
475
- ```bash
476
- cd extras/rerankers/zerank-2-seq
477
- docker compose build
478
- HF_TOKEN=hf_xxx docker compose run --rm convert # download + convert + verify (all gates must pass)
479
- docker compose up -d reranker # serves /v1/rerank on :8090
480
- ```
481
-
482
- **CPU / GPU without VRAM to spare:** [qwen3-reranker-0.6B-Q8_0](https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF) (~600MB, ~1.3GB VRAM). The QMD native reranker — auto-downloaded by `node-llama-cpp` if no server is running.
483
-
484
- ```bash
485
- wget https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF/resolve/main/Qwen3-Reranker-0.6B-Q8_0.gguf
486
-
487
- llama-server -m Qwen3-Reranker-0.6B-Q8_0.gguf \
488
- --reranking --port 8090 --host 0.0.0.0 \
489
- -ngl 99 -c 2048 --batch-size 512
490
- ```
491
-
492
- **Note:** zembed-1 (embedding) uses non-causal attention — `-ub` (ubatch) must equal `-b` (batch); omitting `-ub` or setting it lower causes assertion crashes. The qwen3-reranker-0.6B GGUF does not have this requirement, and the zerank-2 sidecar is served via transformers (no llama.cpp batch flags). See [llama.cpp#12836](https://github.com/ggml-org/llama.cpp/issues/12836).
320
+ **Full stack decision matrix, model/VRAM tables, and server-setup commands:** [docs/guides/inference-services.md](docs/guides/inference-services.md). Cloud providers, batch + TPM behavior: [docs/guides/cloud-embedding.md](docs/guides/cloud-embedding.md). All environment variables: [docs/reference/configuration.md](docs/reference/configuration.md). Keeping servers running: [docs/guides/systemd-services.md](docs/guides/systemd-services.md).
493
321
 
494
322
  ### MCP Server
495
323
 
@@ -574,22 +402,23 @@ bun test # Run test suite
574
402
 
575
403
  ## Agent Instructions
576
404
 
577
- ClawMem ships three instruction files and an optional maintenance agent:
405
+ ClawMem ships agent instruction files and an optional maintenance agent:
578
406
 
579
407
  | File | Loaded | Purpose |
580
408
  |------|--------|---------|
581
- | `CLAUDE.md` | Automatically (Claude Code, when working in this repo) | Complete operational referencehooks, tools, query optimization, scoring, pipeline details, troubleshooting |
582
- | `AGENTS.md` | Framework-dependent | Identical to CLAUDE.md — cross-framework compatibility (Cursor, Windsurf, Codex, etc.) |
583
- | `SKILL.md` | On-demand (agent reads when needed) | Same reference as CLAUDE.md, shipped with the package for cross-project use |
409
+ | `AGENTS.md` | Automatically (most agents, when working in this repo) | **Lean root SSOT**agent-facing quick reference (inference at a glance, install, retrieval routing, MCP tools, indexing rules, integrations) + an index into `docs/` |
410
+ | `CLAUDE.md` | Automatically (Claude Code) | `@AGENTS.md` import Claude Code reads `CLAUDE.md` natively, so it just pulls in the SSOT |
411
+ | `SKILL.md` | On-demand (agent reads when needed) | Portable operating reference escalation gate, tool routing, the 4 query-optimization levers, pipeline behavior, composite scoring, lifecycle. Shipped with the package for cross-project use |
412
+ | `docs/` | On-demand (linked throughout `AGENTS.md`) | Deep reference — inference setup, configuration, concepts, internals, guides, troubleshooting |
584
413
  | `agents/clawmem-curator.md` | On-demand via `clawmem setup curator` | Maintenance agent — lifecycle triage, retrieval health checks, dedup sweeps, graph rebuilds |
585
414
 
586
- **Working in the ClawMem repo:** No action needed — `CLAUDE.md` loads automatically.
415
+ **Working in the ClawMem repo:** No action needed — `CLAUDE.md` (which imports `AGENTS.md`) loads automatically.
587
416
 
588
417
  **Using ClawMem from other projects:** Your agent needs instructions on how to use ClawMem's hooks and MCP tools. Two options:
589
418
 
590
419
  ### Option A: Copy instructions into your project
591
420
 
592
- Copy the contents of `CLAUDE.md` (or the relevant sections) into your project's own `CLAUDE.md` or `AGENTS.md`. Simple but requires manual updates when ClawMem changes.
421
+ Copy the contents of `AGENTS.md` (or the relevant sections) into your project's own `AGENTS.md` or `CLAUDE.md`. Simple but requires manual updates when ClawMem changes.
593
422
 
594
423
  ### Option B: Add a trigger block (recommended)
595
424
 
@@ -645,7 +474,7 @@ ALWAYS `compact=true` first → review → `multi_get` for full content.
645
474
  - Do NOT forget memories to "clean up" — let confidence decay handle it
646
475
  - Do NOT wait for curator to pin decisions — pin immediately when critical
647
476
 
648
- For detailed operational guidance (query optimization, troubleshooting, collection setup, embedding workflow, graph building, curator), find and read the shipped SKILL.md:
477
+ For detailed operating guidance (escalation gate, tool routing, query-optimization levers, pipeline behavior, composite scoring, lifecycle), find and read the shipped SKILL.md (setup, inference, and internals live in AGENTS.md + docs/):
649
478
  Bash: CLAWMEM_ROOT=$(cd "$(dirname "$(which clawmem)")/.." && pwd) && echo "$CLAWMEM_ROOT/SKILL.md"
650
479
  Then: Read the file at that path.
651
480
  ```
@@ -1153,7 +982,7 @@ clawmem serve --port 7438 &
1153
982
 
1154
983
  ## Deployment
1155
984
 
1156
- Three-tier retrieval architecture: infrastructure (watcher + embed timer) → hooks (~90%) → agent MCP (~10%). Works out of the box without a dedicated GPU (all models auto-download via `node-llama-cpp`, uses Metal on Apple Silicon). For best performance, run the inference services on GPU (three `llama-server` instances in the default stack; the SOTA reranker is a transformers sidecar) — see [GPU Services](#gpu-services) for model tiers (SOTA vs QMD native) and [Cloud Embedding](#option-c-cloud-embedding-api) for cloud embedding alternatives.
985
+ Three-tier retrieval architecture: infrastructure (watcher + embed timer) → hooks (~90%) → agent MCP (~10%). Works out of the box without a dedicated GPU (all models auto-download via `node-llama-cpp`, uses Metal on Apple Silicon). For best performance, run the inference services on GPU (three `llama-server` instances in the default stack; the SOTA reranker is a transformers sidecar) — see [Inference services](docs/guides/inference-services.md) for model tiers (SOTA vs QMD native) and [cloud embedding](docs/guides/cloud-embedding.md) for cloud embedding alternatives.
1157
986
 
1158
987
  Key services: `clawmem-watcher` (auto-index on file change + beads sync), `clawmem-embed` timer (daily embedding sweep), 7 Claude Code hooks installed by default (context injection, curator nudge, compaction support, decision extraction, handoffs, feedback). Optional `clawmem-curator` agent for on-demand lifecycle triage, retrieval health checks, and maintenance (`clawmem setup curator`).
1159
988