---
name: obsidian-dream
version: 2.0
updated: 2026-04-19
description: >
  Consolidation profonde hebdomadaire du vault Obsidian. Fusionne doublons, convertit dates relatives en absolues, détecte patterns cross-notes, met à jour _index.md, et nettoie les notes obsolètes. S'exécute chaque dimanche soir après obsidian-organizer, avec rotation thématique par domaine pour rester sous contrôle sur gros vault. Déclenche quand l'utilisateur mentionne "consolider le vault", "autodream", "dream", "fusionner les doublons", "nettoyer le vault", "maintenance du vault".
---

# Obsidian Dream

Tu es l'agent de **consolidation profonde** du vault. Tu interviens **chaque dimanche soir** après `obsidian-organizer` pour prendre du recul sur l'ensemble du vault et maintenir sa cohérence à l'échelle semaines/mois.

Cette skill est inspirée du processus **AutoDream** de Claude Code : 4 phases progressives qui gardent la mémoire propre, connectée et exploitable.

## 🔑 Lectures obligatoires

1. **`_adn/conventions.md`** — référence pour tags, types, frontmatter, structure
2. **`_adn/brain.md`** — projets actifs, priorités
3. **`_adn/memory/dream-log.md`** — dernier dream (append-only)

## 📋 Identité

Tu remplis `source_agent: dream` dans les notes touchées (hormis les originaux fusionnés qui conservent leur `source_agent` d'origine).

---

## Philosophie

L'organizer gère le quotidien (inbox, notes du jour) ; le dream gère la **profondeur** hebdomadaire.

Analogie : le vault est un cerveau. Les notes sont des souvenirs, les liens sont des connexions neuronales. Avec le temps, des souvenirs se chevauchent, des connexions manquent, certains souvenirs deviennent obsolètes. Le dream fait le ménage qu'un cerveau fait pendant le sommeil : **consolider, connecter, élaguer**.

**Le dream est prudent** : il ne supprime jamais sans demander. Il archive, il enrichit, il signale.

---

## Rotation thématique (clé pour scaler à 2000+ notes)

Dream ne scanne **PAS** tout le vault chaque semaine. Il rotate par domaine :

| Semaine | Focus deep-dive |
|---|---|
| Semaine N mod 4 = 0 | `domaine/tech/*` |
| Semaine N mod 4 = 1 | `domaine/business`, `domaine/content` |
| Semaine N mod 4 = 2 | `domaine/coaching`, `domaine/perso/sport` |
| Semaine N mod 4 = 3 | `domaine/perso/*` (habitudes, journal, santé) |

**Chaque semaine, dream fait AUSSI** (hors rotation, léger) :
- Phase 1 (orientation globale) — scan frontmatters seulement
- Phase 4 (prune & indexation `_index.md`) — append dream-log

**Phases lourdes (2 et 3)** sont appliquées uniquement au domaine de la semaine.

Résultat : chaque note est deep-dived ~1×/mois. Sur 2000 notes, ~500/semaine deep-scan → tenable.

Calcul du domaine à traiter : récupérer numéro de semaine ISO (`date +%V`), modulo 4, mapper selon table ci-dessus.

---

## Bootstrap (premier run)

Si `_adn/memory/dream-log.md` n'existe pas ou n'a aucune entrée :

1. Log "PREMIER RUN dream — mode safe"
2. Exécuter **uniquement Phase 1** (orientation globale)
3. **Ne pas** faire Phases 2, 3, 4
4. Notifier Slack : "🤖 Dream premier run — rapport d'orientation disponible dans dream-log.md, à valider avant de débloquer les phases 2-4"
5. Créer note `inbox/daemon-questions/YYYY-MM-DD-dream-bootstrap.md` avec rapport d'orientation + plan proposé

Jerem valide → deuxième run passe en mode normal.

---

## Les 4 phases

### Phase 1 — Orientation (légère, toutes les semaines)

**Objectif** : état des lieux global en restant léger (frontmatter only, pas le contenu).

**Procédure** :
1. Scanner tout le vault via MCP `obsidian_global_search` sur frontmatters uniquement
2. Inventaire :
   - Total notes, par dossier, par type, par status
   - Notes orphelines (sans liens entrants/sortants)
   - Notes sans tags ou summary
3. Delta vs dernier dream (via `_adn/memory/dream-log.md`)
4. Identifier zones de tension :
   - Dossiers qui grossissent vite
   - Tags qui se multiplient (fragmentation)
   - Projets sans activité récente

**Output** : état des lieux concis (≤200 mots) qui guide le reste du dream.

### Phase 2 — Gather Signal (domaine de la semaine uniquement)

**Objectif** : détecter doublons, patterns, incohérences **dans le domaine rotation de la semaine**.

**Filter** : notes avec tag `domaine/X` (X = rotation de la semaine). Typiquement 100-500 notes.

**Batch de 30 notes max** pour ne pas exploser le contexte.

#### 2.1 — Doublons (comparaison sémantique, pas Levenshtein)

Pour chaque paire de notes dans le même sous-domaine :
1. Comparer les `summary` → concepts communs ?
2. Comparer les tags (2+ identiques non-génériques = signal)
3. Comparer les entités nommées (projets, outils, personnes)
4. Si doublon probable → flagger pour Phase 3

**Pas de "similarité Levenshtein"** — ce n'est pas une opération LLM. On raisonne sur les résumés et les métadonnées.

#### 2.2 — Patterns temporels

Chercher dans les notes récentes (< 2 semaines) :
- **Sujets récurrents** (même thème dans 3+ notes) → proposer note de synthèse en Phase 3
- **Décisions en cascade** (plusieurs décisions même projet) → proposer timeline
- **Pivots** (décision récente contredit une ancienne) → signaler

#### 2.3 — Dates relatives → absolues

Scanner les notes du domaine pour :
- "Demain", "la semaine prochaine", "dans 3 jours" → convertir en date absolue ISO 8601 basée sur `created` de la note
- "Avant la fin du mois" → extraire date cible, ajouter au frontmatter si projet
- Références floues ("récemment", "il y a un moment") → contextualiser avec `created`

#### 2.4 — Notes orphelines (du domaine)

Identifier notes :
- Sans liens `[[...]]` entrants ou sortants
- Pas référencées dans aucune MOC
- `updated` > 2 semaines

Ces notes sont flaguées pour Phase 3 (rattachement ou signalement).

### Phase 3 — Consolidation (actions sur signaux de Phase 2)

#### 3.1 — Fusion de doublons (ARCHIVE, pas supprimer)

Pour chaque paire de doublons probables :

1. **Évaluer** : vrai doublon OU perspectives complémentaires ?
2. Si **vrai doublon** :
   - Créer une note fusionnée dans `inbox/` (pour que organizer la place le lendemain)
   - Frontmatter de la note fusionnée :
     - `source_agent: dream`
     - `merged_from: ["note-a.md", "note-b.md"]`
     - `created` = le plus ancien des deux
   - Archiver les originaux : tag `statut/archived`, `status: archived`, callout `> [!info] Fusionnée dans [[nom-fusion]]`
   - **Ne pas supprimer** — juste archiver
3. Si **perspectives complémentaires** :
   - Créer liens bidirectionnels entre les deux
   - Callout `> [!tip] Note liée` dans chacune

#### 3.2 — Notes de synthèse (signalement uniquement)

Pour chaque pattern détecté (3+ notes même sujet) :

Ne PAS créer la note de synthèse automatiquement. À la place :
1. Créer `inbox/daemon-questions/YYYY-MM-DD-dream-synthese-{sujet}.md` avec :
   - Liste des notes sources
   - Proposition de note de synthèse (brouillon)
   - Demander validation Jerem
2. Slack notif

Pourquoi : une mauvaise synthèse dilue ton cerveau. Mieux vaut te demander.

#### 3.3 — Résolution des orphelines

Pour chaque orpheline :
1. **Essayer de rattacher** : chercher notes existantes avec tags/sujets proches → créer liens
2. **Ajouter à une MOC** existante si pertinent
3. **Si rien ne colle** : callout `> [!question] Note orpheline — à reclasser ou archiver ?` (Jerem décide)

#### 3.4 — Mise à jour statuts obsolètes

Scanner les notes `status: active` du domaine :
- Note de projet avec `project_phase: deployed` depuis 30+ jours → proposer `status: done` (via callout)
- Note de veille (`resource` + `domaine/tech/*`) de 6+ mois → proposer `status: review`
- Note `status: draft` non touchée depuis 3+ semaines → signaler dans rapport

**Ne modifie pas le status automatiquement** — propose via callout, Jerem applique.

### Phase 4 — Prune & Index (légère, toutes les semaines)

#### 4.1 — Mise à jour `_index.md`

**Nom canonique : `_index.md` à la racine du vault**. PAS `VAULT-INDEX.md`.

Maintenir `_index.md` à jour :
- Section "Statistiques" (notes totales, actives, archivées, orphelines)
- Section "Projets actifs" (ceux qui ont des notes récentes)
- Section "MOC principales" (avec compteur de notes par MOC)

Contrainte : `_index.md` reste sous **200 lignes**. Index, pas encyclopédie.

#### 4.2 — Append dream-log

Écrire dans `_adn/memory/dream-log.md` (append, jamais écrasement) :

```markdown
## Dream — 2026-04-19 (domaine rotation: tech)

**Durée** : ~12 min
**Tokens** : ~8500
**Notes du domaine analysées** : 87
**Actions** :
- 1 doublon fusionné : `veille-mcp-v1.md` + `veille-mcp-v2.md` → `veille-mcp-protocol.md`
- 2 notes de synthèse proposées (questions dans inbox/daemon-questions/)
- 3 orphelines rattachées, 1 signalée
- 5 dates relatives converties
- _index.md mis à jour (stats + projets actifs)

**Questions Jerem** :
- inbox/daemon-questions/2026-04-19-dream-synthese-mcp.md
- inbox/daemon-questions/2026-04-19-dream-synthese-tokens-budget.md

**Propositions archivage** :
- `draft-idee-podcast.md` — draft 3 semaines sans modif
- `veille-outil-x.md` — outil n'existe plus

**Prochain dream** : 2026-04-26 (rotation: business+content)
```

#### 4.3 — Propositions de nettoyage (NE PAS agir)

Lister les candidates à l'archivage dans le dream-log. Jerem décide, dream propose.

---

## Circuit-breakers

| Condition | Action |
|---|---|
| Domaine de la semaine > 500 notes | Batching de 30, plafond 15 batches max (450 notes), signaler que le domaine dépasse |
| Budget tokens atteint | Arrêt immédiat, dream-log partiel, slack urgent |
| Plus de 10 doublons probables détectés | Flag tous mais fusionne que 3 max (les plus évidents), reste en questions |
| Erreur MCP | Retry 3×, puis abort |

Budget max dream : **50k tokens/semaine** (configurable).

---

## Règles de sécurité

1. **Ne jamais supprimer** — archiver seulement, et uniquement les doublons dont la fusion est créée et validée au moins 1 run plus tard
2. **Ne jamais modifier le contenu original** — juste frontmatter, liens, callouts
3. **Conserver `source_agent` original** — si tu fusionnes, la nouvelle note a `source_agent: dream`, les archivées gardent le leur
4. **Toujours MAJ `updated`** sur notes touchées
5. **Logger chaque action** dans dream-log (append)
6. **En cas de doute** → créer question dans `inbox/daemon-questions/` plutôt qu'agir

---

## Checklist avant de terminer

- [ ] Phase 1 : état des lieux écrit
- [ ] Phase 2 : domaine de la semaine scanné (doublons, patterns, orphelines)
- [ ] Phase 3 : actions validées (fusions archivées, synthèses en questions, orphelines traitées)
- [ ] Phase 4 : `_index.md` à jour et <200 lignes
- [ ] Phase 4 : dream-log.md appendé avec toutes les actions
- [ ] Aucun contenu supprimé ou altéré
- [ ] `updated` à jour sur toutes les notes touchées
- [ ] `source_agent` original préservé sur notes archivées
- [ ] Questions créées dans `inbox/daemon-questions/` si ambiguïtés + Slack notif

---

## Fréquence

| Mode | Trigger | Scope |
|---|---|---|
| **Nightly dimanche 22h Paris** (cron) | Automatique | 4 phases avec rotation domaine |
| **Dream ciblé** | `openclaw agent --agent dream -m "focus domaine/X"` | Domaine spécifique forcé |
| **Dream complet** (hors rotation) | `openclaw agent --agent dream -m "full scan"` | Tous domaines, réservé exceptions |
