From 4954fe1ad3885638d23bcd28a7fec09d1c08507f Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 1 Jun 2026 12:11:00 +0000 Subject: [PATCH 1/5] docs(backlog): add consolidation & maturity epic (v7) + 5 cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Epic capturing the 'harness > modèle' lesson into operational work: ulk grows faster than it consolidates (171 agent files, divergent counts, manual numbering collisions). - milestone-consolidation-maturite: epic + governance rule (un entre = un sort) - FEAT-agent-usage-stats: ulk agents stats → mesurer l'usage réel, archiver la traîne morte - FEAT-agent-id-automation: auto-ID + golden test anti-collision (harvey/thor #73) - FEAT-token-benchmark-harness: benchmark reproductible versionné (prouver les gains) - FEAT-ulk-init-onboarding: ulk init interactif (abaisser la barrière d'entrée) - SPEC-declarative-workflows: orchestration déterministe (à cadrer, anti sur-ingénierie) https://claude.ai/code/session_01JrFhrsWDBZVZBRMN6MiXG4 --- .../CARD.md | 64 +++++++++++++ .../2026-06-01-FEAT-agent-usage-stats/CARD.md | 84 +++++++++++++++++ .../CARD.md | 70 +++++++++++++++ .../CARD.md | 80 +++++++++++++++++ .../CARD.md | 88 ++++++++++++++++++ .../CARD.md | 89 +++++++++++++++++++ 6 files changed, 475 insertions(+) create mode 100644 docs/backlog/2026-06-01-FEAT-agent-id-automation/CARD.md create mode 100644 docs/backlog/2026-06-01-FEAT-agent-usage-stats/CARD.md create mode 100644 docs/backlog/2026-06-01-FEAT-token-benchmark-harness/CARD.md create mode 100644 docs/backlog/2026-06-01-FEAT-ulk-init-onboarding/CARD.md create mode 100644 docs/backlog/2026-06-01-SPEC-declarative-workflows/CARD.md create mode 100644 docs/backlog/2026-06-01-milestone-consolidation-maturite/CARD.md diff --git a/docs/backlog/2026-06-01-FEAT-agent-id-automation/CARD.md b/docs/backlog/2026-06-01-FEAT-agent-id-automation/CARD.md new file mode 100644 index 00000000..1d2692cf --- /dev/null +++ b/docs/backlog/2026-06-01-FEAT-agent-id-automation/CARD.md @@ -0,0 +1,64 @@ +--- +title: Automatiser les IDs d'agents — fin de la numérotation manuelle +type: feature +status: todo +assigned: task-runner +description: La numérotation manuelle des agents a dépassé sa capacité (collision harvey #73 / thor #73). Générer l'ID automatiquement et faire échouer la CI sur toute collision via un golden test. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" + - "[[2026-06-01-FEAT-agent-usage-stats]]" +priority: high +effort: S +tags: [ulk, registry, agents, ci, golden-test, governance] +--- + +# Automatiser les IDs d'agents — fin de la numérotation manuelle + +**CONSOLIDATION-2** · [P0] · 🔴 critical + +Chantier de l'epic [[2026-06-01-milestone-consolidation-maturite]]. + +## Pourquoi + +L'historique git porte la preuve que la numérotation manuelle a dépassé sa +capacité : `harvey #73` puis `thor #73`, suivis d'un commit +« renumber to resolve #73 collision ». Deux agents ont partagé un numéro et +**la CI n'a rien bloqué**. Un système qui repose sur un humain pour garantir +l'unicité d'un identifiant dans un espace de 75+ entrées est cassé par design. + +## Quoi faire + +Deux options à arbitrer (proposer la #A par défaut) : + +### Option A (recommandée) — ID auto-attribué + invariant CI + +1. `generate-registry.cjs` attribue le **prochain numéro libre** à tout nouvel + agent sans ID, au lieu de le laisser à l'auteur. +2. Golden test (`framework/tests/agents-golden.test.mjs`) qui **échoue** si : + - deux agents partagent un numéro, + - un ID référencé dans `CLAUDE.md` / site / routing bruce n'existe pas, + - un trou de numérotation non documenté apparaît. +3. La CI exécute ce test → impossible de merger une collision. + +### Option B — abandonner les numéros + +Identifier les agents par leur seul nom (bruce, thor…) ; les numéros +deviennent cosmétiques/historiques. Plus radical, casse les références `#NN` +existantes dans la doc et le routing. + +## Critères d'acceptation + +- [ ] Décision A vs B tranchée et notée dans le CARD +- [ ] (A) `generate-registry.cjs` attribue l'ID automatiquement, idempotent +- [ ] Golden test échoue sur collision de numéro — vérifié en injectant un doublon +- [ ] Golden test échoue sur référence d'ID orpheline (`#NN` cité mais inexistant) +- [ ] CI câblée pour exécuter ce test sur chaque PR +- [ ] `.claude/rules/agents-authoring.md` mis à jour : « ne jamais attribuer un + numéro à la main » + +## Notes + +Petit effort, fort levier : ferme définitivement une classe entière de bugs +silencieux. À faire tôt dans l'epic — avant d'ajouter quoi que ce soit d'autre. diff --git a/docs/backlog/2026-06-01-FEAT-agent-usage-stats/CARD.md b/docs/backlog/2026-06-01-FEAT-agent-usage-stats/CARD.md new file mode 100644 index 00000000..0d490bd7 --- /dev/null +++ b/docs/backlog/2026-06-01-FEAT-agent-usage-stats/CARD.md @@ -0,0 +1,84 @@ +--- +title: ulk agents stats — mesurer l'usage réel des agents +type: feature +status: todo +assigned: task-runner +description: Croiser le registry avec accountability.jsonl pour produire un rapport d'usage réel par agent (invocations / 30j) et identifier la traîne morte candidate à l'archivage. Réconcilie aussi le comptage divergent (95 / 76 / 171). +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" + - "[[2026-06-01-FEAT-agent-id-automation]]" +priority: high +effort: M +tags: [ulk, cli, agents, metrics, consolidation, accountability] +--- + +# ulk agents stats — mesurer l'usage réel des agents + +**CONSOLIDATION-1** · [P0] · 🔴 critical + +Premier chantier de l'epic [[2026-06-01-milestone-consolidation-maturite]]. +On ne peut pas décider quoi archiver sans donnée. Ce chantier produit la donnée. + +## Pourquoi + +Le repo contient **171 fichiers `.md` d'agents**, alors que `CLAUDE.md` annonce +« 95 agents » et le registry « prochain #76 ». Trois chiffres divergents = on a +perdu la trace de ce qui est réellement vivant. Un harness à 40 agents vivants +bat un harness à 171 dont la majorité dort : moins de surface, moins de tokens +chargés (`tools/list`, registry), navigation plus claire. + +La donnée d'usage existe déjà : le hook `--with-accountability` écrit +`.ulk-reports/accountability.jsonl` (audit trail des mutations) et +`/ai-adoption` exploite les signaux git. Il manque juste l'agrégation par agent. + +## Quoi faire + +### 1. Réconcilier le comptage + +- Définir **une source de vérité unique** pour le nombre d'agents + (`framework/agents/registry.json`). +- Auditer l'écart 171 fichiers vs 95 annoncés : variantes multi-provider + (`AGENTS.md`/`GEMINI.md`/`.gemini/agents/`) ? doublons ? agents legacy non + retirés ? Documenter la ventilation. +- Corriger `CLAUDE.md` et tout endroit citant un compte d'agents pour pointer + vers le chiffre canonique. + +### 2. Commande `ulk agents stats` + +Nouvelle sous-commande Go (`framework/cli/cmd/`), pur local, 0 token : + +``` +ulk agents stats [--since 30d] [--json] [--dead] +``` + +- Croise le registry (liste des agents déclarés) avec les invocations réelles + inférées de `.ulk-reports/accountability.jsonl` (+ fallback : signaux git, + mentions dans l'historique des sessions si disponibles). +- Sortie : par agent → `invocations (N) · dernière utilisation · statut`. +- `--dead` : ne liste que les agents jamais invoqués sur la fenêtre → candidats + à l'archivage. +- `--json` : consommable par 2b3 (checkpoint) et obiwan (métriques produit). + +### 3. Procédure d'archivage + +- Définir où vont les agents archivés (`docs/_archive/agents-legacy-/` ou + flag `archived: true` dans le registry). +- Documenter la procédure dans `.claude/rules/agents-authoring.md`. + +## Critères d'acceptation + +- [ ] Comptage d'agents réconcilié : `CLAUDE.md`, registry et nombre de fichiers + racontent la même histoire (ou l'écart est documenté et justifié) +- [ ] `ulk agents stats` implémenté avec tests Go (`framework/cli/cmd/`) +- [ ] `ulk agents stats --dead` produit une liste exploitable de candidats +- [ ] `--json` validé contre un schéma (réutiliser `framework/schemas/`) +- [ ] Procédure d'archivage documentée dans `.claude/rules/agents-authoring.md` +- [ ] Rapport d'usage initial committé comme baseline (snapshot 2026-06-01) + +## Notes + +⚠️ Ne **rien archiver** dans ce chantier — il produit seulement la donnée et la +procédure. La décision d'archivage se prend au niveau de l'epic, à la lumière du +rapport. Mesurer avant de couper. diff --git a/docs/backlog/2026-06-01-FEAT-token-benchmark-harness/CARD.md b/docs/backlog/2026-06-01-FEAT-token-benchmark-harness/CARD.md new file mode 100644 index 00000000..38af14af --- /dev/null +++ b/docs/backlog/2026-06-01-FEAT-token-benchmark-harness/CARD.md @@ -0,0 +1,70 @@ +--- +title: Benchmark tokens reproductible — prouver la valeur par la mesure +type: feature +status: todo +assigned: task-runner +description: Les gains tokens d'ulk (−79%, −40-74%, cache hit 0.1×) sont affirmés mais pas mesurés en continu. Construire un benchmark reproductible (tâche type rejouée avec/sans ulk) qui sort un chiffre versionné dans le repo. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" +priority: medium +effort: M +tags: [ulk, benchmark, tokens, cost, measurement, reproducible] +--- + +# Benchmark tokens reproductible — prouver la valeur par la mesure + +**CONSOLIDATION-3** · [P1] · 🟠 warning + +Chantier de l'epic [[2026-06-01-milestone-consolidation-maturite]]. + +## Pourquoi + +Tout le pitch ulk repose sur des chiffres d'économie : « −79% tokens rapports », +« −40-74% sur fichiers > 150L » (symbols), « cache hit = 0.1× ». **Ce sont des +promesses, pas des mesures continues.** La couche « Cost & Workflow » est le +pilier #1 d'ulk et l'une des deux que tout le monde oublie dans le harness — il +faut donc qu'elle soit *prouvée*, pas seulement revendiquée. + +Le jour où on peut dire « ulk fait cette tâche en X tokens vs Y sans, mesuré le +1er juin, rejouable », l'argument cesse d'être marketing et devient factuel. + +## Quoi faire + +### 1. Définir un panier de tâches type + +3 à 5 tâches représentatives et déterministes, ex : +- générer un rapport d'agent (mesure l'effet caveman), +- naviguer/éditer un fichier > 150 lignes (mesure l'effet symbols), +- une session multi-tour (mesure l'effet session lock / cache hits), +- compresser une sortie verbose (mesure l'effet RTK). + +### 2. Harness de mesure + +- Script (`evaluate/` existe déjà à la racine — réutiliser) qui rejoue chaque + tâche **avec** et **sans** les optimisations ulk. +- Capture : tokens input/output, cache hits/writes, coût estimé, latence. +- Sortie : tableau Markdown + JSON versionnés. + +### 3. Baseline versionnée + +- Committer un `BENCHMARK.md` (ou `evaluate/results/.json`) à la racine. +- Idéalement : job CI hebdo (routine) qui rejoue et détecte les régressions de + gain (un changement qui érode l'économie devient visible). + +## Critères d'acceptation + +- [ ] Panier de 3-5 tâches type défini et documenté +- [ ] Harness de mesure rejouable en une commande (`evaluate/`) +- [ ] Chiffres avec/sans ulk capturés (tokens + cache + coût + latence) +- [ ] `BENCHMARK.md` baseline committé avec snapshot daté +- [ ] (Stretch) routine CI hebdo de détection de régression de gain +- [ ] Les chiffres de `CLAUDE.md` (−79%, −40-74%…) pointent vers cette mesure ou + sont corrigés pour correspondre + +## Notes + +Garde-fou : le benchmark doit être **honnête** — inclure les cas où ulk +n'apporte rien ou coûte plus (cache write 1.25×, overhead registry). Un +benchmark qui ne montre que des victoires n'est pas crédible. diff --git a/docs/backlog/2026-06-01-FEAT-ulk-init-onboarding/CARD.md b/docs/backlog/2026-06-01-FEAT-ulk-init-onboarding/CARD.md new file mode 100644 index 00000000..00a49b0d --- /dev/null +++ b/docs/backlog/2026-06-01-FEAT-ulk-init-onboarding/CARD.md @@ -0,0 +1,80 @@ +--- +title: ulk init — abaisser la barrière d'entrée +type: feature +status: todo +assigned: tony +description: La barrière d'entrée est le talon d'Achille d'ulk (CLAUDE.md ~300 lignes, ~40 flags d'install, 171 agents exposés d'emblée). Un `ulk init` interactif qui pose 3 questions et installe le sous-ensemble pertinent. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" + - "[[2026-06-01-FEAT-agent-usage-stats]]" + - "[[2026-05-18-milestone-tui-didactique]]" +priority: medium +effort: L +tags: [ulk, cli, onboarding, ux, wizard, adoption] +--- + +# ulk init — abaisser la barrière d'entrée + +**CONSOLIDATION-4** · [P1] · 🟠 warning + +Chantier de l'epic [[2026-06-01-milestone-consolidation-maturite]]. + +## Pourquoi + +Le vrai talon d'Achille d'ulk vs un framework Python (`pip install`) : la courbe +d'entrée. Comprendre une `CLAUDE.md` de ~300 lignes, choisir parmi ~40 flags +`--with-*` et naviguer 171 agents avant d'avoir produit quoi que ce soit, c'est +un outil d'expert, pas un quickstart. « Mieux » suppose adoption — et l'adoption +meurt au premier `./install.sh --help`. + +Ce chantier capitalise sur le travail déjà fait : le wizard interactif +(`framework/cli/tui/wizard.go`) et l'epic TUI didactique +[[2026-05-18-milestone-tui-didactique]] (chaque module explique *pourquoi*). + +## Quoi faire + +### 1. `ulk init` — onboarding par intention, pas par catalogue + +``` +ulk init +``` + +3 questions maximum, qui mappent vers un profil d'install : + +1. **Tu fais quoi ?** web · mobile · backend/CLI · design · docs +2. **Tu veux l'optimisation tokens agressive ?** oui (RTK + caveman + session + lock + symbols) / non +3. **Cloud ou local ?** managed agents · machine locale + +→ Résout un sous-ensemble cohérent de modules/agents au lieu d'exposer tout. + +### 2. Profils prédéfinis + +- Définir 4-5 profils (`web`, `mobile`, `minimal`, `full`, `token-saver`) comme + presets de flags dans le CLI Go. +- `ulk init --profile web` pour le mode non-interactif / CI. + +### 3. Surface l'essentiel d'abord + +- Ne présenter au premier run que les ~10 agents cœur (bruce, godspeed, + task-runner, 2b3, shuri…), le reste en « advanced ». +- S'appuie sur la consolidation #1 : ne proposer que des agents vivants. + +## Critères d'acceptation + +- [ ] `ulk init` interactif livré (3 questions max → profil) +- [ ] 4-5 profils prédéfinis avec `--profile ` non-interactif +- [ ] Premier run n'expose que le cœur ; reste accessible via mode advanced +- [ ] Tests Go (`framework/cli/`) sur la résolution profil → modules +- [ ] README / site documentent `ulk init` comme **le** point d'entrée recommandé +- [ ] Cohérence avec la TUI didactique (chaque module garde son *pourquoi*) + +## Notes + +Dépend de #1 (consolidation) : inutile de bâtir un onboarding propre par-dessus +171 agents dont la moitié dort. Faire la soustraction d'abord. + +> **Priorisation epic** : ce chantier passe **au-dessus** de tout nouvel agent. +> La règle d'or « un entre = un sort » s'applique. diff --git a/docs/backlog/2026-06-01-SPEC-declarative-workflows/CARD.md b/docs/backlog/2026-06-01-SPEC-declarative-workflows/CARD.md new file mode 100644 index 00000000..ebb4720a --- /dev/null +++ b/docs/backlog/2026-06-01-SPEC-declarative-workflows/CARD.md @@ -0,0 +1,88 @@ +--- +title: Spec — Workflows déclaratifs pour orchestration déterministe +type: spec +status: todo +assigned: tony +description: Combler le seul vrai trou technique d'ulk vs LangGraph — bruce orchestre par convention Markdown, sans graphe d'exécution ni retry policy. Spécifier un mini-format de workflow déclaratif (étapes, dépendances, stop, fallback) que bruce exécute de façon prévisible. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" +priority: low +effort: L +tags: [ulk, orchestration, workflows, spec, determinism, bruce] +spec: declarative-workflows +--- + +# Spec — Workflows déclaratifs pour orchestration déterministe + +**CONSOLIDATION-5** · [P2] · 🟡 suggestion + +Chantier le plus exploratoire de l'epic +[[2026-06-01-milestone-consolidation-maturite]]. **À cadrer en spec avant tout +code** — ne pas réécrire un moteur d'orchestration. + +## Pourquoi + +C'est la faiblesse réelle d'ulk face aux frameworks à runtime (LangGraph, +CrewAI) : bruce « orchestre » via des conventions Markdown + le Task tool de +Claude Code. Il n'y a **pas** de graphe d'exécution typé, pas de retry policy +programmable, pas de parallélisme garanti, pas de condition de stop déclarée. +C'est de l'orchestration *par prompt*, plus souple mais moins déterministe. + +L'objectif n'est pas de devenir LangGraph — c'est de fermer l'écart juste assez +pour les chantiers où la reproductibilité compte (migrations multi-fichiers, +audits dépôt entier), en s'appuyant sur la primitive Dynamic Workflows déjà +disponible (Opus 4.8, Claude Code ≥ 2.1.154). + +## Quoi faire (spec, pas implémentation) + +### 1. Définir le format + +Un mini-format déclaratif (YAML ou frontmatter étendu) décrivant un workflow : + +```yaml +workflow: audit-repo-complet +steps: + - id: scan + agent: godspeed + stop_on: error + - id: audit + agent: sargeras + depends_on: [scan] + retry: { max: 2, backoff: exponential } + - id: security + agent: ed209 + depends_on: [scan] # parallèle à audit + - id: report + agent: shuri + depends_on: [audit, security] +fallback: 2b3 # checkpoint si interruption +``` + +### 2. Comparer aux primitives existantes + +- Dynamic Workflows (Opus 4.8) : qu'apporte-t-il déjà ? que manque-t-il ? +- blackemperor (18, multi-mode orchestrator) et thor (74, pipeline overnight) : + recouvrement ? ce format les remplace-t-il ou les nourrit-il ? +- Documenter le **delta** à construire, pas plus. + +### 3. Trancher build vs reuse + +Décision explicite : implémenter un exécuteur léger côté CLI Go ? s'appuyer +entièrement sur Dynamic Workflows ? format purement documentaire interprété par +bruce ? La spec doit recommander une option avec ses tradeoffs. + +## Critères d'acceptation (de la spec) + +- [ ] Format déclaratif spécifié avec exemples (étapes, dépendances, retry, stop, fallback) +- [ ] Comparaison documentée vs Dynamic Workflows / blackemperor / thor +- [ ] Recommandation build vs reuse argumentée (tradeoffs) +- [ ] Périmètre d'implémentation chiffré (peut sortir de l'epic si trop lourd) +- [ ] Décision : go / no-go / defer — notée dans le CARD + +## Notes + +Sévérité 🟡 délibérée : c'est le chantier au plus fort risque de +sur-ingénierie. La souplesse Markdown d'ulk est un *choix*, pas un défaut. Ne +fermer l'écart que si la spec prouve un besoin réel mesuré — sinon, defer. diff --git a/docs/backlog/2026-06-01-milestone-consolidation-maturite/CARD.md b/docs/backlog/2026-06-01-milestone-consolidation-maturite/CARD.md new file mode 100644 index 00000000..904f6b12 --- /dev/null +++ b/docs/backlog/2026-06-01-milestone-consolidation-maturite/CARD.md @@ -0,0 +1,89 @@ +--- +title: Epic — Consolidation & maturité ulk (v7) +type: milestone +status: todo +assigned: bruce +description: ulk grossit plus vite qu'il ne se consolide (171 fichiers d'agents, 3 chiffres de comptage divergents, collisions de numéros). Cet epic inverse la tendance — soustraction, automatisation des invariants, preuve par la mesure, abaissement de la barrière d'entrée. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-FEAT-agent-usage-stats]]" + - "[[2026-06-01-FEAT-agent-id-automation]]" + - "[[2026-06-01-FEAT-token-benchmark-harness]]" + - "[[2026-06-01-FEAT-ulk-init-onboarding]]" + - "[[2026-06-01-SPEC-declarative-workflows]]" +priority: high +effort: XL +tags: [ulk, consolidation, governance, maturity, epic] +spec: consolidation-maturite +--- + +# Epic — Consolidation & maturité ulk (v7) + +> **Thèse** : ulk est une preuve par l'implémentation du harness à 7 couches +> (Theory Ventures / Tunguz). Sa force — documenter le harness en Markdown +> plutôt que le coder dans un SDK — est devenue son risque : le harness +> lui-même est en train de devenir le truc qu'il faut maîtriser. Le luxe, +> maintenant, c'est la **soustraction**. + +## Contexte — le signal observé dans le repo (2026-06-01) + +Diagnostic factuel au moment de l'ouverture de l'epic : + +| Symptôme | Preuve | Couche harness touchée | +|---|---|---| +| Comptage incohérent | `CLAUDE.md` dit « 95 agents » · registry dit « prochain #76 » · **171 fichiers `.md`** | Orchestration, Cost & Workflow | +| Numérotation manuelle saturée | Collision `harvey #73` / `thor #73` → commit « renumber to resolve #73 collision » | Governance | +| Expansion = mode par défaut | 5 derniers commits ajoutent des agents (loki, thor, harvey, obiwan) | — | +| Backlog qui s'accumule | Cards du 30 avril encore ouvertes au 1er juin | — | +| Promesses non mesurées en continu | « −79% », « −40-74% », « cache hit 0.1× » affirmés, pas mesurés | Cost & Workflow | +| Barrière d'entrée raide | CLAUDE.md ~300 lignes + 40 flags d'install | Adoption | +| Orchestration non déterministe | bruce orchestre par convention Markdown, sans graphe d'exécution | Orchestration & Loop | + +La lesson `harness > modèle` est déjà capturée en mémoire. Cet epic en tire les +conséquences opérationnelles. + +## Les 5 chantiers (par ordre d'impact) + +``` +🔴 #1 agent-usage-stats → mesurer l'usage réel → archiver la traîne morte (171 → ~40) +🔴 #2 agent-id-automation → tuer la numérotation manuelle (auto-ID + golden test collision) +🟠 #3 token-benchmark → prouver la valeur par un benchmark reproductible versionné +🟠 #4 ulk-init-onboarding → abaisser la barrière d'entrée (init interactif 3 questions) +🟡 #5 declarative-workflows → combler le trou orchestration déterministe +``` + +| # | Card | Sévérité | Effort | +|---|------|----------|--------| +| 1 | [[2026-06-01-FEAT-agent-usage-stats]] | 🔴 critical | M | +| 2 | [[2026-06-01-FEAT-agent-id-automation]] | 🔴 critical | S | +| 3 | [[2026-06-01-FEAT-token-benchmark-harness]] | 🟠 warning | M | +| 4 | [[2026-06-01-FEAT-ulk-init-onboarding]] | 🟠 warning | L | +| 5 | [[2026-06-01-SPEC-declarative-workflows]] | 🟡 suggestion | L | + +## Décision de gouvernance — la règle d'or + +> **À partir de cet epic : un nouvel agent ne peut entrer que si un agent +> existant sort, ou si l'usage réel (mesuré par #1) prouve un manque.** + +C'est la discipline d'une brigade de cuisine étoilée : on n'ajoute pas un commis +à chaque service ; on optimise la brigade existante jusqu'à ce qu'un poste +manque *vraiment*. + +## Séquencement + +- #1 et #2 sont **indépendants** et peuvent partir en parallèle (les deux 🔴). +- #1 **débloque** la décision de consolidation (quels agents archiver). +- #3 est autonome. +- #4 dépend de la consolidation #1 (n'exposer qu'un sous-ensemble pertinent). +- #5 est le plus exploratoire — à cadrer en spec avant tout code. + +## Critères de sortie de l'epic + +- [ ] Comptage d'agents réconcilié : une source de vérité unique, 3 chiffres alignés +- [ ] Traîne morte archivée (objectif : ≤ ~40 agents actifs, justifié par la donnée d'usage) +- [ ] Numérotation impossible à casser à la main (CI bloque les collisions) +- [ ] Un benchmark tokens reproductible et versionné dans le repo +- [ ] `ulk init` interactif livré et documenté +- [ ] Spec workflow déclaratif validée (implémentation hors scope de cet epic si trop lourde) +- [ ] Règle d'or « un entre = un sort » inscrite dans `.claude/rules/agents-authoring.md` From 4d8d3276a5bebfd77c91e66f26251c9cc217aae0 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 1 Jun 2026 14:01:54 +0000 Subject: [PATCH 2/5] docs(backlog): add 4 maturity findings (dogfooding, detachment coord, grooming, agent verify) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Second batch from the 'tu vois autre chose ?' deep-dive: - FEAT-dogfooding-self-optimization (🔴): CLAUDE.md ≈4005 tokens loaded every session; run caveman-compress + /context-audit on ulk itself, in CI. Ultimate credibility test + best marketing angle. - TASK-coordinate-detachment-maturity (🟠): unify consolidation epic with the in-flight GitHub/cloud detachment thread (5 OPS cards 2026-05-31) under one 'maturité v7' banner; decide CI infra before wiring new jobs. - FEAT-backlog-grooming-routine (🟠): 21 todo cards accumulating (oldest 30 apr); no WIP limit — paradoxical for a project shipping a Kanban + checkpoint agent. - SPEC-agent-behavioral-verify (🟡): agents have structural golden tests only; wire verify (65) for semantic meta-conformance (after consolidation #1). Epic milestone updated 5→9 cards. https://claude.ai/code/session_01JrFhrsWDBZVZBRMN6MiXG4 --- .../CARD.md | 54 +++++++++++++ .../CARD.md | 81 +++++++++++++++++++ .../CARD.md | 62 ++++++++++++++ .../CARD.md | 59 ++++++++++++++ .../CARD.md | 13 +++ 5 files changed, 269 insertions(+) create mode 100644 docs/backlog/2026-06-01-FEAT-backlog-grooming-routine/CARD.md create mode 100644 docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md create mode 100644 docs/backlog/2026-06-01-SPEC-agent-behavioral-verify/CARD.md create mode 100644 docs/backlog/2026-06-01-TASK-coordinate-detachment-maturity/CARD.md diff --git a/docs/backlog/2026-06-01-FEAT-backlog-grooming-routine/CARD.md b/docs/backlog/2026-06-01-FEAT-backlog-grooming-routine/CARD.md new file mode 100644 index 00000000..4b848046 --- /dev/null +++ b/docs/backlog/2026-06-01-FEAT-backlog-grooming-routine/CARD.md @@ -0,0 +1,54 @@ +--- +title: Routine de grooming backlog — discipline de WIP +type: feature +status: todo +assigned: godspeed +description: 21 cards todo s'accumulent (la plus vieille du 30 avril, un mois). Aucune limite de WIP. Paradoxal pour un projet qui livre un Kanban (status-board) et un agent checkpoint (2b3). Routine hebdo godspeed qui force close/repriorise/tue toute card todo > 30 jours. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" +priority: medium +effort: S +tags: [ulk, backlog, grooming, wip, flow, godspeed, routine] +--- + +# Routine de grooming backlog — discipline de WIP + +**CONSOLIDATION-8** · [P1] · 🟠 warning + +Chantier de l'epic [[2026-06-01-milestone-consolidation-maturite]]. + +## Pourquoi + +État du backlog au 2026-06-01 : **21 `todo`** · 49 `done` · 3 `blocked` · +3 `backlog` · 1 `wip`. La card todo la plus ancienne date du **30 avril** — un +mois sans mouvement. Aucune limite de WIP n'est appliquée. + +C'est paradoxal : ulk *livre* un Kanban (`@ulk/status-board`) et un agent +checkpoint (2b3) censés imposer la discipline de flow. Le cordonnier est mal +chaussé. Un backlog qui ne fait que grossir n'est pas un backlog, c'est un +cimetière — et il noie les vraies priorités (dont les 8 cards de cet epic). + +## Quoi faire + +- Routine `godspeed` hebdomadaire (déjà recommandée dans CLAUDE.md / routines) : + toute card `todo` ou `backlog` > 30 jours est **triée** → close · repriorisée + explicitement · ou tuée (archivée avec raison). +- Définir une **limite de WIP** soft (ex : ≤ N cards `wip`/`todo` actives à la + fois) et la rendre visible dans le status-board. +- Rapport de grooming : delta hebdo (ouvertes / fermées / tuées) consommé par + obiwan (métriques produit) et 2b3 (checkpoint). + +## Critères d'acceptation + +- [ ] Routine de grooming définie (`/schedule` godspeed weekly) +- [ ] Toute card > 30 jours est forcée à une décision (close/repriorise/tue) +- [ ] Limite de WIP soft définie et affichée dans status-board +- [ ] Premier grooming exécuté : les 21 todo actuelles triées +- [ ] Rapport de grooming hebdo (delta ouvertes/fermées/tuées) + +## Notes + +Premier grooming à faire dans la foulée : les cards OPS du 31/05 et les tasks +apple du 18/05 sont les candidats évidents à re-trancher. diff --git a/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md b/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md new file mode 100644 index 00000000..74e507bd --- /dev/null +++ b/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md @@ -0,0 +1,81 @@ +--- +title: Dogfooding — faire tourner les outils d'ulk sur ulk +type: feature +status: todo +assigned: task-runner +description: ulk prêche l'économie de tokens mais ne l'applique pas à lui-même. CLAUDE.md = ~4005 tokens chargés à chaque session. Faire tourner caveman-compress + /context-audit sur le repo, en CI, et publier le score. Test de crédibilité ultime + meilleur argument marketing. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" + - "[[2026-06-01-FEAT-token-benchmark-harness]]" +priority: high +effort: M +tags: [ulk, dogfooding, tokens, context, caveman, ci, credibility] +--- + +# Dogfooding — faire tourner les outils d'ulk sur ulk + +**CONSOLIDATION-6** · [P0] · 🔴 critical + +Chantier de l'epic [[2026-06-01-milestone-consolidation-maturite]]. Le plus +rentable, et le meilleur coup de com. + +## Pourquoi + +**L'ironie la plus forte du repo : ulk prêche l'économie de tokens mais ne +l'applique pas à lui-même.** Mesures réelles (2026-06-01) : + +- `CLAUDE.md` = **16 020 chars / 256 lignes ≈ 4 005 tokens**, chargé à *chaque* + session, dans *chaque* projet ulk. C'est le fichier le plus lu de tout + l'écosystème. +- Sections les plus lourdes : `Agent System` (2 273 c), `Performance & Token + Economy` (1 821 c — l'ironie maximale), `Skills (opt-in)` (1 662 c), + `Knowledge Vault` (1 615 c, auto-généré), `CLI Tools` (1 321 c). +- **19 renvois de protocole** (`_shared/`, `.claude/rules/`, `@.`) déjà + externalisables — du contenu qui pourrait vivre hors du fichier toujours-chargé. + +ulk *livre* les outils pour corriger ça mais ne les pointe pas vers l'intérieur : +- `caveman-compress` annonce **−46% sur CLAUDE.md** — jamais appliqué au sien. +- `/context-audit` (score 0-100, détecte le CLAUDE.md bloaté) — pas en CI sur sa + propre config. + +> Si ulk ne peut pas optimiser son propre CLAUDE.md, pourquoi un utilisateur le +> croirait sur le sien ? À l'inverse : « ulk a réduit son propre contexte de X%, +> voici comment » est le meilleur argument marketing possible. + +## Quoi faire + +### 1. Mesurer la baseline (fait — à committer) + +- Snapshot : 4 005 tokens, ventilation par section ci-dessus. + +### 2. Dégraisser CLAUDE.md + +- Externaliser les sections détaillées vers `.claude/rules/` / `_shared/` + (chargés à la demande, pas à chaque session) : candidats prioritaires = + `Skills (opt-in)` (déjà partiellement dans `install-reference.md`), + détails CLI, Multi-LLM. +- Garder dans CLAUDE.md le strict essentiel + pointeurs. +- Cible : **réduction significative et mesurée** des ~4 005 tokens. + +### 3. CI auto-dogfooding + +- Job CI qui exécute `/context-audit` (ou son équivalent scriptable) sur le repo + et **publie le score** (badge / commentaire PR). +- `caveman-compress --dry-run` sur CLAUDE.md → rapporte le gain potentiel. +- Optionnel : seuil bloquant si CLAUDE.md dépasse un budget de tokens défini. + +## Critères d'acceptation + +- [ ] Baseline tokens committée (4 005 + ventilation) +- [ ] CLAUDE.md dégraissé, réduction mesurée et chiffrée +- [ ] Aucune perte d'info critique (les renvois externalisés restent accessibles) +- [ ] CI publie le score context-audit du repo à chaque PR +- [ ] Le chiffre de réduction est exploité (README / site / CHANGELOG) + +## Notes + +Garde-fou : externaliser ≠ perdre. Tout ce qui sort de CLAUDE.md doit rester +trouvable via un renvoi explicite. Le but est de déplacer le contenu rarement +nécessaire hors du chemin toujours-chargé, pas de l'effacer. diff --git a/docs/backlog/2026-06-01-SPEC-agent-behavioral-verify/CARD.md b/docs/backlog/2026-06-01-SPEC-agent-behavioral-verify/CARD.md new file mode 100644 index 00000000..d9862e31 --- /dev/null +++ b/docs/backlog/2026-06-01-SPEC-agent-behavioral-verify/CARD.md @@ -0,0 +1,62 @@ +--- +title: Tests comportementaux d'agents — câbler verify (65) en CI +type: spec +status: todo +assigned: shuri +description: Les agents (cœur du produit) n'ont que des golden tests structurels (frontmatter). Rien ne vérifie qu'un agent fait ce que sa doc dit. verify (65) existe pour ça mais n'est pas câblé en CI sur les agents. À 171 agents, le structurel laisse passer la pourriture sémantique. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" + - "[[2026-06-01-FEAT-agent-id-automation]]" +priority: low +effort: M +tags: [ulk, agents, testing, verify, ci, conformance, semantic] +spec: agent-behavioral-verify +--- + +# Tests comportementaux d'agents — câbler verify (65) en CI + +**CONSOLIDATION-9** · [P2] · 🟡 suggestion + +Chantier de l'epic [[2026-06-01-milestone-consolidation-maturite]]. + +## Pourquoi + +Côté code, l'hygiène est saine : **276 fonctions de test Go**, cmd bien couvert +(18 fichiers de test), **2 TODO/FIXME** en tout, **zéro secret hardcodé**. La +dette n'est pas dans le code. + +Mais les **agents** — le cœur du produit — n'ont que des golden tests +*structurels* (`agents-golden.test.mjs` vérifie la forme du frontmatter). **Rien +ne vérifie qu'un agent fait ce que sa doc dit.** verify (65) est exactement +l'outil pour ça (matrice Completeness × Correctness × Coherence) mais il n'est +pas câblé en CI sur les agents eux-mêmes. À 171 agents, le structurel laisse +passer la pourriture sémantique : un agent dont la doc promet un comportement +que son routing/protocole ne tient plus. + +## Quoi faire (spec) + +- Spécifier comment verify (65) peut s'appliquer **aux agents ulk eux-mêmes** + (méta-conformance : la doc d'un agent ↔ son routing dans bruce ↔ ses renvois + `_shared/`). +- Identifier les incohérences détectables automatiquement : renvoi `_shared/` + mort, agent cité dans bruce mais absent du registry, capacité documentée sans + câblage, numéro/nom incohérent (recoupe #2). +- Décider la forme : extension du golden test existant vs job verify dédié. +- Périmètre : commencer par les ~10 agents pivots (déjà couverts par + `agents-golden`), étendre ensuite. + +## Critères d'acceptation (de la spec) + +- [ ] Méthode de méta-conformance agents spécifiée (doc ↔ routing ↔ renvois) +- [ ] Liste des incohérences auto-détectables définie +- [ ] Décision golden-test étendu vs job verify dédié, argumentée +- [ ] Périmètre chiffré (pivots d'abord) + go/no-go +- [ ] Recoupement avec #2 (IDs) documenté pour éviter le doublon + +## Notes + +Sévérité 🟡 : utile mais pas urgent tant que #1 (consolidation) n'a pas réduit +la surface. Vérifier 171 agents sémantiquement avant d'en avoir archivé la +moitié serait du gâchis. **Faire après #1.** diff --git a/docs/backlog/2026-06-01-TASK-coordinate-detachment-maturity/CARD.md b/docs/backlog/2026-06-01-TASK-coordinate-detachment-maturity/CARD.md new file mode 100644 index 00000000..a7779f84 --- /dev/null +++ b/docs/backlog/2026-06-01-TASK-coordinate-detachment-maturity/CARD.md @@ -0,0 +1,59 @@ +--- +title: Coordonner consolidation interne + détachement externe sous « maturité v7 » +type: task +status: todo +assigned: bruce +description: Un chantier de désengagement GitHub/cloud est déjà en vol (5 cards OPS du 2026-05-31, job de cutkiller 51). Il poursuit le même objectif que l'epic consolidation — réduire surface et dépendances. Les chapeauter pour éviter deux initiatives de cleanup parallèles qui dérivent. +created: 2026-06-01 +edited: 2026-06-01 +links: + - "[[2026-06-01-milestone-consolidation-maturite]]" +priority: medium +effort: S +tags: [ulk, governance, coordination, maturity, detachment, cutkiller] +--- + +# Coordonner consolidation interne + détachement externe sous « maturité v7 » + +**CONSOLIDATION-7** · [P1] · 🟠 warning + +Chantier de l'epic [[2026-06-01-milestone-consolidation-maturite]]. + +## Pourquoi + +Le backlog révèle 5 cards OPS du **2026-05-31**, toutes dans la même direction — +un désengagement délibéré de GitHub/cloud (le rôle de cutkiller 51) : + +``` +OPS-REMOVE-GH-WORKFLOWS · OPS-SELF-HOST-BINARIES · OPS-MIGRATE-SITE-COOLIFY +OPS-RELEASE-LOCAL · OPS-GITHUB-DEP-REDUCTION-AUDIT +``` + +L'epic « consolidation » (interne : moins d'agents, moins de surface) et ce +thread « détachement » (externe : moins de dépendances) poursuivent **le même +objectif de fond**. Risque concret : deux initiatives de nettoyage parallèles, +ouvertes à un jour d'intervalle, qui dérivent l'une de l'autre et se +contredisent (ex : une routine CI ajoutée par l'une, supprimée par l'autre). + +## Quoi faire + +- Établir une bannière commune « **maturité v7** » : axe interne (consolidation + agents) + axe externe (détachement dépendances). +- Cross-linker les 5 cards OPS du 31/05 avec l'epic consolidation. +- Définir l'ordre : le détachement CI (`OPS-REMOVE-GH-WORKFLOWS`) impacte + directement les chantiers CI de l'epic (#2 golden test, #3 benchmark, #6 + dogfooding) — décider quelle infra CI subsiste **avant** d'y câbler des jobs. +- Arbitrage Bruce : un seul plan, deux axes, pas deux backlogs. + +## Critères d'acceptation + +- [ ] Les 5 cards OPS du 31/05 liées à l'epic maturité v7 +- [ ] Ordre établi : décision d'infra CI tranchée avant câblage des nouveaux jobs +- [ ] Aucun chantier CI de l'epic ne câble un job sur une infra en cours de suppression +- [ ] Note de coordination dans le milestone + +## Notes + +Effort S : c'est de la coordination, pas du code. Mais à faire **tôt** — sinon +#2/#3/#6 vont câbler des jobs GitHub Actions que `OPS-REMOVE-GH-WORKFLOWS` est +en train de retirer. diff --git a/docs/backlog/2026-06-01-milestone-consolidation-maturite/CARD.md b/docs/backlog/2026-06-01-milestone-consolidation-maturite/CARD.md index 904f6b12..949bb2f0 100644 --- a/docs/backlog/2026-06-01-milestone-consolidation-maturite/CARD.md +++ b/docs/backlog/2026-06-01-milestone-consolidation-maturite/CARD.md @@ -12,6 +12,10 @@ links: - "[[2026-06-01-FEAT-token-benchmark-harness]]" - "[[2026-06-01-FEAT-ulk-init-onboarding]]" - "[[2026-06-01-SPEC-declarative-workflows]]" + - "[[2026-06-01-FEAT-dogfooding-self-optimization]]" + - "[[2026-06-01-TASK-coordinate-detachment-maturity]]" + - "[[2026-06-01-FEAT-backlog-grooming-routine]]" + - "[[2026-06-01-SPEC-agent-behavioral-verify]]" priority: high effort: XL tags: [ulk, consolidation, governance, maturity, epic] @@ -60,6 +64,15 @@ conséquences opérationnelles. | 3 | [[2026-06-01-FEAT-token-benchmark-harness]] | 🟠 warning | M | | 4 | [[2026-06-01-FEAT-ulk-init-onboarding]] | 🟠 warning | L | | 5 | [[2026-06-01-SPEC-declarative-workflows]] | 🟡 suggestion | L | +| 6 | [[2026-06-01-FEAT-dogfooding-self-optimization]] | 🔴 critical | M | +| 7 | [[2026-06-01-TASK-coordinate-detachment-maturity]] | 🟠 warning | S | +| 8 | [[2026-06-01-FEAT-backlog-grooming-routine]] | 🟠 warning | S | +| 9 | [[2026-06-01-SPEC-agent-behavioral-verify]] | 🟡 suggestion | M | + +**Second lot (2026-06-01, findings « tu vois autre chose ? »)** — #6 dogfooding +est le plus rentable et le meilleur coup de com ; #7 coordonne l'epic avec le +thread détachement (5 cards OPS du 31/05) ; #8 corrige la discipline de flow ; +#9 étend verify aux agents eux-mêmes (après #1). ## Décision de gouvernance — la règle d'or From bf0357a61f6d7d06fdeb9fb031a47b4c0e9a40b4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 1 Jun 2026 14:09:15 +0000 Subject: [PATCH 3/5] =?UTF-8?q?refactor(claude-md):=20dogfood=20token=20ec?= =?UTF-8?q?onomy=20=E2=80=94=20dedup=20CLAUDE.md=20-6%=20(4005=E2=86=92373?= =?UTF-8?q?6=20tok)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Passe 1 of the dogfooding chantier (#6): remove pure duplication from the always-loaded CLAUDE.md, content already present in pointed-to files. - Skills (opt-in): design/gstack paragraphs → pointer to install-reference.md - Effort + Dynamic Workflows: trim verbose prose, keep existing pointers - Multi-LLM: model alias table → pointer to multi-provider-protocol.md -1076 chars / -269 tokens / -7 lines. vault:* block untouched, export unaffected (export.go does not read CLAUDE.md), 7 pointers preserved. Passes 2 (aggressive cuts) and 3 (CI) noted in card pending human arbitration / detachment coord. https://claude.ai/code/session_01JrFhrsWDBZVZBRMN6MiXG4 --- .../CARD.md | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md b/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md index 74e507bd..6ec2ef0f 100644 --- a/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md +++ b/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md @@ -79,3 +79,39 @@ ulk *livre* les outils pour corriger ça mais ne les pointe pas vers l'intérieu Garde-fou : externaliser ≠ perdre. Tout ce qui sort de CLAUDE.md doit rester trouvable via un renvoi explicite. Le but est de déplacer le contenu rarement nécessaire hors du chemin toujours-chargé, pas de l'effacer. + +## Résultat — Passe 1 (2026-06-01) : déduplication sûre + +Retrait de **duplication pure** (contenu déjà présent dans les fichiers +pointés), zéro perte d'information, bloc `vault:*` intact : + +| | chars | ~tokens | lignes | +|---|---|---|---| +| Avant | 16 020 | 4 005 | 256 | +| Après | 14 944 | 3 736 | 249 | +| **Delta** | **−1 076** | **−269** | **−7** | + +**−6%**, validé : `export.go` ne lit pas CLAUDE.md (AGENTS.md/GEMINI.md non +impactés), 7 pointeurs préservés. Coupes : +- Skills (opt-in) : 2 paragraphes design/gstack → 1 pointeur `install-reference.md` +- Effort + Dynamic Workflows : prose verbeuse → essentiel + pointeurs existants +- Multi-LLM : table d'alias modèles → pointeur `multi-provider-protocol.md` + +### Passe 2 — coupes plus agressives (⏸️ arbitrage requis) + +Demandent une décision humaine car elles touchent l'utilisabilité du fichier +cœur, pas juste de la dedup : + +- **Agent System** (2 273 c, plus grosse section) : réduire la table de 28 + agents aux ~12 pivots, le reste via `registry.json`. Gain ~800 c mais perd le + quick-ref de routing. +- **Knowledge Vault** (1 615 c, auto-généré) : l'externaliser hors du chemin + toujours-chargé suppose de modifier la logique `lovecraft memory distribute` + (écrire dans un fichier dédié + pointeur). Perd la remontée des lessons + critiques au démarrage de session. + +### Passe 3 — CI auto-dogfooding (⏸️ dépend de #7) + +Ne pas câbler le job context-audit sur GitHub Actions tant que +[[2026-06-01-TASK-coordinate-detachment-maturity]] n'a pas tranché l'infra CI +qui subsiste (`OPS-REMOVE-GH-WORKFLOWS`). From 04c6daa4c3564181b9e846bab4cfbc08ca0b69a0 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 1 Jun 2026 14:23:52 +0000 Subject: [PATCH 4/5] =?UTF-8?q?refactor(memory):=20externalize=20Knowledge?= =?UTF-8?q?=20Vault=20from=20CLAUDE.md=20=E2=86=92=20VAULT-DIGEST.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dogfooding passe 2 (#6): move the auto-generated vault block out of the always-loaded CLAUDE.md into docs/_memory/VAULT-DIGEST.md, leaving a pointer. CLAUDE.md: 4005 → 3398 tokens (-15% total vs baseline, -607 tok). Retargeted the lovecraft memory loop (prompt-driven, no script): - _shared/vault-memory.md: flux, subcommand table, Distribute-4/5/6, template links - _shared/memory-protocol.md: flux, section 3, idempotence, gandalf check, sandbox - _shared/auto-dream-protocol.md: projection target, write sandbox, obsolescence refs - session/34-gandalf.md: Phase 5 vault health check (digest + pointer) - orchestrators/47-lovecraft.md: description, mode table, command table, promotion rule - regenerated registry + compiled gandalf/lovecraft commands Tests: 685/689 pass — the 4 failures (georges golden, managed-agents yaml) are pre-existing, confirmed on a clean tree, unrelated to this change. Tradeoff: critical lessons no longer auto-surface in raw sessions — they surface via godspeed (00) phase 1.5 / bruce, accepted to save ~400 tok on every session. https://claude.ai/code/session_01JrFhrsWDBZVZBRMN6MiXG4 --- docs/_memory/VAULT-DIGEST.md | 19 ++++++++ .../CARD.md | 38 +++++++++++----- .../agents/_shared/auto-dream-protocol.md | 8 ++-- framework/agents/_shared/memory-protocol.md | 35 ++++++++------- framework/agents/_shared/vault-memory.md | 44 ++++++++++--------- .../agents/orchestrators/47-lovecraft.md | 10 ++--- framework/agents/session/34-gandalf.md | 13 +++--- framework/commands/agents/gandalf.md | 13 +++--- framework/commands/agents/lovecraft.md | 10 ++--- 9 files changed, 116 insertions(+), 74 deletions(-) create mode 100644 docs/_memory/VAULT-DIGEST.md diff --git a/docs/_memory/VAULT-DIGEST.md b/docs/_memory/VAULT-DIGEST.md new file mode 100644 index 00000000..889a6563 --- /dev/null +++ b/docs/_memory/VAULT-DIGEST.md @@ -0,0 +1,19 @@ + +# Knowledge Vault — Digest (auto-généré par lovecraft) + +> Synthèse des entrées pertinentes de `docs/_memory/`. Dernière MAJ : 2026-05-23. +> Ne pas éditer manuellement — régénéré à chaque `lovecraft memory distribute`. +> Chargé à la demande (pointé depuis `CLAUDE.md`), pas à chaque session — surface +> via godspeed (00) phase 1.5, bruce, ou lecture directe. + +### 🔴 Lessons critiques (severity: critical) +- **[npm workspaces + peerDeps — conflit TypeScript silencieux](03-lessons/npm-workspaces-peerdeps-typescript-conflict.md)** — Dans un monorepo npm workspaces, `npm install` déclenche la résolution de tous les membres ; un `typescript@^6` dans un sous-package peut entrer en conflit avec le peerDep `typescript@^5` d'un autre — CI rouge chronique pendant des semaines. + +### ⚠️ Lessons à retenir +- **[CI rouge chronique = signal mort](03-lessons/ci-rouge-chronique-signal-mort.md)** — Un CI cassé masque toutes les vraies régressions ; traiter comme urgence P0 même si ça tourne en prod. +- **[Installateur Go — interface Installable + 6 types concrets](03-lessons/installateur-go-interface-installable-6-types.md)** — `fsCopyFile` sans dryRun, `LoadCLIRegistry` fail-soft intentionnel, `compileAgents()` avant `createDirs()` — invariants critiques du CLI Go ulk. + +### 🧩 Patterns recommandés +- **[CI hardening checklist — 4 lignes YAML à fort impact](04-patterns/ci-hardening-checklist-4-lignes-yaml.md)** — Quatre ajouts minimalistes qui éliminent ~30% des runs inutiles et bloquent les jobs runaway. +- **[Wrapper Bash → Go CLI (pattern minimal)](04-patterns/wrapper-bash-go-cli.md)** — 7 lignes : build local si binaire absent, exec propre, aucun PATH système requis. + diff --git a/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md b/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md index 6ec2ef0f..d8b07e9f 100644 --- a/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md +++ b/docs/backlog/2026-06-01-FEAT-dogfooding-self-optimization/CARD.md @@ -97,18 +97,32 @@ impactés), 7 pointeurs préservés. Coupes : - Effort + Dynamic Workflows : prose verbeuse → essentiel + pointeurs existants - Multi-LLM : table d'alias modèles → pointeur `multi-provider-protocol.md` -### Passe 2 — coupes plus agressives (⏸️ arbitrage requis) - -Demandent une décision humaine car elles touchent l'utilisabilité du fichier -cœur, pas juste de la dedup : - -- **Agent System** (2 273 c, plus grosse section) : réduire la table de 28 - agents aux ~12 pivots, le reste via `registry.json`. Gain ~800 c mais perd le - quick-ref de routing. -- **Knowledge Vault** (1 615 c, auto-généré) : l'externaliser hors du chemin - toujours-chargé suppose de modifier la logique `lovecraft memory distribute` - (écrire dans un fichier dédié + pointeur). Perd la remontée des lessons - critiques au démarrage de session. +### Passe 2 — Knowledge Vault externalisé (✅ 2026-06-01, arbitré) + +Décision utilisateur : externaliser le Knowledge Vault. Fait. + +| | chars | ~tokens | +|---|---|---| +| Après passe 1 | 14 944 | 3 736 | +| Après passe 2 | **13 595** | **3 398** | +| **Total vs baseline** | **−2 425 (−15%)** | **−607** | + +Le bloc `...` vit désormais dans +`docs/_memory/VAULT-DIGEST.md` ; `CLAUDE.md` garde un pointeur +`@docs/_memory/VAULT-DIGEST.md`. La logique `lovecraft memory distribute` a été +retargetée (6 fichiers sources : `vault-memory.md`, `memory-protocol.md`, +`auto-dream-protocol.md`, `34-gandalf.md` Phase 5, `47-lovecraft.md`, + +régénération des compilés). Tests : 685/689, **0 régression nouvelle** (les 4 +échecs georges/managed-agents sont préexistants, confirmés sur arbre propre). + +**Tradeoff assumé** : les lessons critiques ne remontent plus automatiquement à +chaque session brute — elles surfacent via godspeed (00) phase 1.5 / bruce, ou +lecture du pointeur. Acceptable car la plupart des sessions n'ont pas besoin du +vault, et le coût (~400 tok) était payé partout. + +**Reste (non bloquant)** : ~9 articles `docs/presentation/blog/` décrivent encore +le vault « dans CLAUDE.md » (narratif, pas fonctionnel) — à rafraîchir en +follow-up. **Agent System** (2 273 c) non touché : arbitré « ne pas réduire ». ### Passe 3 — CI auto-dogfooding (⏸️ dépend de #7) diff --git a/framework/agents/_shared/auto-dream-protocol.md b/framework/agents/_shared/auto-dream-protocol.md index c130a5c4..f5246a12 100644 --- a/framework/agents/_shared/auto-dream-protocol.md +++ b/framework/agents/_shared/auto-dream-protocol.md @@ -36,7 +36,7 @@ Session active lovecraft memory capture ← écriture (étape 1) │ ▼ - lovecraft memory distribute ← projection vers CLAUDE.md (étape 2) + lovecraft memory distribute ← projection vers docs/_memory/VAULT-DIGEST.md (étape 2) │ ▼ Session suivante @@ -88,7 +88,7 @@ Pendant un cycle dream, l'agent ne peut écrire **que dans** : - `~/.claude/skills/_pending/*/SKILL.md` — mode review opt-in (Phase D3.5) - `.ulk-reports/auto-dream-skills-.json` — rapport promotions skills (Phase D3.5) -**Interdit** : code source, configuration, tests, `CLAUDE.md` (sauf bloc ``), specs, fichiers projet hors `docs/_memory/`. +**Interdit** : code source, configuration, tests, `CLAUDE.md`, specs, fichiers projet hors `docs/_memory/`. Le bloc `` vit désormais dans `docs/_memory/VAULT-DIGEST.md` (donc déjà dans la sandbox autorisée). L'enforcement est triple : 1. **Frontmatter `permissions: scoped-write` + `permissions_scope:`** sur l'invocation lovecraft mode=dream @@ -125,13 +125,13 @@ Pour chaque fichier : parser frontmatter (`title`, `category`, `date`, `tags`, ` |------|-----------|--------| | **Doublon** | similarité titre normalisé ≥ 0.85 dans la même catégorie | merge (ajoute contenu en bas, garde le plus ancien comme canonique, archive l'autre) | | **Contradiction** | deux entrées même catégorie/sujet avec verdict opposé (`use X` vs `avoid X`) | flag dans rapport, pas de merge auto, status `contradicts: ` ajouté aux deux | -| **Obsolète** | `date > 90 j` ET `severity != critical` ET pas référencée par CLAUDE.md depuis 30 j | `status: archived` + déplace vers `docs/_memory/archive/` | +| **Obsolète** | `date > 90 j` ET `severity != critical` ET pas référencée par VAULT-DIGEST.md depuis 30 j | `status: archived` + déplace vers `docs/_memory/archive/` | | **Horodatage relatif** | regex `\b(hier|il y a \d+ (jour|semaine|mois)|recently|last week)\b` | remplace par date absolue calculée depuis `frontmatter.date` | | **Wikilink mort** | `[[...]]` pointant vers fichier inexistant | flag dans rapport (pas de fix auto) | ### Phase D3 — Promotion -Si un `pattern` a été référencé ≥ 3 fois dans `CLAUDE.md` distribute sur une fenêtre de 60 jours → promotion en `rule` avec `enforcement: advisory`. +Si un `pattern` a été référencé ≥ 3 fois dans `VAULT-DIGEST.md` distribute sur une fenêtre de 60 jours → promotion en `rule` avec `enforcement: advisory`. ### Phase D3.5 — Auto-skill generation (opt-in) diff --git a/framework/agents/_shared/memory-protocol.md b/framework/agents/_shared/memory-protocol.md index 991cf88f..917db076 100644 --- a/framework/agents/_shared/memory-protocol.md +++ b/framework/agents/_shared/memory-protocol.md @@ -1,7 +1,7 @@ # Memory Protocol — Knowledge Vault Loop > Source de vérité pour la **mémoire automatique** ulk : capture des learnings de session, -> stockage en vault Obsidian, distribution dans CLAUDE.md. +> stockage en vault Obsidian, distribution dans docs/_memory/VAULT-DIGEST.md (pointé depuis CLAUDE.md). > Lu par : `47-lovecraft`, `08-2b3`, `00-godspeed`, `34-gandalf`, `39-obsidian-vault`, `01-shuri`. --- @@ -25,8 +25,8 @@ Session active lovecraft memory distribute │ délègue à ▼ - shuri (01) mode=sync ──► CLAUDE.md (bloc ... ) - │ + shuri (01) mode=sync ──► docs/_memory/VAULT-DIGEST.md (bloc ... ) + │ (pointé depuis CLAUDE.md, chargé à la demande) ▼ Session suivante │ @@ -34,7 +34,7 @@ Session active godspeed scan ──► lovecraft memory surface ──► résumé pertinent dans le diagnostic ``` -**Principe** : MEMORY.md est un **staging file** transient. Le vault Obsidian est la **source de vérité persistante**. CLAUDE.md est la **surface de distribution** vers les nouvelles sessions. +**Principe** : MEMORY.md est un **staging file** transient. Le vault Obsidian est la **source de vérité persistante**. `docs/_memory/VAULT-DIGEST.md` (pointé depuis CLAUDE.md) est la **surface de distribution** vers les nouvelles sessions. > **Cycle de consolidation REM-style** : voir `_shared/auto-dream-protocol.md`. **Capture écrit, dream nettoie.** > Auto Dream est l'étape 4 de la boucle : elle merge les doublons, normalise les horodatages relatifs, archive les obsolètes et reconstruit `00-MOC.md`. Déclenchement automatique (hook) quand 24h écoulées + 5 sessions, ou manuel via `lovecraft memory dream` ou « consolidate my memory files ». @@ -211,30 +211,33 @@ casse silencieusement. --- -## 3. Distribution dans `CLAUDE.md` +## 3. Distribution dans `docs/_memory/VAULT-DIGEST.md` -Lovecraft `memory distribute` injecte un bloc dans `CLAUDE.md` projet, **toujours au même endroit**, délimité par des marqueurs HTML. +Lovecraft `memory distribute` injecte un bloc dans `docs/_memory/VAULT-DIGEST.md`, +**toujours au même endroit**, délimité par des marqueurs HTML. Depuis 2026-06-01 +le digest est **externalisé** de `CLAUDE.md` (qui ne garde qu'un pointeur +`@docs/_memory/VAULT-DIGEST.md`) pour ne pas charger le vault à chaque session. ### Marqueurs ```markdown -## Knowledge Vault (auto-généré par lovecraft) +# Knowledge Vault — Digest (auto-généré par lovecraft) > Synthèse des entrées pertinentes du `docs/_memory/`. Dernière MAJ : 2026-04-08. > Ne pas éditer manuellement — régénéré à chaque `lovecraft memory distribute`. ### Lessons critiques (severity: critical) -- **[Leptos Router
Breaks Height Chain](docs/_memory/03-lessons/architecture/leptos-router-main-height-chain.md)** — Le router Leptos enveloppe automatiquement les routes dans un `
` sans `height: 100%`. Fix : `main { height: 100% }` global. +- **[Leptos Router
Breaks Height Chain](03-lessons/architecture/leptos-router-main-height-chain.md)** — Le router Leptos enveloppe automatiquement les routes dans un `
` sans `height: 100%`. Fix : `main { height: 100% }` global. ### Mistakes à éviter (corrected) -- **[Rebase sur branche partagée](docs/_memory/07-mistakes/rebase-shared-branch.md)** — Ne jamais rebaser une branche déjà pushée. +- **[Rebase sur branche partagée](07-mistakes/rebase-shared-branch.md)** — Ne jamais rebaser une branche déjà pushée. ### Patterns recommandés -- **[Two-step URL param typing](docs/_memory/04-patterns/two-step-url-param-typing.md)** — Extract en string, valider en Zod. +- **[Two-step URL param typing](04-patterns/two-step-url-param-typing.md)** — Extract en string, valider en Zod. ### Rules actives -- **[Always test at three layers](docs/_memory/01-rules/test-three-layers.md)** — Unit + integration + e2e. +- **[Always test at three layers](01-rules/test-three-layers.md)** — Unit + integration + e2e. ``` @@ -256,8 +259,8 @@ Lovecraft `memory distribute` injecte un bloc dans `CLAUDE.md` projet, **toujour ### Idempotence -- Si le bloc `...` existe déjà → remplacer son contenu -- S'il n'existe pas → ajouter à la fin de `CLAUDE.md` (avant le dernier `---` éventuel) +- Si le bloc `...` existe déjà dans `docs/_memory/VAULT-DIGEST.md` → remplacer son contenu +- Si le fichier n'existe pas → le créer avec le bloc complet (+ vérifier le pointeur dans `CLAUDE.md`) - Hash de contenu : si le nouveau bloc est identique à l'ancien → ne pas réécrire (évite git noise) --- @@ -270,7 +273,7 @@ Mode `memory` avec sous-commandes : - `lovecraft memory capture` → lit MEMORY.md, délègue à `obsidian-vault (39)`, archive MEMORY.md - `lovecraft memory distribute` → lit `docs/_memory/`, filtre, délègue à `shuri (01) mode=sync` - `lovecraft memory surface` → lit `docs/_memory/`, retourne un résumé court (10-20 entrées) pour Godspeed/Bruce -- `lovecraft memory dream [--force] [--dry-run]` → **(AUTO-DREAM)** consolidation REM-style : merge doublons (similarité ≥ 0.85), normalise horodatages relatifs en dates absolues, archive obsolètes (`> 90j` + non-référencées), promeut patterns récurrents en règles, reconstruit `00-MOC.md`. Conditions auto : 24h + 5 sessions (`.claude/state/auto-dream.json`). Sandbox d'écriture stricte : `docs/_memory/**` + bloc CLAUDE.md vault uniquement. Lock file pour concurrence multi-instances. Voir `_shared/auto-dream-protocol.md`. +- `lovecraft memory dream [--force] [--dry-run]` → **(AUTO-DREAM)** consolidation REM-style : merge doublons (similarité ≥ 0.85), normalise horodatages relatifs en dates absolues, archive obsolètes (`> 90j` + non-référencées), promeut patterns récurrents en règles, reconstruit `00-MOC.md`. Conditions auto : 24h + 5 sessions (`.claude/state/auto-dream.json`). Sandbox d'écriture stricte : `docs/_memory/**` (inclut le bloc `VAULT-DIGEST.md`) uniquement. Lock file pour concurrence multi-instances. Voir `_shared/auto-dream-protocol.md`. - `lovecraft memory curate [--dry-run] [--threshold-days N]` → scan vault, scoring pertinence, déduplication (similarité ≥ 0.85), archivage entrées obsolètes (score ≤ 0 + date > N jours, défaut 90) vers `docs/_memory/archive/` ; `--dry-run` par défaut (simulation sans écriture) - `lovecraft memory audit [--since YYYY-MM-DD] [--verbose]` → liste les archives `.claude/memory-archive/MEMORY-*.md` avec méta-data (date, nb entrées `###`, catégories `##`) ; tableau Markdown + résumé statistique ; `--since` filtre par date ; `--verbose` ajoute les titres des entrées - `lovecraft memory redact [--dry-run] [--reason "..."]` → purge le contenu d'une archive (`archive:YYYY-MM-DD`) ou d'une entrée vault (`vault:`) pour PII/secret leak ; backup dans `.claude/memory-archive/redacted/` avant modification ; log dans `.ulk-reports/redact-log.jsonl` ; `--dry-run` par défaut (sécurité) @@ -295,7 +298,7 @@ Nouvelle Phase 1.5 (après scan) : Nouvelle Phase 5 (vault health) : - Si `MEMORY.md` existe et > 100 lignes → alerte "MEMORY.md déborde, lance `lovecraft memory capture`" - Si `docs/_memory/` existe et dernière modif > 30 jours → alerte "vault potentiellement obsolète" -- Si bloc CLAUDE.md `` absent alors que vault existe → alerte "distribute jamais lancé" +- Si `docs/_memory/VAULT-DIGEST.md` absent (ou pointeur manquant dans CLAUDE.md) alors que vault existe → alerte "distribute jamais lancé" - Si `.claude/state/auto-dream.json#last_run_at` > 7 jours alors que conditions remplies → alerte "Auto Dream désactivé ou cassé, lance `~/.claude/hooks/auto-dream.sh status`" --- @@ -389,7 +392,7 @@ obsidian-vault (39) ── crée ──> docs/_memory//.md (frontmatter complet, wikilinks) │ ▼ -shuri (01) mode=sync ── injecte ──> CLAUDE.md (bloc vault:begin/end) +shuri (01) mode=sync ── injecte ──> docs/_memory/VAULT-DIGEST.md (bloc vault:begin/end) │ ▼ godspeed (00) ── lit ──> rapport diagnostic enrichi diff --git a/framework/agents/_shared/vault-memory.md b/framework/agents/_shared/vault-memory.md index 47e6c420..60c50ac8 100644 --- a/framework/agents/_shared/vault-memory.md +++ b/framework/agents/_shared/vault-memory.md @@ -15,8 +15,8 @@ MEMORY.md (staging) docs/_memory/ (vault Obsidian persistant) │ distribute ▼ -CLAUDE.md (bloc ... ) - │ surface (lecture) +docs/_memory/VAULT-DIGEST.md (bloc ... ) + │ surface (lecture — pointé depuis CLAUDE.md, chargé à la demande) ▼ Godspeed / Bruce / nouvelle session ``` @@ -26,7 +26,7 @@ Godspeed / Bruce / nouvelle session | Sous-commande | Action | Délègue à | |---|---|---| | `lovecraft memory capture` | MEMORY.md → docs/_memory/ | obsidian-vault (39) | -| `lovecraft memory distribute` | docs/_memory/ → CLAUDE.md | shuri (01) mode=sync | +| `lovecraft memory distribute` | docs/_memory/ → docs/_memory/VAULT-DIGEST.md | shuri (01) mode=sync | | `lovecraft memory surface` | Résumé du vault (lecture seule) | (interne) | | `lovecraft memory` | Pipeline complet : capture → distribute → surface | les deux ci-dessus | @@ -189,48 +189,52 @@ Pour chaque `*.md` dans `docs/_memory/**` (sauf MOC), inclure si : - OR (`frontmatter.category == "rule"` AND `frontmatter.enforcement == "strict"`) - OR `intersection(frontmatter.tags, [project_stack, ...]) != empty` -Trier par `severity desc` → `date desc`. Limiter à **20 entrées max** (anti-bloat CLAUDE.md). +Trier par `severity desc` → `date desc`. Limiter à **20 entrées max** (anti-bloat VAULT-DIGEST.md). -### Distribute-4 — Construire le bloc CLAUDE.md +### Distribute-4 — Construire le bloc VAULT-DIGEST.md ```markdown -## Knowledge Vault (auto-généré par lovecraft) +# Knowledge Vault — Digest (auto-généré par lovecraft) > Synthèse des entrées pertinentes de `docs/_memory/`. Dernière MAJ : YYYY-MM-DD. > Ne pas éditer manuellement — régénéré à chaque `lovecraft memory distribute`. ### 🔴 Lessons critiques (severity: critical) -- **[Titre](docs/_memory/03-lessons/slug.md)** — Résumé en 1 phrase (max 120 chars). +- **[Titre](03-lessons/slug.md)** — Résumé en 1 phrase (max 120 chars). ### ⚠️ Mistakes à éviter -- **[Titre](docs/_memory/07-mistakes/slug.md)** — Résumé en 1 phrase. +- **[Titre](07-mistakes/slug.md)** — Résumé en 1 phrase. ### 🧩 Patterns recommandés -- **[Titre](docs/_memory/04-patterns/slug.md)** — Résumé en 1 phrase. +- **[Titre](04-patterns/slug.md)** — Résumé en 1 phrase. ### 📏 Rules actives -- **[Titre](docs/_memory/01-rules/slug.md)** — Résumé en 1 phrase. +- **[Titre](01-rules/slug.md)** — Résumé en 1 phrase. ### 💡 Insights récents -- **[Titre](docs/_memory/08-insights/slug.md)** — Résumé en 1 phrase. +- **[Titre](08-insights/slug.md)** — Résumé en 1 phrase. ``` **Résumé en 1 phrase** : première phrase du contenu jusqu'au premier point, max 120 caractères. -### Distribute-5 — Injection idempotente dans CLAUDE.md +### Distribute-5 — Injection idempotente dans VAULT-DIGEST.md -Si CLAUDE.md absent → afficher `⚠️ Pas de CLAUDE.md. Lance shuri (01) mode=sync d'abord.` et stop. +Cible depuis 2026-06-01 : `docs/_memory/VAULT-DIGEST.md` (externalisé de CLAUDE.md +pour alléger le contexte toujours-chargé ; CLAUDE.md garde un pointeur +`@docs/_memory/VAULT-DIGEST.md`). -Si présent → déléguer à `shuri (01) mode=sync` : +Déléguer à `shuri (01) mode=sync` : ``` -Action : injecter ou remplacer le bloc ... dans CLAUDE.md. +Action : injecter ou remplacer le bloc ... + dans docs/_memory/VAULT-DIGEST.md. Règles : - 1. Bloc existant → remplacer son contenu - 2. Absent → ajouter à la fin de CLAUDE.md + 1. Fichier/bloc existant → remplacer son contenu + 2. Fichier absent → le créer avec le bloc complet 3. Hash identique → NE PAS réécrire - 4. Préserver tout le reste de CLAUDE.md à l'identique + 4. Vérifier que CLAUDE.md contient bien le pointeur @docs/_memory/VAULT-DIGEST.md + (l'ajouter dans la section « Knowledge Vault » sinon) ``` ### Distribute-6 — Rapport distribute @@ -238,10 +242,10 @@ Règles : ``` ✅ Memory distribute terminée -📤 docs/_memory/ → CLAUDE.md +📤 docs/_memory/ → docs/_memory/VAULT-DIGEST.md Entrées dans le vault : [N total] Retenues : [N] (Critical [N] · Project [N] · Stack [N]) - CLAUDE.md : [bloc remplacé | ajouté | identique, skip] + VAULT-DIGEST.md : [bloc remplacé | créé | identique, skip] · pointeur CLAUDE.md : [ok] ``` --- diff --git a/framework/agents/orchestrators/47-lovecraft.md b/framework/agents/orchestrators/47-lovecraft.md index 1b232f5e..117c69d4 100644 --- a/framework/agents/orchestrators/47-lovecraft.md +++ b/framework/agents/orchestrators/47-lovecraft.md @@ -1,7 +1,7 @@ --- name: lovecraft type: custom-command -description: Orchestrate Obsidian memory vault — capture (MEMORY.md → docs/_memory/), distribute (→ CLAUDE.md), curate, dream (REM consolidation). Use for 'memory' / 'lovecraft' / 'capture my memory' / 'organize docs'. +description: Orchestrate Obsidian memory vault — capture (MEMORY.md → docs/_memory/), distribute (→ docs/_memory/VAULT-DIGEST.md), curate, dream (REM consolidation). Use for 'memory' / 'lovecraft' / 'capture my memory' / 'organize docs'. tools: Read, Glob, Grep, Bash, Write, MultiEdit, Task, AskUserQuestionTool model: opus effort: xhigh @@ -86,7 +86,7 @@ Tu es l'orchestrateur central de la documentation. Ton rôle : analyser, reconst | **init** | Nouveau projet : génère tout depuis zéro + setup vault | "Nouveau projet doc", "Créer vault" | | **harmonize** | Détecte l'état (EMPTY/PARTIAL/DRIFTED/HEALTHY), construit plan de migration, demande confirmation, applique avec backup | "harmonize", "ranger doc", "migrer doc" | | **requirements** | Liste tous les outils nécessaires (plugins, MCPs, skills, CLIs) | "Requirements Obsidian", "Liste plugins" | -| **memory** | Boucle mémoire : `capture` (MEMORY.md → vault), `distribute` (vault → CLAUDE.md), `surface` (résumé), **`dream`** (consolidation REM-style : merge doublons, normalise horodatages, archive obsolètes, reconstruit MOC), `curate` (nettoyage vault : scoring, dédup, archivage), `audit` (historique captures archives), `redact` (purge PII/secret dans archive ou vault entry), `sync` (push docs/_memory/ → memory_store workspace), `pull` (tire memory_store → docs/_memory/ local) | "lovecraft memory [capture\|distribute\|surface\|dream\|curate\|audit\|redact\|sync\|pull]" \| "consolidate my memory files" | +| **memory** | Boucle mémoire : `capture` (MEMORY.md → vault), `distribute` (vault → docs/_memory/VAULT-DIGEST.md), `surface` (résumé), **`dream`** (consolidation REM-style : merge doublons, normalise horodatages, archive obsolètes, reconstruit MOC), `curate` (nettoyage vault : scoring, dédup, archivage), `audit` (historique captures archives), `redact` (purge PII/secret dans archive ou vault entry), `sync` (push docs/_memory/ → memory_store workspace), `pull` (tire memory_store → docs/_memory/ local) | "lovecraft memory [capture\|distribute\|surface\|dream\|curate\|audit\|redact\|sync\|pull]" \| "consolidate my memory files" | > **Mode harmonize — workflow complet 8 phases** : `agents/_shared/vault-harmonize.md` > **Mode memory — capture/distribute/surface/curate** : `agents/_shared/vault-memory.md` @@ -285,7 +285,7 @@ lovecraft (47) — Orchestrateur central | `lovecraft harmonize --state` | Affiche juste l'état détecté + score | | `lovecraft memory` | Boucle mémoire complète — voir `_shared/vault-memory.md` | | `lovecraft memory capture` | MEMORY.md → docs/_memory/ | -| `lovecraft memory distribute` | docs/_memory/ → CLAUDE.md | +| `lovecraft memory distribute` | docs/_memory/ → docs/_memory/VAULT-DIGEST.md (pointé depuis CLAUDE.md) | | `lovecraft memory surface` | Résumé vault (lecture seule) | | `lovecraft memory dream [--force] [--dry-run]` | **Consolidation REM-style** — merge doublons, normalise horodatages relatifs, archive obsolètes, promeut patterns récurrents en règles, reconstruit `00-MOC.md`. Voir `_shared/auto-dream-protocol.md` | | `lovecraft memory curate [--dry-run] [--threshold-days N]` | Nettoyage vault : scoring pertinence, déduplication, archivage entrées obsolètes | @@ -295,7 +295,7 @@ lovecraft (47) — Orchestrateur central | `lovecraft memory pull [--dry-run] [--resolve-conflicts overwrite\|skip\|prompt] [--threshold N]` | Tire memory_store workspace → `docs/_memory/` local (MEM-MA-002) | | `obsidian doc requirements` | Afficher/générer REQUIREMENTS.md | -> **Alternative externe (Camille Roux 2026 v3)** : `claude-subconscious` (letta-ai, expérimental, `--with-claude-subconscious`) propose une mémoire persistante "subconsciente" inter-sessions côté plugin Claude Code. **Complémentaire**, pas un remplacement : la memory loop ulk (`MEMORY.md` → `docs/_memory/` → `CLAUDE.md` vault block) reste la source de vérité projet-scoped et auditable. Mentionner `claude-subconscious` si l'utilisateur cherche un store mémoire externe au repo. +> **Alternative externe (Camille Roux 2026 v3)** : `claude-subconscious` (letta-ai, expérimental, `--with-claude-subconscious`) propose une mémoire persistante "subconsciente" inter-sessions côté plugin Claude Code. **Complémentaire**, pas un remplacement : la memory loop ulk (`MEMORY.md` → `docs/_memory/` → `docs/_memory/VAULT-DIGEST.md`, pointé depuis `CLAUDE.md`) reste la source de vérité projet-scoped et auditable. Mentionner `claude-subconscious` si l'utilisateur cherche un store mémoire externe au repo. --- @@ -348,7 +348,7 @@ Pour chaque fichier : parser frontmatter (`title`, `category`, `date`, `tags`, ` ### Phase D4 — Promotion -Pattern référencé ≥ 3 fois dans `CLAUDE.md` distribute sur fenêtre 60 jours → promu en `rule` avec `enforcement: advisory` (déplacé de `04-patterns/` vers `01-rules/`). +Pattern référencé ≥ 3 fois dans `VAULT-DIGEST.md` distribute sur fenêtre 60 jours → promu en `rule` avec `enforcement: advisory` (déplacé de `04-patterns/` vers `01-rules/`). ### Phase D4.5 — Auto-skill generation (opt-in) diff --git a/framework/agents/session/34-gandalf.md b/framework/agents/session/34-gandalf.md index 488ffe4e..f109eed3 100644 --- a/framework/agents/session/34-gandalf.md +++ b/framework/agents/session/34-gandalf.md @@ -555,7 +555,7 @@ Avant de /clear ou fermer : ## Phase 5 : Vault Health Check (Knowledge Vault Loop) -> Vérifie la santé de la boucle de mémoire automatique : `MEMORY.md`, `docs/_memory/`, bloc CLAUDE.md. +> Vérifie la santé de la boucle de mémoire automatique : `MEMORY.md`, `docs/_memory/`, bloc `docs/_memory/VAULT-DIGEST.md` (externalisé de CLAUDE.md depuis 2026-06-01). > Phase **non bloquante** — silencieuse si pas de vault et pas de MEMORY.md. > Référence : `_shared/memory-protocol.md` @@ -571,8 +571,9 @@ test -d docs/_memory && find docs/_memory -name "*.md" -not -name "00-MOC.md" 2> # Dernière modif du vault test -d docs/_memory && find docs/_memory -name "*.md" -printf '%T@\n' 2>/dev/null | sort -n | tail -1 -# Bloc vault dans CLAUDE.md -test -f CLAUDE.md && grep -c "" CLAUDE.md || echo "0" +# Bloc vault dans docs/_memory/VAULT-DIGEST.md (externalisé) + pointeur dans CLAUDE.md +test -f docs/_memory/VAULT-DIGEST.md && grep -c "" docs/_memory/VAULT-DIGEST.md || echo "0" +test -f CLAUDE.md && grep -c "VAULT-DIGEST.md" CLAUDE.md || echo "0" # pointeur présent ? ``` ### 5.2 — Évaluer les alertes @@ -582,8 +583,8 @@ test -f CLAUDE.md && grep -c "" CLAUDE.md || echo "0" | `MEMORY.md > 100 lignes` | ⚠️ Warning | "MEMORY.md déborde — capture pendante. Lance `lovecraft memory capture`." | | `MEMORY.md > 200 lignes` | 🔴 Alert | "MEMORY.md critique — risque de perte. Capture immédiate requise." | | `vault existe ET dernier mtime > 30 jours` | ⚠️ Warning | "Vault potentiellement obsolète — aucune capture depuis 30+ jours." | -| `vault existe ET pas de bloc CLAUDE.md` | ⚠️ Warning | "Vault présent mais distribute jamais lancé — CLAUDE.md ne profite pas du vault." | -| `vault existe ET dernier bloc > 14 jours` | 📝 Info | "Bloc CLAUDE.md vault un peu vieux. Lance `lovecraft memory distribute`." | +| `vault existe ET pas de VAULT-DIGEST.md (ou pointeur CLAUDE.md manquant)` | ⚠️ Warning | "Vault présent mais distribute jamais lancé — le digest n'existe pas." | +| `vault existe ET dernier bloc > 14 jours` | 📝 Info | "Digest `VAULT-DIGEST.md` un peu vieux. Lance `lovecraft memory distribute`." | | `vault absent ET MEMORY.md > 50 lignes` | ⚠️ Warning | "Learnings accumulés sans vault. Lance `lovecraft memory` pour initialiser." | | Tout OK | ✅ | "Vault sain." | @@ -596,7 +597,7 @@ Inclure dans le rapport gandalf : MEMORY.md : [N lignes / absent] Vault : [N entrées / absent] - CLAUDE.md : [bloc présent (date) / bloc absent / N/A (pas de CLAUDE.md)] + VAULT-DIGEST : [bloc présent (date) / absent] · pointeur CLAUDE.md : [ok / manquant] Dernière capture : [date relative / jamais] Status : [✅ sain | ⚠️ attention | 🔴 action requise] diff --git a/framework/commands/agents/gandalf.md b/framework/commands/agents/gandalf.md index c7f9b148..a47c1b15 100644 --- a/framework/commands/agents/gandalf.md +++ b/framework/commands/agents/gandalf.md @@ -554,7 +554,7 @@ Avant de /clear ou fermer : ## Phase 5 : Vault Health Check (Knowledge Vault Loop) -> Vérifie la santé de la boucle de mémoire automatique : `MEMORY.md`, `docs/_memory/`, bloc CLAUDE.md. +> Vérifie la santé de la boucle de mémoire automatique : `MEMORY.md`, `docs/_memory/`, bloc `docs/_memory/VAULT-DIGEST.md` (externalisé de CLAUDE.md depuis 2026-06-01). > Phase **non bloquante** — silencieuse si pas de vault et pas de MEMORY.md. > Référence : `_shared/memory-protocol.md` @@ -570,8 +570,9 @@ test -d docs/_memory && find docs/_memory -name "*.md" -not -name "00-MOC.md" 2> # Dernière modif du vault test -d docs/_memory && find docs/_memory -name "*.md" -printf '%T@\n' 2>/dev/null | sort -n | tail -1 -# Bloc vault dans CLAUDE.md -test -f CLAUDE.md && grep -c "" CLAUDE.md || echo "0" +# Bloc vault dans docs/_memory/VAULT-DIGEST.md (externalisé) + pointeur dans CLAUDE.md +test -f docs/_memory/VAULT-DIGEST.md && grep -c "" docs/_memory/VAULT-DIGEST.md || echo "0" +test -f CLAUDE.md && grep -c "VAULT-DIGEST.md" CLAUDE.md || echo "0" # pointeur présent ? ``` ### 5.2 — Évaluer les alertes @@ -581,8 +582,8 @@ test -f CLAUDE.md && grep -c "" CLAUDE.md || echo "0" | `MEMORY.md > 100 lignes` | ⚠️ Warning | "MEMORY.md déborde — capture pendante. Lance `lovecraft memory capture`." | | `MEMORY.md > 200 lignes` | 🔴 Alert | "MEMORY.md critique — risque de perte. Capture immédiate requise." | | `vault existe ET dernier mtime > 30 jours` | ⚠️ Warning | "Vault potentiellement obsolète — aucune capture depuis 30+ jours." | -| `vault existe ET pas de bloc CLAUDE.md` | ⚠️ Warning | "Vault présent mais distribute jamais lancé — CLAUDE.md ne profite pas du vault." | -| `vault existe ET dernier bloc > 14 jours` | 📝 Info | "Bloc CLAUDE.md vault un peu vieux. Lance `lovecraft memory distribute`." | +| `vault existe ET pas de VAULT-DIGEST.md (ou pointeur CLAUDE.md manquant)` | ⚠️ Warning | "Vault présent mais distribute jamais lancé — le digest n'existe pas." | +| `vault existe ET dernier bloc > 14 jours` | 📝 Info | "Digest `VAULT-DIGEST.md` un peu vieux. Lance `lovecraft memory distribute`." | | `vault absent ET MEMORY.md > 50 lignes` | ⚠️ Warning | "Learnings accumulés sans vault. Lance `lovecraft memory` pour initialiser." | | Tout OK | ✅ | "Vault sain." | @@ -595,7 +596,7 @@ Inclure dans le rapport gandalf : MEMORY.md : [N lignes / absent] Vault : [N entrées / absent] - CLAUDE.md : [bloc présent (date) / bloc absent / N/A (pas de CLAUDE.md)] + VAULT-DIGEST : [bloc présent (date) / absent] · pointeur CLAUDE.md : [ok / manquant] Dernière capture : [date relative / jamais] Status : [✅ sain | ⚠️ attention | 🔴 action requise] diff --git a/framework/commands/agents/lovecraft.md b/framework/commands/agents/lovecraft.md index e1d2524d..45e92653 100644 --- a/framework/commands/agents/lovecraft.md +++ b/framework/commands/agents/lovecraft.md @@ -1,7 +1,7 @@ --- name: lovecraft type: custom-command -description: Orchestrate Obsidian memory vault — capture (MEMORY.md → docs/_memory/), distribute (→ CLAUDE.md), curate, dream (REM consolidation). Use for 'memory' / 'lovecraft' / 'capture my memory' / 'organize docs'. +description: Orchestrate Obsidian memory vault — capture (MEMORY.md → docs/_memory/), distribute (→ docs/_memory/VAULT-DIGEST.md), curate, dream (REM consolidation). Use for 'memory' / 'lovecraft' / 'capture my memory' / 'organize docs'. tools: Read, Glob, Grep, Bash, Write, MultiEdit, Task, AskUserQuestionTool model: opus effort: xhigh @@ -85,7 +85,7 @@ Tu es l'orchestrateur central de la documentation. Ton rôle : analyser, reconst | **init** | Nouveau projet : génère tout depuis zéro + setup vault | "Nouveau projet doc", "Créer vault" | | **harmonize** | Détecte l'état (EMPTY/PARTIAL/DRIFTED/HEALTHY), construit plan de migration, demande confirmation, applique avec backup | "harmonize", "ranger doc", "migrer doc" | | **requirements** | Liste tous les outils nécessaires (plugins, MCPs, skills, CLIs) | "Requirements Obsidian", "Liste plugins" | -| **memory** | Boucle mémoire : `capture` (MEMORY.md → vault), `distribute` (vault → CLAUDE.md), `surface` (résumé), **`dream`** (consolidation REM-style : merge doublons, normalise horodatages, archive obsolètes, reconstruit MOC), `curate` (nettoyage vault : scoring, dédup, archivage), `audit` (historique captures archives), `redact` (purge PII/secret dans archive ou vault entry), `sync` (push docs/_memory/ → memory_store workspace), `pull` (tire memory_store → docs/_memory/ local) | "lovecraft memory [capture\|distribute\|surface\|dream\|curate\|audit\|redact\|sync\|pull]" \| "consolidate my memory files" | +| **memory** | Boucle mémoire : `capture` (MEMORY.md → vault), `distribute` (vault → docs/_memory/VAULT-DIGEST.md), `surface` (résumé), **`dream`** (consolidation REM-style : merge doublons, normalise horodatages, archive obsolètes, reconstruit MOC), `curate` (nettoyage vault : scoring, dédup, archivage), `audit` (historique captures archives), `redact` (purge PII/secret dans archive ou vault entry), `sync` (push docs/_memory/ → memory_store workspace), `pull` (tire memory_store → docs/_memory/ local) | "lovecraft memory [capture\|distribute\|surface\|dream\|curate\|audit\|redact\|sync\|pull]" \| "consolidate my memory files" | > **Mode harmonize — workflow complet 8 phases** : `agents/_shared/vault-harmonize.md` > **Mode memory — capture/distribute/surface/curate** : `agents/_shared/vault-memory.md` @@ -284,7 +284,7 @@ lovecraft (47) — Orchestrateur central | `lovecraft harmonize --state` | Affiche juste l'état détecté + score | | `lovecraft memory` | Boucle mémoire complète — voir `_shared/vault-memory.md` | | `lovecraft memory capture` | MEMORY.md → docs/_memory/ | -| `lovecraft memory distribute` | docs/_memory/ → CLAUDE.md | +| `lovecraft memory distribute` | docs/_memory/ → docs/_memory/VAULT-DIGEST.md (pointé depuis CLAUDE.md) | | `lovecraft memory surface` | Résumé vault (lecture seule) | | `lovecraft memory dream [--force] [--dry-run]` | **Consolidation REM-style** — merge doublons, normalise horodatages relatifs, archive obsolètes, promeut patterns récurrents en règles, reconstruit `00-MOC.md`. Voir `_shared/auto-dream-protocol.md` | | `lovecraft memory curate [--dry-run] [--threshold-days N]` | Nettoyage vault : scoring pertinence, déduplication, archivage entrées obsolètes | @@ -294,7 +294,7 @@ lovecraft (47) — Orchestrateur central | `lovecraft memory pull [--dry-run] [--resolve-conflicts overwrite\|skip\|prompt] [--threshold N]` | Tire memory_store workspace → `docs/_memory/` local (MEM-MA-002) | | `obsidian doc requirements` | Afficher/générer REQUIREMENTS.md | -> **Alternative externe (Camille Roux 2026 v3)** : `claude-subconscious` (letta-ai, expérimental, `--with-claude-subconscious`) propose une mémoire persistante "subconsciente" inter-sessions côté plugin Claude Code. **Complémentaire**, pas un remplacement : la memory loop ulk (`MEMORY.md` → `docs/_memory/` → `CLAUDE.md` vault block) reste la source de vérité projet-scoped et auditable. Mentionner `claude-subconscious` si l'utilisateur cherche un store mémoire externe au repo. +> **Alternative externe (Camille Roux 2026 v3)** : `claude-subconscious` (letta-ai, expérimental, `--with-claude-subconscious`) propose une mémoire persistante "subconsciente" inter-sessions côté plugin Claude Code. **Complémentaire**, pas un remplacement : la memory loop ulk (`MEMORY.md` → `docs/_memory/` → `docs/_memory/VAULT-DIGEST.md`, pointé depuis `CLAUDE.md`) reste la source de vérité projet-scoped et auditable. Mentionner `claude-subconscious` si l'utilisateur cherche un store mémoire externe au repo. --- @@ -347,7 +347,7 @@ Pour chaque fichier : parser frontmatter (`title`, `category`, `date`, `tags`, ` ### Phase D4 — Promotion -Pattern référencé ≥ 3 fois dans `CLAUDE.md` distribute sur fenêtre 60 jours → promu en `rule` avec `enforcement: advisory` (déplacé de `04-patterns/` vers `01-rules/`). +Pattern référencé ≥ 3 fois dans `VAULT-DIGEST.md` distribute sur fenêtre 60 jours → promu en `rule` avec `enforcement: advisory` (déplacé de `04-patterns/` vers `01-rules/`). ### Phase D5 — Reconstruction de `00-MOC.md` From 42e1bf7dda5bf42cceef2378758d8e7872dd4dd8 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 1 Jun 2026 14:28:22 +0000 Subject: [PATCH 5/5] =?UTF-8?q?docs(blog):=20refresh=20vault=20location=20?= =?UTF-8?q?refs=20=E2=86=92=20VAULT-DIGEST.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to the Knowledge Vault externalization: blog articles described the vault as living 'in CLAUDE.md'. Update the factual references (distribute target tables + pro/cons mechanism lines, FR+EN) to docs/_memory/VAULT-DIGEST.md (pointed to from CLAUDE.md). High-level narrative mentions left as-is. https://claude.ai/code/session_01JrFhrsWDBZVZBRMN6MiXG4 --- docs/presentation/blog/04-agents-majeurs.md | 4 ++-- docs/presentation/blog/06-avantages-inconvenients.md | 2 +- docs/presentation/blog/en/04-major-agents-en.md | 4 ++-- docs/presentation/blog/en/06-pros-cons-en.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/presentation/blog/04-agents-majeurs.md b/docs/presentation/blog/04-agents-majeurs.md index 329860eb..cb03e07e 100644 --- a/docs/presentation/blog/04-agents-majeurs.md +++ b/docs/presentation/blog/04-agents-majeurs.md @@ -308,12 +308,12 @@ Coordonne : Shuri (01), Strange (16), Friday (09), obsidian-vault (39). | Commande | Action | |---|---| | `lovecraft memory capture` | `MEMORY.md` racine → `docs/_memory//` | -| `lovecraft memory distribute` | `docs/_memory/` → bloc `` dans `CLAUDE.md` | +| `lovecraft memory distribute` | `docs/_memory/` → bloc `` dans `docs/_memory/VAULT-DIGEST.md` (pointé depuis `CLAUDE.md`) | | `lovecraft memory surface` | Résumé read-only pour Godspeed/Bruce/Gandalf | Auto-intégration : 2b3 (Phase 5.7) capture, Godspeed (Phase 1.5) surface, Gandalf (Phase 5) audite la santé. -Source : `CLAUDE.md` section "Knowledge Vault Loop". +Source : `CLAUDE.md` section "Knowledge Vault" → `docs/_memory/VAULT-DIGEST.md` (digest externalisé depuis 2026-06-01 pour alléger le contexte). **Invocation** : diff --git a/docs/presentation/blog/06-avantages-inconvenients.md b/docs/presentation/blog/06-avantages-inconvenients.md index 9ad49624..758f8e9a 100644 --- a/docs/presentation/blog/06-avantages-inconvenients.md +++ b/docs/presentation/blog/06-avantages-inconvenients.md @@ -54,7 +54,7 @@ Ces audits peuvent tourner en **cloud routines** sans machine locale (agent Rout ### 6. Mémoire entre sessions -Le **Knowledge Vault Loop** (Lovecraft 47) capture les décisions vers un vault Obsidian-compatible, distribue dans `CLAUDE.md`, et surface à chaque démarrage. Auto-intégré : 2b3 capture, Godspeed surface, Gandalf audite la santé. Source : `CLAUDE.md` section "Knowledge Vault Loop". +Le **Knowledge Vault Loop** (Lovecraft 47) capture les décisions vers un vault Obsidian-compatible, distribue un digest dans `docs/_memory/VAULT-DIGEST.md` (pointé depuis `CLAUDE.md`), et surface à chaque démarrage via Godspeed/Bruce. Auto-intégré : 2b3 capture, Godspeed surface, Gandalf audite la santé. Source : `CLAUDE.md` section "Knowledge Vault". Effet : on ne re-explique pas l'archi à chaque session. diff --git a/docs/presentation/blog/en/04-major-agents-en.md b/docs/presentation/blog/en/04-major-agents-en.md index 993d258f..00746cd3 100644 --- a/docs/presentation/blog/en/04-major-agents-en.md +++ b/docs/presentation/blog/en/04-major-agents-en.md @@ -308,12 +308,12 @@ Coordinates: Shuri (01), Strange (16), Friday (09), obsidian-vault (39). | Command | Action | |---|---| | `lovecraft memory capture` | `MEMORY.md` root → `docs/_memory//` | -| `lovecraft memory distribute` | `docs/_memory/` → `` block in `CLAUDE.md` | +| `lovecraft memory distribute` | `docs/_memory/` → `` block in `docs/_memory/VAULT-DIGEST.md` (pointed to from `CLAUDE.md`) | | `lovecraft memory surface` | Read-only summary for Godspeed/Bruce/Gandalf | Auto-integration: 2b3 (Phase 5.7) captures, Godspeed (Phase 1.5) surfaces, Gandalf (Phase 5) audits health. -Source: `CLAUDE.md` section "Knowledge Vault Loop". +Source: `CLAUDE.md` "Knowledge Vault" section → `docs/_memory/VAULT-DIGEST.md` (digest externalized 2026-06-01 to keep the always-loaded context lean). **Invocation**: diff --git a/docs/presentation/blog/en/06-pros-cons-en.md b/docs/presentation/blog/en/06-pros-cons-en.md index 418e3c94..b0d1c4a9 100644 --- a/docs/presentation/blog/en/06-pros-cons-en.md +++ b/docs/presentation/blog/en/06-pros-cons-en.md @@ -55,7 +55,7 @@ These audits can run as **cloud routines** without a local machine (agent Routin ### 6. Memory between sessions -The **Knowledge Vault Loop** (Lovecraft 47) captures decisions to an Obsidian-compatible vault, distributes into `CLAUDE.md`, and surfaces at every startup. Auto-integrated: 2b3 captures, Godspeed surfaces, Gandalf audits health. Source: `CLAUDE.md` section "Knowledge Vault Loop". +The **Knowledge Vault Loop** (Lovecraft 47) captures decisions to an Obsidian-compatible vault, distributes a digest into `docs/_memory/VAULT-DIGEST.md` (pointed to from `CLAUDE.md`), and surfaces at every startup via Godspeed/Bruce. Auto-integrated: 2b3 captures, Godspeed surfaces, Gandalf audits health. Source: `CLAUDE.md` "Knowledge Vault" section. Effect: you don't re-explain the architecture at every session.