---
name: qmd-search
description: Recherche sémantique/hybride locale dans l'espace SilverBullet via QMD (BM25 + vecteurs, 100 % local, 0 token API) — quand l'utiliser, commandes, routage avec SLIQ/grep, limites (CPU, pas de rerank par défaut), garde-fous (lecture seule, perms groupe).
---

# Skill: qmd-search

Recherche **floue / sémantique** dans l'espace SilverBullet `shizendo` via QMD — moteur local (BM25 + vecteurs EmbeddingGemma, index SQLite en `~/.cache/qmd/index.sqlite`). Complète SLIQ (structuré) et grep (texte exact). Zéro token API, zéro service résident.

## Quand charger ce skill

- Question vague ou sémantique : « dans quelle note ai-je parlé de X ? », « où est-ce qu'on a traité... ? » sans mot-clé exact.
- Recherche par sens, pas par chaîne littérale.
- Volumétrie élevée où grep/SLIQ ne suffisent plus (2000+ notes).

## Routage (décision d'outil)

| Besoin | Outil |
|---|---|
| Attribut/frontmatter/tag/task structuré | SLIQ via `eval_lua` (skill silverbullet-mcp) |
| Mot-clé **exact** / regex | `grep -r` sur `/home/yunohost.app/silverbullet/notes/shizendo` (accès lecture via groupe) |
| Sens / reformulation / flou | **qmd** (ce skill) |

## Commandes

```bash
# Recherche hybride BM25 + vecteurs (RERANK DÉSACTIVÉ — trop lent sur CPU, ~5 min sinon)
~/.local/bin/qmd query "gestion des sessions dans les discussions" --no-rerank -n 5

# BM25 seul (quasi instantané, ~0,3 s) pour mots-clés proches
~/.local/bin/qmd search "usermod groupe silverbullet" -n 3

# Sémantique pur (vecteurs) — ~5 s
~/.local/bin/qmd vsearch "comment connecter OpenCode desktop au serveur" -n 3

# Résultats en markdown pour injection dans le contexte
~/.local/bin/qmd query "..." --no-rerank --md --full -n 3
```

- Les résultats sont des URI `qmd://shizendo/03_NOTES/.../page.md` → **nom de page SB = chemin sans `.md`**.
- Volumétrie : 868 fichiers / 2525 chunks (28/10). Indexation maintenue par cron nocturne `cron-qmd-update.sh` (02:30 UTC) — incrémental.

## Limites

- **Pas de rerank en usage courant** (Qwen3-0.6B = 5+ min sur CPU). `--no-rerank` par défaut ; rerank réservé à un besoin ponctuel explicite.
- PATH : `~/.local/bin` est dans le PATH du service depuis le 28/10 (export dans `opencode-serve.sh`, effectif après restart du service) → `qmd` appelable directement ; sinon chemin complet `~/.local/bin/qmd`.
- Sous forte charge mémoire, `QMD_EMBED_PARALLELISM=2` obligatoire (sinon erreurs "LLM session expired").
- Embeddings incrémentaux : nouvelle note = quelques secondes ; en attente de l'index → les notes < 24 h ne sont pas trouvées par vsearch (utiliser grep).

## Garde-fous

- **Lecture seule** : jamais d'écriture directe dans l'espace (l'index QMD est une copie). Toute écriture passe par MCP silverbullet-ai ou API /.fs.
- ⚠️ Perms d'accès (`usermod -aG silverbullet opencode`) à re-vérifier après chaque upgrade YunoHost de SilverBullet.
- Exclusion `.chrome-data` configurée dans `~/.config/qmd/index.yml` (profil Chrome inaccessible sinon).