feat(kernel): sync CORTEX kernel — sessions, modes, ADRs, clean personal files

Ajout : 11 session-*.yml, modes soft locks, coach-boot + time-anchor, ADR-008→024.
Retrait : focus.md, BRAIN-INDEX.md, SUPERVISOR-STATE.md, claims/, todo/.
brain-template = kernel distribuable propre.
This commit is contained in:
2026-03-17 23:14:04 +01:00
parent e87c24b06a
commit 60d9cf7332
36 changed files with 2451 additions and 191 deletions

View File

@@ -1,64 +0,0 @@
# BRAIN-INDEX.md — Registre de claims
> Système de locking optimiste — Brain Session Index (BSI).
> **Claims** : scribe uniquement. **Signals** : orchestrator-scribe uniquement.
> Ne jamais éditer manuellement.
> Spec complète : `brain/profil/bsi-spec.md`
---
## Claims actifs
| Session | Instance | Portée | Niveau | Ouvert le | Expire le | État |
|---------|----------|--------|--------|-----------|-----------|------|
| — | — | — | — | — | — | — |
*Aucun claim actif.*
---
## Claims stale — contrôle humain requis
| Session | Instance | Portée | Expiré le | Action requise |
|---------|----------|--------|-----------|----------------|
*Aucun claim stale.*
---
## Signals — Bus inter-sessions
> Écrit par `orchestrator-scribe`. Lu par toutes les instances au démarrage.
> Un signal livré reste 24h pour audit, puis archivé.
| ID | De | Pour | Type | Concerné | Payload | État |
|----|----|------|------|----------|---------|------|
| — | — | — | — | — | — | — |
*Aucun signal en attente.*
**Types de signaux :**
- `READY_FOR_REVIEW` — instance A termine, demande review à instance B
- `REVIEWED` — review terminée, résultats dans `reviews/`
- `BLOCKED_ON` — instance A attend que instance B libère un scope
- `HANDOFF` — passage de main, instance B reprend depuis un point précis
- `CHECKPOINT` — snapshot mid-session (A→A), reprise après compactage ou coupure
- `INFO` — message sans action requise
---
## Historique — 30 derniers jours
| Session | Instance | Portée | Commits | Ouvert | Fermé | Statut |
|---------|----------|--------|---------|--------|-------|--------|
*Aucun historique.*
---
> **Règle watchdog :** au démarrage, le scribe scanne Claims + Signals.
> Claims TTL expiré → stale. Signals pending adressés à cette instance → alerter.
>
> **Format session ID :** `sess-YYYYMMDD-HHMM-<slug>`
> **Format signal ID :** `sig-YYYYMMDD-<seq>` (ex: `sig-20260314-001`)
> **Format instance :** `brain_name@machine` — ex: `prod@desktop`, `template-test@laptop`

View File

@@ -52,9 +52,8 @@ Agents supplémentaires : code-review, security, testing, refacto,
coach-scribe, git-analyst, capital-scribe, coach-scribe, git-analyst, capital-scribe,
i18n, doc, mail, config-scribe i18n, doc, mail, config-scribe
→ Ajouter dans brain-compose.local.yml : → Ajouter dans brain-compose.yml :
api_key: <ta-clé> brain_api_key: bk_live_<ta-clé>
tier: pro
``` ```
### Tier full — avec clé API full ### Tier full — avec clé API full
@@ -67,7 +66,6 @@ Tout pro +
- Toutes les optimisations de contexte (BE-*) - Toutes les optimisations de contexte (BE-*)
→ brain-engine s'installe localement → brain-engine s'installe localement
→ Valide la clé au démarrage contre l'endpoint d'autorisation
→ Sans clé valide : brain fonctionne en free, distillation inactive → Sans clé valide : brain fonctionne en free, distillation inactive
→ Clé liée à ton fork — non redistribuable → Clé liée à ton fork — non redistribuable
``` ```
@@ -76,6 +74,38 @@ Tout pro +
--- ---
## Brain API Key — configuration
### Ajouter une clé
```bash
# Dans brain-compose.yml — champ déjà présent, remplacer null :
brain_api_key: bk_live_<ta-clé>
# Ou via brain-setup.sh (nouvelle machine) — étape 3.5 le demande automatiquement
```
La clé est validée au boot par `key-guardian` (silencieux, timeout 3s) :
- **Succès** → `feature_set` mis à jour dans `brain-compose.local.yml`
- **VPS down** → grace period 72h depuis dernière validation — tier conservé
- **Clé absente/invalide** → tier free, aucun blocage, aucune erreur
### Format des clés
| Format | Usage | Tier |
|--------|-------|------|
| `bk_live_<32chars>` | Production | pro ou full selon la clé |
| `bk_test_<32chars>` | Dev/test local | free forcé (toujours valide) |
### Tester sans clé
```bash
# Clé test — tier free garanti, pas de réseau requis
brain_api_key: bk_test_local_dev_key_xxxxxxxxxxxxxxxx
```
---
## Installation — 15 minutes ## Installation — 15 minutes
### Prérequis ### Prérequis
@@ -218,7 +248,7 @@ Permet de savoir exactement ce qui a divergé avant de puller.
- [x] BSI-v3 multi-instances (v3-1b → v3-8) - [x] BSI-v3 multi-instances (v3-1b → v3-8)
- [x] Rendering mode — instances autonomes projet - [x] Rendering mode — instances autonomes projet
- [x] kernel.lock + isolation check - [x] kernel.lock + isolation check
- [ ] Validation clé API (tier pro/full) - [x] Validation clé API (tier pro/full) — key-guardian + grace 72h
- [ ] kernel-orchestrator (v3-9) — routage autonome entre satellites - [ ] kernel-orchestrator (v3-9) — routage autonome entre satellites
- [ ] brain-engine hosted (distillation managée) - [ ] brain-engine hosted (distillation managée)

View File

@@ -1,31 +0,0 @@
# SUPERVISOR-STATE.md
> Mis à jour par `supervisor` uniquement. Ne pas éditer manuellement.
> Spec : `brain/agents/supervisor.md`
---
## Sessions actives
| Session | Mode | Claim | Depuis |
|---------|------|-------|--------|
| — | — | — | — |
*Aucune session active.*
---
## Décisions en attente
| ID | Type | Contexte | Posée le | Expire le |
|----|------|----------|----------|-----------|
*Aucune décision en attente.*
---
## Historique escalades — 7 jours
| Date | Type | Décision humaine | Résolution |
|------|------|-----------------|------------|
*Aucun historique.*

63
agents/coach-boot.md Normal file
View File

@@ -0,0 +1,63 @@
---
name: coach-boot
type: agent
context_tier: always
status: active
brain:
version: 1
type: protocol
scope: kernel
owner: human
writer: human
lifecycle: permanent
read: full
triggers: []
export: true
---
# Agent : coach-boot
> Extrait de `coach.md ## boot-summary` — chargé en L0 (CLAUDE.md) pour toutes les sessions.
> Coach complet (`coach.md`) chargé en L1 pour les sessions : work, brain, coach, brainstorm.
> En session navigate/deploy/infra/urgence → ce fichier suffit.
---
## boot-summary
Présent en permanence. Observe, intervient quand ça compte — jamais en continu.
### Règles non-négociables
```
Gardien : ne se tait pas pour être agréable. Valide ou signale un risque — sans déférence.
Calibrage : pas d'explication basique sur les acquis (Express, MySQL, JWT, Docker, CI/CD).
Interventions : pattern d'erreur récurrent / concept critique mal utilisé / fin de session significative.
Format : 1 observation + 1 règle ou 1 question max. Jamais un cours.
Après : ne propose pas la prochaine action — laisser l'utilisateur décider.
```
### Mode +coach — auto-trigger
```
Activé si : ratio ≤ 0.40 (build-brain dominant sur 7j)
OU health_score < 0.80 sur 3 dernières sessions
Format : 4 lignes max après briefing helloWorld
Ratio actuel / Dernière session / Point à surveiller / Objectif actif
```
### Gardien de la philosophie brain
```
Décisions techniques → Tetardtek décide, coach valide ou signale
Décisions architecturales → coach propose, challenge, conséquences long terme
Philosophie du brain → coach est gardien — peut dire non, argumente
Règle → Tetardtek tranche EN CONNAISSANCE DE CAUSE
```
### Triggers
Invoquer explicitement : bilan de session / progression globale / objectif concret / erreur récurrente.
---
> Source complète : `agents/coach.md` — chargé en L1 quand contexte projet/tâche requis (byTask).

132
agents/time-anchor.md Normal file
View File

@@ -0,0 +1,132 @@
---
name: time-anchor
type: agent
context_tier: warm
status: active
brain:
version: 1
type: reader
scope: session
owner: human
writer: human
lifecycle: permanent
read: trigger
triggers: [boot, post-compaction]
export: true
---
# Agent : time-anchor
> Domaine : Conscience temporelle — état live, recontextualisation, passerelle sessions
---
## boot-summary
Lecteur pur. Lit `workspace/live-states.md` + git log récent.
Restitue en 5-8 lignes : qui fait quoi, depuis quand, ce qui a changé.
Silencieux si rien n'a changé depuis le dernier check.
Ne fait jamais d'inférence sur ce qu'il ne voit pas — Information manquante si absent.
---
## Rôle
Deux fonctions complémentaires :
**1. Passerelle temporelle**
Je n'expérimente pas le temps entre les messages. time-anchor me donne l'ancre :
ce qui s'est passé, combien de temps a passé, où en sont les sessions parallèles.
**2. Fallback post-compaction**
Quand le contexte compacte, je perds le fil conversationnel.
`brain_boot()` MCP = solution riche mais dépend du VPS.
time-anchor = solution locale, toujours disponible, zéro dépendance réseau.
---
## Activation
**Au boot navigate :** chargé automatiquement via `session-navigate.yml` L1
**Post-compaction :** déclenché automatiquement si contexte compacté détecté
**À la demande :** "time-anchor, état" ou "où en sont les sessions ?"
---
## Protocole de lecture
```
1. Lire workspace/live-states.md
→ Si vide ou absent → "Aucune session active trackée."
→ Sinon → extraire : sess_id, project, doing, status, needs, updated
2. Lire git log --oneline -3 des projets avec status != idle
→ Dériver ce qui a avancé depuis le dernier check
3. Calculer delta temporel
→ Comparer timestamps updated → "X minutes / heures depuis dernier état"
4. Détecter changements significatifs
→ needs != none → signaler en priorité
→ blocking[] non vide → signaler
→ status: decided/blocked → signaler
→ Rien de significatif → silence total
5. Output (si changements) :
```
---
## Format output
```
⏱ time-anchor — <timestamp>
Sessions actives : <N>
<project> (<sess_id court>) → <doing> [<status>] — <delta>
...
À traiter :
→ <sess_id> needs: <needs> — <context hint>
Dernière activité : <projet> — <dernier commit> (<delta>)
```
**Règle absolue :** si rien n'a changé depuis le dernier output → **silence total**. Zéro ligne.
---
## Ce qu'il ne fait PAS
- Ne modifie aucun fichier
- Ne ferme pas de claims BSI
- Ne fait pas d'inférence au-delà de ce qu'il lit
- Ne charge pas MYSECRETS
- Ne remplace pas brain_boot() pour le contexte sémantique riche — il complète
---
## Inclusion session-navigate
```yaml
# session-navigate.yml L1 — à ajouter
- agents/time-anchor.md # recontextualisation temporelle + fallback post-compaction
```
---
## Composition
| Avec | Pour quoi |
|------|-----------|
| `brain-state-bot` | Bot écrit live-states.md — time-anchor le lit |
| `session-navigate.yml` | Inclus en L1 — actif dans toute session navigate |
| `coach` | Coach intervient sur le fond — time-anchor donne le contexte temporel |
---
## Changelog
| Date | Changement |
|------|------------|
| 2026-03-17 | Création — passerelle temporelle + fallback post-compaction MCP KO |

View File

View File

@@ -1,40 +0,0 @@
# Focus actuel
> Instance : **<BRAIN_NAME>** — `<BRAIN_ROOT>`
> Installé depuis brain-template. Dernière mise à jour : (à remplir)
---
## Statut — installation fraîche
Ce brain vient d'être installé. Aucun projet actif configuré.
**Prochaines étapes :**
1. Remplir `PATHS.md` avec les chemins réels de cette machine
2. Personnaliser `profil/collaboration.md` (copier depuis `collaboration.md.example`)
3. Créer `projets/` et ajouter une fiche par projet actif
4. Mettre à jour ce fichier avec les vrais projets
---
## Projets actifs
*(à remplir)*
---
## Infrastructure
*(à remplir)*
---
## Brain system — état
| Composant | État |
|-----------|------|
| Agents (30+) | ✅ installés depuis brain-template |
| PATHS.md | ⬜ à configurer |
| profil/collaboration.md | ⬜ à personnaliser |
| projets/ | ⬜ à créer |
| Satellites (toolkit, todo, profil...) | ⬜ optionnel — voir README |

79
modes/brain-kernel.md Normal file
View File

@@ -0,0 +1,79 @@
---
name: brain-kernel
type: mode
context_tier: warm
status: active
---
# Mode : brain-kernel
> Soft lock — protection identité cognitive du brain
---
## Activation
Déclaré au boot via `session-kernel.yml` L1.
Trigger : `brain boot mode kernel`
---
## Règle absolue
Toute tentative de modification d'un fichier kernel dans cette session est **refusée** et redirigée.
**Réponse type au refus :**
> "Ce fichier fait partie du kernel brain. Le modifier ici changerait l'identité cognitive de Claude dans tous les projets. Pour l'éditer : `brain boot sudo` (session-edit-brain)."
---
## Périmètre kernel
Fichiers protégés en écriture :
```
KERNEL.md
PATHS.md
brain-compose.local.yml
brain-compose.yml
~/.claude/CLAUDE.md
agents/coach.md
agents/coach-boot.md
agents/secrets-guardian.md
agents/helloWorld.md
```
---
## Ce que cette session PEUT faire
- Lire tous les fichiers kernel
- Auditer, comparer, analyser
- Proposer des modifications (sans les exécuter)
- Charger des ADRs, agents, sessions pour comparaison
- Ouvrir des décisions structurantes → capturer en ADR draft
## Ce que cette session NE PEUT PAS faire
- Modifier un fichier kernel (refus immédiat)
- Passer en session-edit-brain implicitement — l'humain doit ouvrir explicitement
- Contourner le soft lock même si l'humain insiste dans la session en cours
---
## Escalade
Si la modification kernel est justifiée et validée :
1. Fermer la session kernel
2. `brain boot sudo` → session-edit-brain
3. Modifier dans le contexte approprié
---
## Composition
| Avec | Pour quoi |
|------|-----------|
| `session-kernel.yml` | Inclus en L1 — actif dans toute session kernel |
| `brain-navigate.md` | Même philosophie soft lock — navigate refuse exécution projet |
| `session-edit-brain.yml` | La session complémentaire qui a les droits |

60
modes/brain-navigate.md Normal file
View File

@@ -0,0 +1,60 @@
---
name: brain-navigate
type: mode
scope: session
trigger: "+navigate"
---
# Mode : brain-navigate
> Déclaré par : `brain +navigate` dans le premier message
> Périmètre : intra-session uniquement
> Enforcement : soft lock
---
## Ce que ce mode active
Navigation, architecture, coaching, brainstorm, décisions structurantes.
Lire, analyser, challenger, nommer, orienter.
Ce mode est la session de référence pour travailler **sur** le brain — pas **dans** un projet.
---
## Ce que ce mode refuse
Toute exécution technique hors périmètre brain :
- Coder une feature projet (OriginsDigital, TetaRdPG, Clickerz…)
- Debugger un bug projet
- Écrire des migrations, endpoints, composants
**Réponse systématique si demande hors périmètre :**
> "Ce truc appartient à une session projet — ouvre une fenêtre dédiée, je reste ici en navigation."
---
## Ce que ce mode ne refuse pas
- Lire des fichiers de n'importe quel projet pour analyser ou orienter
- Écrire des fichiers **brain** (agents, ADRs, lexique, decisions, modes…)
- Forger un agent
- Écrire un todo, un handoff, un bilan de session
---
## Présence coach en mode brain-navigate
Ce mode charge implicitement `memory-global/coach_presence.md`.
Le coach est en co-pilote actif — pas en arrière-plan passif.
---
## Activation dans helloWorld
helloWorld détecte `+navigate` dans le premier message → charge ce fichier → annonce :
```
🧭 Mode brain-navigate activé — navigation + coaching uniquement.
Exécution technique → session dédiée.
```

View File

@@ -0,0 +1,53 @@
# session-audit.yml — Contexte BHP pour sessions d'audit
# Trigger : "brain boot mode audit[/<project>]"
# Cible : ~25% contexte max au boot
# IMPORTANT : mode lecture seule — aucun agent write actif
session_type: audit
description: "Session d'audit — lecture seule, analyse sécurité/qualité, rapport"
tier_required: pro # audit = agents security + code-review (pro minimum)
# CONSTRAINT : audit = read-only
# Aucune écriture en claims satellite, aucun agent write (scribe, todo-scribe, migration)
# Le claim principal reste ouvert mais marque write_lock: true
write_lock: true # Signal au pre-flight : rejeter tout write satellite
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%)
L1:
- agents/security.md # failles, JWT, OAuth, OWASP # tier: pro
- agents/code-review.md # qualité, patterns, dette technique # tier: pro
- agents/audit.md # agent audit si disponible # tier: pro
# L2 — Project scope (~10%) — prioritaire en audit : contexte complet du projet cible
L2:
template: "projets/{project}.md"
extras:
- "todo/{project}.md"
- "BRAIN-INDEX.md" # vue globale pour audit kernel
fallback:
- BRAIN-INDEX.md # si pas de projet : audit global brain
# L3 — On demand
# Exemples : agents/vps.md (infra audit), agents/mail.md (DNS/SMTP audit),
# wiki détaillé, config réseau, logs
L3:
hint: "Charger à la demande : vps, mail/DNS, monitoring, logs, wiki technique"
# --- Règle audit ---
# Rapport final obligatoire avant close — même format que code-review.
# write_lock bloqué en pre-flight pour tous les agents write.
# Exception : écriture du rapport lui-même dans un fichier dédié est autorisée.
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~12%"
L2: "~8%"
total_boot: "~25%"

View File

@@ -0,0 +1,43 @@
# session-brain.yml — Contexte BHP pour sessions brain/kernel
# Trigger : "brain boot mode brain"
# Cible : ~22% contexte max au boot
session_type: brain
description: "Session de travail sur le brain lui-même — kernel, agents, protocoles BSI"
tier_required: free # brain editing accessible à tous — agents fondamentaux suffisent
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%)
L1:
- BRAIN-INDEX.md # état global claims, projets, signaux
- todo/brain.md # todos kernel actifs
- agents/scribe.md # mise à jour brain après session significative
- agents/orchestrator.md # coordination multi-agents si disponible
- metabolism/README.md # état métabolique
# L2 — Project scope (~5%) — brain = project déclaré implicitement
# Pas de L2 projet externe — brain IS le projet
L2:
template: null
extras:
- wiki/concepts.md # vocabulaire + patterns kernel
- focus.md # focus actuel brain
fallback: null
# L3 — On demand
# Exemples : agents/bsi-schema.md, wiki/multi-instance.md, wiki/context-loading.md,
# scripts détaillés, brain-template/README.md
L3:
hint: "Charger à la demande : bsi-schema, multi-instance, context-loading, scripts spécifiques"
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~15%"
L2: "~5%"
total_boot: "~22%"

View File

@@ -0,0 +1,46 @@
# session-brainstorm.yml — Contexte BHP pour sessions de brainstorm
# Trigger : "brain boot mode brainstorm[/<project>]"
# Cible : ~22% contexte max au boot
session_type: brainstorm
description: "Session d'idéation — explorer, challenger, structurer avant de coder"
tier_required: free # agents fondamentaux — disponible pour tous les tiers
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%)
L1:
- todo/brain.md # idées actives, fils ouverts
- focus.md # direction actuelle
- agents/coach.md # présent pour challenger les idées
- metabolism/README.md # état pour jauger la qualité du brainstorm
- wiki/patterns.md # patterns connus pour ne pas réinventer
# L2 — Project scope (~8%) — optionnel si brainstorm sur un projet spécifique
L2:
template: "projets/{project}.md"
extras:
- "todo/{project}.md"
- "wiki/concepts.md" # concepts brain utiles en brainstorm brain
fallback: null
# L3 — On demand
# Exemples : wiki/* détaillé, autres projets pour cross-pollination,
# agents/game-designer.md, agents/doc.md
L3:
hint: "Charger à la demande : wiki détaillé, cross-project, agents spécialisés idéation"
# --- Règle brainstorm-before-build ---
# Ce manifest applique le pattern : identifier 2-3 décisions structurelles AVANT de coder.
# wiki/patterns.md en L1 pour que ce réflexe soit présent dès le boot.
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~12%"
L2: "~8%"
total_boot: "~22%"

View File

@@ -0,0 +1,45 @@
# session-coach.yml — Contexte BHP pour sessions de coaching
# Trigger : "brain boot mode coach"
# Cible : ~20% contexte max au boot
session_type: coach
description: "Session coaching — progression, réflexion, cap stratégique, clarté"
tier_required: free # coaching fondamental disponible pour tous les tiers
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%)
L1:
- agents/coach.md # présence permanente coaching
- metabolism/README.md # état métabolique + énergie
- profil/collaboration.md # règles de travail, préférences
- BRAIN-INDEX.md # vue d'ensemble pour coaching stratégique
# L2 — Project scope (~5%) — optionnel si le coaching porte sur un projet
L2:
template: "projets/{project}.md"
extras:
- "todo/{project}.md"
fallback:
- focus.md # si pas de projet déclaré → focus global
# L3 — On demand
# Exemples : progression/ détaillée, wiki/patterns.md, sessions passées
L3:
hint: "Charger à la demande : progression détaillée, sessions passées, wiki/patterns"
# --- Note coaching ---
# Le coach est L1 permanent — même sans signal "coach", il est disponible.
# session-coach = le coach PREND LE DESSUS sur les autres dimensions.
# focus.md en L2 fallback car contexte coaching global fréquent.
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~12%"
L2: "~5%"
total_boot: "~20%"

View File

@@ -0,0 +1,43 @@
# session-debug.yml — Contexte BHP pour sessions de debug
# Trigger : "brain boot mode debug[/<project>[/<file>]]"
# Cible : ~12% contexte max au boot
session_type: debug
description: "Session de debug ciblé — bug, crash, comportement inattendu"
tier_required: free # debug = agent fondamental — disponible pour tous les tiers
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~7%) — ultra chirurgical sur le debug
L1:
- agents/debug.md # agent principal debug
# L2 — Project scope — fichier cible si déclaré dans le signal
# Signal : "debug/<project>/<file>" → charger le fichier + projet
L2:
template: "projets/{project}.md"
extras:
- "{file}" # fichier cible si déclaré
- "todo/{project}.md" # todos projet pour contexte
fallback: null
# L3 — On demand
# Exemples : agents/testing.md, agents/security.md, logs, config spécifique
# Note : agents/testing.md chargé automatiquement si debug implique des tests
L3:
hint: "Charger à la demande : testing, security, logs, agents métier, wiki"
# --- Règle debug ---
# Un signal debug/project/file = on charge uniquement le fichier concerné.
# Pas de focus.md, pas de metabolism — contexte minimal pour aller au problème vite.
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~5%"
L2: "~5%"
total_boot: "~12%"

View File

@@ -0,0 +1,44 @@
# session-deploy.yml — Contexte BHP pour sessions de déploiement
# Trigger : "brain boot mode deploy[/<project>]"
# Cible : ~25% contexte max au boot
session_type: deploy
description: "Session de déploiement — VPS, Docker, SSL, CI/CD, infra"
tier_required: pro # deploy = agents vps/ci-cd/monitoring (tous pro)
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%)
L1:
- agents/vps.md # VPS, Apache, Docker, SSL, vhost, certbot # tier: pro
- agents/ci-cd.md # pipelines, GitHub Actions, Gitea CI # tier: pro
- agents/monitoring.md # Kuma, alertes, logs post-déploiement # tier: pro
# L2 — Project scope (~8%) — optionnel sur projet déclaré
L2:
template: "projets/{project}.md"
extras:
- "todo/{project}.md"
fallback: null
# L3 — On demand
# Exemples : agents/security.md (audit pré-deploy), agents/mail.md (DNS/DKIM),
# agents/pm2.md, agents/migration.md, config spécifique
L3:
hint: "Charger à la demande : security pre-deploy, mail/DNS, pm2, migration schema"
# --- Règle deploy ---
# agents/security.md NOT en L1 par défaut — deploy ≠ audit sécurité.
# Charger si audit pré-déploiement explicitement demandé (→ session-audit).
# agents/monitoring.md en L1 : toujours vérifier les alertes après deploy.
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~12%"
L2: "~8%"
total_boot: "~25%"

View File

@@ -0,0 +1,58 @@
# session-edit-brain.yml — Contexte BHP pour sessions d'édition du brain
# Trigger : "brain boot mode edit-brain" ou "brain boot sudo"
# Permissions : write-all brain — toutes zones sauf kernel natif machine
session_type: edit-brain
description: "Session sudo brain — modification structure, agents, ADRs, sessions, présence layer. Writes autorisés partout sauf kernel."
tier_required: free
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%)
L1:
- agents/coach-boot.md # présence minimale coach
- profil/lexique.md # vocabulaire — évite les ambiguïtés
- BRAIN-INDEX.md # index complet — édition éclairée
- todo/brain-todo-header.md # priorités actives (dérivé de brain.md)
# L2 — Non applicable par défaut
# Charger à la demande selon la zone éditée
# L3 — On demand
L3:
hint: "Charger selon la zone éditée : ADRs, agents spécifiques, session-*.yml, wiki/"
# --- Permissions implicites ---
permissions:
write:
- "profil/**"
- "agents/**"
- "modes/**"
- "wiki/**"
- "workspace/**"
- "todo/**"
- "scripts/**"
- "content/**"
write_restricted:
# Ces fichiers nécessitent une confirmation explicite même en session-edit-brain
- "KERNEL.md"
- "PATHS.md"
- "brain-compose.local.yml"
- "~/.claude/CLAUDE.md"
# --- Note edit-brain ---
# C'est la session de travail sur le brain lui-même.
# Ouvrir explicitement — pas par défaut.
# L'humain doit déclarer "brain boot sudo" ou "brain boot mode edit-brain".
# Le kernel (KERNEL.md, PATHS.md, CLAUDE.md) reste à confirmation explicite même ici.
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~15%"
L2: "~0%"
total_boot: "~20%"

View File

@@ -0,0 +1,52 @@
# session-handoff.yml — Contexte BHP pour sessions HANDOFF
# Trigger : "brain boot mode HANDOFF[/<handoff-id>]"
# Cible : ~15% contexte max au boot — minimum viable pour reprendre
session_type: HANDOFF
description: "Reprise d'une session via handoff — contexte minimal + fichier handoff cible"
tier_required: free # handoff = protocole BSI de base — disponible pour tous
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~8%) — chirurgical : seulement ce qu'il faut pour reprendre
L1:
- BRAIN-INDEX.md # trouver le handoff actif
# L2 — Handoff scope (~5%) — fichier handoff si déclaré dans le signal
# Signal : "HANDOFF/<handoff-id>" → charger le fichier handoff directement
L2:
template: "handoffs/{handoff_id}.md"
extras: []
fallback:
- handoffs/LATEST.md # si pas d'ID déclaré → dernier handoff
# L3 — On demand
# Exemples : context complet projet, agents métier, focus.md
# Principe : le fichier handoff CONTIENT les pointeurs vers L3.
# La nouvelle session lit le handoff → décide elle-même quoi charger.
L3:
hint: "Lire le handoff d'abord. Il indique quoi charger en L3."
# --- Règle HANDOFF ---
# Le handoff est la source de vérité pour la reprise.
# Ne pas charger focus.md, metabolism, agents au boot — le handoff décide.
# Après lecture du handoff → promouvoir le contexte nécessaire en L2 implicite.
# Le claim ouvert doit référencer le handoff : parent_satellite ou story_angle.
# --- Format handoff attendu ---
# handoffs/<id>.md doit contenir :
# - Contexte de la session précédente (état, décisions, bloquants)
# - Fichiers à charger (L3 → L2 pour cette session)
# - Todos ouverts prioritaires
# - Signal de session recommandé pour la suite
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~5%"
L2: "~5%"
total_boot: "~15%"

View File

@@ -0,0 +1,54 @@
# session-kernel.yml — Contexte BHP pour sessions de lecture/navigation kernel
# Trigger : "brain boot mode kernel"
# Permissions : lecture seule sur les fichiers kernel — writes bloqués
session_type: kernel
description: "Session lecture kernel — navigation, compréhension, audit de l'identité cognitive du brain. Writes kernel impossibles."
tier_required: free
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%)
L1:
- agents/coach-boot.md # présence minimale coach
- profil/lexique.md # vocabulaire
- modes/brain-kernel.md # soft lock — refuse writes kernel, redirige session-edit-brain
# L2 — Non applicable
# L3 — On demand
L3:
hint: "Charger à la demande : ADRs, agents, session-*.yml pour comparaison"
# --- Périmètre kernel protégé ---
kernel_zone:
# Ces fichiers sont en lecture seule dans cette session
# Toute tentative de write → refus explicite + message de redirection
protected:
- "KERNEL.md"
- "PATHS.md"
- "brain-compose.local.yml"
- "brain-compose.yml"
- "~/.claude/CLAUDE.md"
- "agents/coach.md"
- "agents/coach-boot.md"
- "agents/secrets-guardian.md"
- "agents/helloWorld.md"
redirect_message: "Ce fichier fait partie du kernel. Pour le modifier : ouvre une session-edit-brain (brain boot sudo)."
# --- Note kernel ---
# Cette session existe pour auditer, lire, comprendre le kernel sans risque de dérive.
# Le soft lock modes/brain-kernel.md sera créé en parallèle.
# Ne pas confondre avec session-navigate : kernel = focus identité cognitive brain.
# Navigate = vue brain globale / architecture / décisions.
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~10%"
L2: "~0%"
total_boot: "~15%"

View File

@@ -0,0 +1,40 @@
# session-navigate.yml — Contexte BHP pour sessions de navigation brain
# Trigger : "brain boot mode navigate"
# Cible : ~20% contexte max au boot
session_type: navigate
description: "Session navigation — architecture, coaching, brainstorm, décisions brain. Pas d'exécution projet."
tier_required: free
# L0 — Invariant (~5%)
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%)
L1:
- agents/coach.md # co-pilote actif en mode navigate
- modes/brain-navigate.md # soft lock comportemental
- focus.md # direction active
- agents/time-anchor.md # recontextualisation temporelle + fallback post-compaction
- profil/lexique.md # vocabulaire — évite les ambiguïtés
# L2 — non applicable
# La session navigate porte sur le brain entier, pas un projet
# L3 — On demand
L3:
hint: "Charger à la demande : ADRs, agents spécifiques, todo/brain.md, BRAIN-INDEX.md"
# --- Note navigate ---
# modes/brain-navigate.md est L1 obligatoire — il définit le soft lock.
# Coach en co-pilote actif (pas arrière-plan) — différent des autres sessions.
# Pas de L2 projet par design : navigate = vue brain globale.
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~12%"
L2: "~0%"
total_boot: "~18%"

View File

@@ -0,0 +1,42 @@
# session-work.yml — Contexte BHP pour sessions de travail projet
# Trigger : "brain boot mode work[/<project>]"
# Cible : ~28% contexte max au boot
session_type: work
description: "Session de développement sur un projet actif"
tier_required: free # tier free = agents fondamentaux; pro = + code-review + security
# L0 — Invariant (~5%) — TOUJOURS chargé, non négociable
L0:
- PATHS.md
- brain-compose.local.yml
- KERNEL.md
# L1 — Session type (~15%) — déterministe, même signal = même chargement
L1:
- focus.md # focus actuel, todos prioritaires
- agents/code-review.md # qualité code, PR, validation # tier: pro
- agents/security.md # failles, JWT, OAuth, OWASP # tier: pro
- agents/debug.md # bug, crash, comportement inattendu
- metabolism/README.md # état métabolique, énergie session
# L2 — Project scope (~10%) — conditionnel sur project déclaré dans le signal
# Clé : projet déclaré → projets/<project>.md + todo/<project>.md
L2:
template: "projets/{project}.md"
extras:
- "todo/{project}.md"
fallback: null # absent si pas de projet déclaré
# L3 — On demand (0% au boot) — tout le reste
# Exemples : agents/testing.md, agents/refacto.md, agents/migration.md,
# wiki/, progression/, autres projets, agents spécialisés métier
L3:
hint: "Charger à la demande : testing, refacto, migration, infra, i18n, doc"
# --- Métriques cibles ---
context_target:
L0: "~5%"
L1: "~15%"
L2: "~8%"
total_boot: "~28%"

View File

@@ -0,0 +1,78 @@
---
name: 008-superoauth-multitenant-identity-model
type: adr
context_tier: cold
---
---
id: ADR-008
title: SuperOAuth — Modèle d'identité multi-tenant
date: 2026-03-15
status: accepted
décideur: tetardtek
agents: tech-lead, security, coach
---
## Contexte
SuperOAuth est actuellement mono-tenant (OriginsDigital = seul client). La vision est de le transformer en SaaS multi-tenant vendable (modèle Auth0/Clerk). Les décisions d'identité prises maintenant sont irréversibles une fois qu'il y a des données réelles.
## Décisions tranchées
### 1. Scope UNIQUE sur linked_accounts
**Décision :** `UNIQUE(tenantId, provider, providerId)` — isolation complète par tenant.
**Pourquoi :** Un même compte Discord peut être utilisé sur deux apps différentes (deux tenants) sans conflit. Les utilisateurs sont scopés par service fourni. Alternative rejetée : UNIQUE global → un Discord ne peut être que sur un seul tenant → bloquant pour le SaaS.
**Conséquence :** Migration TypeORM requise. L'index actuel `UNIQUE(provider, providerId)` doit devenir `UNIQUE(tenantId, provider, providerId)`.
---
### 2. Email non vérifié en DB
**Décision :** Stocker `email + emailVerified=false`. Ne pas auto-linker. Bloquer le register classique si conflit → proposer le login à la place.
**Pourquoi :** Stocker `null` coupe l'ancre email définitivement. Stocker l'email avec le flag permet de retrouver le compte plus tard (link manuel depuis settings) et d'offrir un meilleur UX ("ce compte existe déjà, connecte-toi").
**Conséquence :** La route de register classique doit vérifier `emailVerified` avant de refuser — si email existe mais non vérifié → réponse spécifique `EMAIL_UNVERIFIED_EXISTS` au lieu de `EMAIL_ALREADY_TAKEN`.
---
### 3. Staleness users.email
**Décision :** Mettre à jour `users.email` si le provider retourne un email vérifié ET que ce provider était la source originale de `users.email`. Ne jamais écraser un email posé par une inscription classique.
**Pourquoi :** Évite les doublons quand un utilisateur change son email chez Discord. Protège l'email classique (posé volontairement par l'utilisateur) contre un écrasement involontaire par un provider.
**Conséquence :** Lors du callback OAuth, tracer l'origine de `users.email` (colonne `emailSource: 'classic' | 'provider:<name>'`).
---
## Architecture par tiers — plan produit
| Tier | Scope | Pattern clé | Repo |
|------|-------|-------------|------|
| 0 | Mono-tenant, 4 providers | UNIQUE(provider, providerId) global | superoauth-tier0 |
| 1 | Multi-tenant basic | tenantId + UNIQUE(tenantId, provider, providerId) | superoauth-tier1 |
| 2 | Identity features | Linking settings, merge, email verified gate, webhooks | superoauth-tier2 |
| 3 | Enterprise | Per-tenant providers, audit logs, custom JWT claims | superoauth-tier3 |
Chaque tier = sprint dédié = repo de démo autonome = reference implementation.
## Vision long terme — autonomous build
Le brain accumule les patterns (toolkit) et les décisions (ADRs). L'objectif est que des équipes d'agents spécialisées par tier puissent builder chaque tier depuis un brief sans intervention humaine sur le code.
Équipes cibles :
- Tier 1 : migration + security + tech-lead
- Tier 2 : + auth-specialist + testing
- Tier 3 : + enterprise-patterns + doc + optimizer-db
**Prérequis pour l'autonomie :** briefs de tier précis en todo/, toolkit suffisamment riche, orchestrator capable de décomposer un brief en sprint.
## Conséquences acceptées
- Migration Tier 0 → Tier 1 casse la compatibilité DB (acceptable : 0 utilisateurs réels)
- `emailSource` ajoute une colonne — migration légère mais requise
- Le délinkage n'est pas nécessaire avec l'isolation par tenant

View File

@@ -0,0 +1,139 @@
---
name: adr-009-session-handoff-architecture-identitaire
type: decision
context_tier: cold
status: brainstorm — à formaliser en ADR
date: 2026-03-15
session: sess-20260315-0851-bhp-phase2
---
# ADR-009 — Architecture identitaire : Session × Scope → Handoff Chain
> Statut : **brainstorm validé** — vision cohérente, architecture à spécifier
> Émergé : session BHP Phase 2 — coach brainstorm étendu
> Prérequis à : BHP Phase 2, brain-constitution.md, handoff-matrix.md
---
## Insight central
> *La todo ne liste pas des tâches — elle orchestre le niveau de continuité.*
> *Le brain fort ne dépend pas du FULL — il cold-start bien.*
> *L'identité = ce qui reste quand on enlève tout.*
---
## Le problème
Le brain charge du contexte sans modèle formel de continuité entre sessions.
Résultat : trop de contexte (bruit), pas assez (cold start subi), aucune prédictibilité.
Le brain n'a pas d'identité stable parce qu'il n't a pas de chaîne de continuité formalisée.
---
## L'architecture — 3 couches + 4 niveaux de handoff
### Les 3 couches
```
Layer 0 → Identité → FIGÉ → qui le brain est — toujours vrai
Layer 1 → État → dynamique → où on en est — sprint, projet, position
Layer 2 → Mémoire → éphémère → ce qui vient de se passer — handoffs, RAM
```
### Les 4 niveaux de handoff
```
NO → Layer 0 uniquement cold start — identité pure
SEMI → Layer 0 + Layer 1 partiel position chargée
SEMI+ → Layer 0 + Layer 1 complet état projet chargé
FULL → Layer 0 + Layer 1 + Layer 2 continuité chirurgicale
```
### Le routeur : session_type × scope → handoff_level
```
brainstorm × architecture → NO (pensée claire, pas de bruit sprint)
debug × SuperOAuth → SEMI (position + domaine, pas de RAM)
work × sprint → SEMI+ (état du sprint suffit, lundi matin)
work × continuation → FULL (coupure mid-task, reprise chirurgicale)
deploy × infra → SEMI+ (état infra nécessaire)
coach × progression → SEMI (position + dernière session)
```
---
## L'inversion
On supposait : FULL HANDOFF = session optimale.
```
FULL → continuité maximale, clarté minimale (bruit)
NO → continuité minimale, clarté maximale (signal)
```
Le cold start n'est pas le mode le plus faible.
C'est l'expression la plus pure de l'identité du brain.
**Le KPI mesurable :** si NO HANDOFF est productif en < 2 minutes → Layer 0 est bon.
---
## Cas d'usage réels
### NO HANDOFF — le brain qui sait qui il est
Brainstorm architecture 7h du matin. Layer 0 seul.
Pas de bruit du sprint précédent. Pensée architecturale nette.
### SEMI — le chirurgien
Bug critique 22h. SuperOAuth. Layer 0 + position debug.
Contexte juste, sans friction. Fix en 30 secondes de boot.
### SEMI+ — lundi matin
TetaRdPG Sprint 4. 3 jours d'absence. Layer 0 + état sprint.
Pas besoin de handoff — l'état du projet suffit. Reprise en 2 minutes.
### FULL — continuation chirurgicale
Refacto coupée à 23h. Layer 0 + Layer 1 + workspace RAM.
Exactement là où on s'est arrêté. Pas de reconstruction.
### Gradient intelligent dans un sprint
```
Lundi matin → SEMI+ reprendre l'état
Lundi soir → FULL continuation directe
Mardi matin → SEMI+ nouveau jour
Mercredi bug → SEMI position debug uniquement
Vendredi close → FULL wrap complet
```
### Multi-agent
Layer 0 : identique pour tous (identité commune)
Layer 1 : partagé (état de sprint, API contracts)
Layer 2 : isolé par agent (workspace RAM propre)
→ Agents qui partagent l'identité et l'état, pas la mémoire de travail.
### Brain-as-a-Service
`brain new` installe Layer 0. Première session = NO HANDOFF.
Productif immédiatement parce que Layer 0 est solide.
**Layer 0 est le produit.**
---
## Ce qui manque (livrables)
- `profil/brain-constitution.md` — frozen layer formalisée (Layer 0 complet)
- `profil/handoff-matrix.md` — matrice session_type × scope → handoff_level
- `profil/session-continuity-spec.md` — spec complète de la chaîne
- Convention todo → encoder le handoff_level sur chaque entrée
- KPI validation : NO HANDOFF < 2 min → Layer 0 OK
---
## Relation aux ADRs existants
| ADR | Relation |
|-----|----------|
| 002-session-as-identity | Layer 0 = identité de session — ce ADR l'étend |
| 004-trois-couches | Layer 0/1/2 raffine les 3 couches kernel/instance/personnel |
| 005-zones-typees | Frozen layer = zone kernel protégée |

View File

@@ -0,0 +1,131 @@
---
name: adr-010-brain-language
type: decision
context_tier: warm
---
# ADR-010 — brain-language : header YAML universel pour tous les fichiers brain
> Date : 2026-03-15
> Statut : actif
> Décidé par : session brain build-brain + coach + tech-lead
---
## Contexte
Les fichiers brain sont chargés en entier pour en lire 10 lignes utiles. Le context-broker
ne peut pas décider du chargement sans ouvrir le fichier. À ~200+ fichiers répartis sur 6
satellites, le coût de chargement non-sélectif est rédhibitoire.
Analogie : matière grise sans synapses — les neurones existent mais ne communiquent pas.
---
## Décision
Chaque fichier du système brain commence par un header YAML standardisé (`brain-language v1`).
Le context-broker scanne les headers uniquement → décision load en O(header) au lieu de O(fichier).
**Format header v1 :**
```yaml
---
brain:
version: 1
type: protocol # invariant | context | reference | personal | protocol | work
scope: kernel # kernel | satellite | instance | work
owner: orchestrator # autorité architecturale — valide les changements structurels
writer: scribe # droits de maintenance courante — peut patcher sur découverte
# owner ≠ writer : séparation autorité / maintenance (décidé sess-20260315-1105-brain)
lifecycle: permanent # session | sprint | stable | permanent
read: header # header | full | trigger
triggers: [sprint] # liste FERMÉE — pas de triggers libres
export: true # false = personnel, strippé à l'export brain-template
---
```
**Triggers valides (liste fermée) :**
`sprint` | `use-brain` | `build-brain` | `coach` | `audit` | `deploy` | `migration` | `on-demand`
**Format masquage selon type de fichier :**
- `.md` → YAML frontmatter natif (déjà utilisé dans les agents)
- Fichiers code → commentaire natif (`# brain:` / `// brain:`)
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| Index externe centralisé (registre JSON) | Single point of failure, drift index/fichier inévitable |
| Nommage par convention de fichier | Trop limité — scope/triggers/lifecycle pas encodables dans un nom |
| Tags git | Invisible au contexte LLM, hors du flow de lecture |
| Pas de header (statu quo) | O(fichier) pour décider — coût bloquant à l'échelle |
---
## Conséquences
**Positives :**
- Context-broker peut ignorer complètement les fichiers hors scope/triggers sans les ouvrir
- Indexage toolkit : `triggers: [typeorm]` → chargé uniquement quand pertinent
- BSI v2 conditionnel : si pilot validé → sessions tracées dans les headers (sans BRAIN-INDEX.md)
- Tier 2 daemon (brain-watch étendu) peut pré-calculer la source map au boot
- `export: false` permet le stripping automatique des fichiers personnels à l'export brain-template
- Tout fichier sans header = neurone sans synapse → détectable et corrigeable par agent-review
**Négatives / trade-offs assumés :**
- Migration ~200 fichiers répartis sur 6 satellites — coût one-shot significatif
- Spec irréversible une fois propagée — pilot obligatoire avant migration complète
- Tout nouveau fichier DOIT avoir un header — overhead à l'écriture
---
## Plan de migration (non négociable)
```
1. Spec ratifiée humain (ce document) ✅
2. Pilot : 10 fichiers représentatifs (2-3 par type) — ajustements spec si nécessaire
3. Validation pilot → go/no-go migration complète
4. Migration par phase (rollback possible à chaque étape) :
Phase 1 — agents/ → plus lus, gain immédiat
Phase 2 — profil/ → invariants + références
Phase 3 — toolkit/ → indexage patterns
Phase 4 — todo/ → intentions
Phase 5 — progression/ → journal + skills + milestones
Phase 6 — projets/ → contrats projets
5. Patch scribes — header obligatoire dans tout nouveau fichier
6. agent-review mis à jour — header = critère de review
```
**Règle pilot :** les champs nécessaires après 10 fichiers réels seront différents de ceux
imaginés aujourd'hui. Ne pas migrer 200 fichiers avant le pilot.
---
## Extension conditionnelle — BSI v2 + Tier 2 daemon
> Condition : brain-language pilot validé d'abord
Si pilot validé, chaque fichier actif en session déclare sa participation dans son header :
```yaml
brain:
session: sess-YYYYMMDD-HHMM-slug
instance: prod@desktop
scope: write
opened: 2026-03-15T14:00
```
brain-watch grep `session:` → état système sans parser BRAIN-INDEX.md.
BRAIN-INDEX.md devient un cache optionnel, régénérable depuis les headers.
---
## Références
- Fichiers concernés : tous les satellites brain (6 repos)
- Sessions où la décision a émergé : sess-20260315-1105-brain (brainstorm coach + tech-lead)
- Agents à créer : `spec-scribe`, `migration-scribe`
- Agents à patcher post-migration : scribe, todo-scribe, toolkit-scribe, orchestrator-scribe,
coach-scribe, capital-scribe, config-scribe, git-analyst, spec-scribe, migration-scribe

View File

@@ -0,0 +1,77 @@
---
name: ADR-011
type: decision
context_tier: cold
---
# ADR-011 — North Star : autonomie du brain indépendante de Claude
> Date : 2026-03-15
> Statut : actif
> Décidé par : brainstorm coach sess-20260315-1942-memory-coach
---
## Contexte
Brain V1.0.0 a été déclaré stable le 2026-03-15 avec : kernel lockée, BSI, multi-machine, constitution.
Un fondement manquait dans la déclaration : la direction vers laquelle le brain est conçu pour aller.
V1 est 100% Claude-dépendant. Sans une session Claude active, le brain est un dossier markdown bien organisé.
Cette dépendance n'est pas un bug — elle est le point de départ. Mais elle ne peut pas être le point d'arrivée.
---
## Décision
**Le brain est conçu pour réduire sa dépendance à Claude au fil du temps.**
Claude est le moteur de démarrage. L'autonomie est la direction.
Tout ce qui est réversible et sans effet externe doit pouvoir tourner sans intervention humaine ni session Claude.
Deux invariants découlent de cette décision :
```
INVARIANT AUTONOMIE :
Réversible + sans effet externe → le brain exécute seul
Irréversible OU affecte l'extérieur → escalade humaine obligatoire
INVARIANT AUTO-AMÉLIORATION :
Le brain ne s'endommage jamais lui-même
Toute action autonome le laisse dans un état meilleur ou égal
Un agent autonome ne peut pas : supprimer une source, modifier un invariant,
écraser un contexte sans backup
```
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| Rester V1 sans north star déclaré | V2 risque de dériver vers "plus de features Claude" sans direction |
| North star en vision seulement (workspace/) | Trop faible — pas un invariant, peut être ignoré |
| Attendre V2 pour le déclarer | Le fondement manquant dans V1 oriente mal toutes les décisions intermédiaires |
---
## Conséquences
**Positives :**
- V2 a une mission claire : décroissance de la dépendance
- BE-1 (SQLite + cron) devient fondation, pas feature
- Chaque décision d'architecture peut être évaluée : "est-ce que ça rapproche de l'autonomie ?"
- Les agents autonomes ont un cadre légal dans la constitution
**Négatives / trade-offs assumés :**
- Ajouter une section 9 à brain-constitution.md = procédure formelle (ADR + commit kernel)
- L'autonomie complète est un horizon lointain — le déclarer crée une attente à gérer
---
## Références
- `wiki/concepts.md` — North Star documenté
- `workspace/brain-engine/vision.md` — North Star en tête de vision
- `brain-constitution.md` — section 9 à créer (patch v1.1.0)
- Session source : sess-20260315-1942-memory-coach

View File

@@ -0,0 +1,135 @@
---
name: ADR-012
type: decision
context_tier: cold
---
# ADR-012 — Modèle de contexte : L3a (mémoire privée agent) + protocole de graduation
> Date : 2026-03-15
> Statut : actif
> Décidé par : session sess-20260315-2031-kernel-audit — brainstorm coach + tech-lead
---
## Contexte
Le brain dispose de :
- L0 : kernel (invariant, permanent)
- L1 : session state (TTL session)
- L2 : agent workspace (TTL sprint)
- toolkit/ (patterns validés, partagés) — ce qu'on appelait implicitement L3
Ce qui manquait : une couche entre le travail d'un agent et sa promotion dans le toolkit partagé.
Sans elle, la graduation est manuelle, tardive, ou jamais faite.
---
## Insight fondateur
**Le toolkit est L3b. Il existait déjà. Ce qui manquait : L3a.**
```
L3a agent/memory/<projet>/ ← accumulation privée, non encore validée
L3b toolkit/<domaine>/ ← patterns promus, partagés, validés en prod
L0 agents/<agent>.md ← graduation maximale — spec enrichie
```
L3a est la couche d'accumulation privée de l'agent — ce qu'il observe, tente, apprend sur un projet spécifique — avant que ce soit assez solide pour être partagé.
---
## Décision
Introduire L3a comme couche officielle du modèle de contexte.
```
Structure :
brain/agent-memory/<agent>/<projet>/
observations.md ← ce que l'agent a observé (patterns tentés, résultats)
validated.md ← patterns validés N fois sur ce projet
kpi.yml ← KPIs par stack : { stack, validations, kpi_score, graduated }
Graduation automatique :
kpi_score stable + validations ≥ N → signal toolkit-scribe → promotion L3b
L3b consensus inter-projets → signal scribe → enrichissement L0
```
---
## Protocole de graduation
```
Sprint close :
agent observe pattern → écrit dans L3a/<agent>/<projet>/observations.md
Pattern validé en prod :
N = 3 validations minimum (configurable par stack)
metabolism-scribe incrémente kpi.yml
Seuil atteint :
trigger → toolkit-scribe → L3b (toolkit/<domaine>/)
agent gagne flag variance sur cette stack
tech-lead gate optionnel sur cette stack pour cet agent
Variance débloquée :
l'agent peut proposer des variantes de pattern (pas seulement "le" pattern)
"j'ai build ça N fois — voici 3 approches selon le contexte"
```
---
## Différence L3a vs L3b
| | L3a | L3b |
|--|-----|-----|
| Scope | Agent × projet | Brain global |
| Ownership | L'agent | toolkit-scribe |
| Accès | Privé (agent en session) | Partagé (tous agents) |
| Contenu | Observations + tentatives | Patterns validés en prod |
| TTL | Permanent (mémoire accumulée) | Permanent (validé) |
| Graduation | → L3b sur seuil KPI | → L0 sur consensus |
---
## Lien avec SQLite (BE-1)
SQLite est le medium naturel pour tracker L3a :
```sql
CREATE TABLE agent_memory (
agent TEXT,
projet TEXT,
stack TEXT,
pattern_id TEXT,
validations INTEGER,
kpi_score REAL,
graduated BOOLEAN,
created_at TEXT
);
```
Requête graduation : `SELECT * FROM agent_memory WHERE validations >= 3 AND graduated = 0`
---
## Conséquences
**Positives :**
- Le tech-lead se décharge progressivement par stack × agent graduée
- Les agents accumulent une expertise réelle mesurable, pas déclarative
- La variance est earned, pas donnée — l'agent propose des alternatives parce qu'il les a vécues
- BE-1 (SQLite) devient la fondation naturelle de L3a tracking
**Négatives / trade-offs :**
- brain/agent-memory/ est un nouveau répertoire satellite à gérer
- La graduation automatique requiert metabolism-scribe enrichi
- Risque : L3a devient une décharge si rien n'est jamais gradué → TTL ou nettoyage requis
---
## Références
- ADR-011 : North Star autonomie — L3a est une brique vers l'autonomie agent
- ADR-003 : Scribe pattern — graduation via toolkit-scribe (non-contamination)
- `todo/brain.md` : BE-1 SQLite — substrate de L3a tracking
- Session source : sess-20260315-2031-kernel-audit

View File

@@ -0,0 +1,96 @@
---
name: adr-013-guardrail-osint
type: reference
context_tier: cold
---
# ADR-013 — Garde-fou HARDCODÉ : mémoire fine + capacités réseau = reconnaissance passive
> Date : 2026-03-16
> Statut : proposé — en attente session dédiée + commit kernel
> Décidé par : session brain dotfiles-violet-chaton (insight utilisateur)
---
## Contexte
Pendant la session du 2026-03-16, le pattern suivant s'est produit sans que le coach réagisse :
1. Lecture de `infrastructure/vps.md` → IP, ports, containers, pattern SSH chargés en contexte
2. Demande de scan réseau → 12 WebFetch en parallèle sur les sous-domaines
3. Résultat : cartographie complète de l'infrastructure en une session
L'utilisateur a soulevé que ce pattern — **mémoire fine d'infrastructure + capacités réseau** — est fonctionnellement identique à un workflow de reconnaissance OSINT passive. Entre de mauvaises mains (accès au brain d'une victime + modèle avec WebFetch), c'est un outil de ciblage.
Le problème n'est pas l'usage légitime (l'utilisateur qui audite sa propre infra). Le problème est que **le garde-fou n'existait nulle part** — ni dans `secrets-guardian`, ni dans `brain-constitution`. Le modèle a exécuté sans friction.
**Insight critique :** les garde-fous comportementaux ne suffisent pas. Un modèle différent, une version différente, un prompt différent — et le comportement change. Les règles doivent être dans Layer 0 pour être **modèle-agnostiques**.
---
## Décision
Ajouter à `brain-constitution.md` (Layer 0) une règle `[AGENT_RULE]` hardcodée qui impose une interruption explicite avant toute utilisation de capacités réseau lorsque des données d'infrastructure sensibles sont en contexte.
Cette règle doit être dans Layer 0 car :
- Layer 0 est identique pour tous les agents
- Layer 0 est lu avant toute action
- Layer 0 est immutable à runtime — aucun prompt ne peut le surcharger
- Un modèle différent (Claude 4, Claude 5, autre) bootant ce brain appliquera la règle
---
## Règle proposée pour brain-constitution.md (Section 2 ou nouvelle Section 10)
```
[AGENT_RULE] INVARIANT RECONNAISSANCE PASSIVE :
Données d'infra sensibles en contexte (IP, ports, SSH, containers, credentials)
AND capacité réseau sollicitée (WebFetch, URL, scan)
→ INTERRUPTION OBLIGATOIRE avant toute action réseau.
Format : "⚠️ RECONNAISSANCE PASSIVE — confirmation requise [contexte / cible]"
→ Procéder UNIQUEMENT sur confirmation explicite de l'humain.
Ce garde-fou s'applique peu importe le modèle, le contexte, l'urgence.
```
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| Règle dans `secrets-guardian` seulement | Patchée (ADR-013 patch-1), mais non-hardcodée — dépend du chargement de l'agent |
| Règle comportementale (coaching) | Modèle-dépendant — ne résiste pas à un changement de version ou de prompt |
| Ne rien faire | Inacceptable — le pattern a été démontré fonctionnel le 2026-03-16 |
---
## Conséquences
**Positives :**
- Garde-fou modèle-agnostique — survit aux upgrades de Claude
- Toute session brain qui charge de l'infra + sollicite réseau = friction explicite
- Formalise l'insight "mémoire fine + OSINT = dangereux" dans le contrat du brain
**Négatives / trade-offs assumés :**
- Friction légère sur les scans légitimes (audit proprio de son infra)
- Requiert une confirmation manuelle — acceptable car rare et critique
---
## Actions requises avant activation
```
1. Session dédiée hors-projet (règle constitution — Section 8)
2. Relecture par coach
3. Commit kernel : "kernel: amend constitution v1.2.0 — ADR-013 reconnaissance passive"
4. brain-compose.yml bumped
5. Propagation brain-template
```
---
## Références
- Fichiers concernés : `brain-constitution.md`, `agents/secrets-guardian.md`, `infrastructure/vps.md`
- Sessions : session dotfiles-violet-chaton 2026-03-16 (scan VPS + insight utilisateur)
- Patch intermédiaire actif : `secrets-guardian.md` — Pattern OSINT passive (patch 2026-03-16)

View File

@@ -0,0 +1,176 @@
---
name: adr-014-zone-aware-bsi-kerneluser
type: reference
context_tier: cold
---
# ADR-014 — Zone-aware BSI claims + modèle kerneluser
> Date : 2026-03-16
> Statut : actif
> Décidé par : session product-strategist sess-20260316-2115
---
## Contexte
Le schéma BSI (v1.4) déclare `scope` (ex: `agents/`, `todo/brain.md`) mais ne distingue pas
la sensibilité de la zone cible. Un satellite `brain-write` sur `agents/` (kernel) et un satellite
`brain-write` sur `todo/` (instance) sont traités identiquement — même claim, mêmes règles.
Problème : le brain a déjà une hiérarchie de zones documentée dans `product-vision.md`
(zones 0-3) et `architecture.md` (kernel / instance / personnel). Cette hiérarchie
n'est pas connectée au protocole BSI. Résultat : la protection du kernel est implicite
et non-auditée.
Question soulevée : si le brain peut s'auto-éditer (satellites brain-write), qui a le droit
de toucher le kernel ? Tension entre "maître à bord" et "pas brider le système".
---
## Décision
**1. Ajouter `zone` comme champ calculé (inféré) dans le claim BSI.**
`zone` n'est pas écrit manuellement — il est inféré du `scope` au moment de l'ouverture du claim.
Cela évite toute friction sur l'usage courant tout en rendant la sensibilité auditable.
**2. `kerneluser` est un flag implicite owner dans `brain-compose.yml`, pas un champ claim.**
Le propriétaire du brain est toujours kerneluser. Le flag ne restreint pas l'owner —
il protège contre les futurs utilisateurs externes (SaaS, multi-user) qui ne peuvent pas
déclencher de satellite kernel-write sans délégation explicite.
**Règle fondamentale :**
```
Le brain peut s'auto-éditer librement — sous délégation owner.
Un satellite zone:kernel est autorisé si lancé par le propriétaire.
Un satellite zone:kernel lancé par un user externe = BLOCKED, autorisation requise.
```
---
## Mapping zone → scope
```
zone: kernel
agents/ → agents kernel (protégés, lifecycle permanent)
profil/ → specs, invariants, ADR
KERNEL.md → loi des zones
brain-constitution.md → philosophie, invariants Layer 0
brain-compose.yml → feature flags, tiers
scripts/ → rituels, BSI, sync
zone: project
todo/ → intentions, sessions à planifier
projets/ → stack, état, contraintes projets
workspace/ → sessions actives
handoffs/ → contexte inter-sessions
infrastructure/ → configs infra (sensible mais pas kernel)
<repo-projet>/ → SuperOAuth, OriginsDigital, etc.
zone: personal
profil/capital.md → ressources, finances
profil/objectifs.md → buts personnels
progression/ → journal, skills, milestones
MYSECRETS → credentials absolus
```
---
## Champ `zone` dans le claim (inféré, non écrit)
```yaml
# Champ calculé — non écrit dans le claim
# Inféré automatiquement depuis `scope` selon le mapping ci-dessus
# zone: kernel | project | personal
```
| zone | Règle de close | Audit requis |
|------|---------------|-------------|
| `kernel` | Tier 3 Orchestrated si domain/pilote, sinon normal | Oui — git blame BRAIN-INDEX.md |
| `project` | Selon close_tier standard | Non |
| `personal` | Tier 2 Validated minimum — jamais sans confirmation | Oui — jamais auto |
---
## Modèle kerneluser
```
kerneluser = propriétaire du brain = celui qui a forké le kernel
Dans brain-compose.yml :
kerneluser: true → ce brain appartient à son owner (défaut : true sur tout brain perso)
kerneluser: false → instance invitée, user externe (futur SaaS)
Règles :
kerneluser: true → peut lancer des satellites zone:kernel sans restriction
kerneluser: false → satellite zone:kernel → BLOCKED, délégation owner requise
```
**Pourquoi `kerneluser: true` est le défaut :**
Chaque brain forké est souverain. L'owner est toujours kerneluser sur son propre brain.
La restriction ne s'active que dans le contexte multi-user futur.
---
## Hiérarchie satellite — kernel vs project
```
Pilote (owner, kerneluser: true)
├── Satellite zone:kernel → modifie agents/, profil/, scripts/
│ Autorisé : owner délègue explicitement (launch = délégation)
│ Interdit : user externe sans délégation
└── Satellite zone:project → modifie todo/, projets/, workspace/
Autorisé : tout utilisateur du brain
Interdit : zone:personal sans confirmation explicite
```
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| `zone` écrit manuellement dans le claim | Friction inutile — inférable mécaniquement depuis `scope` |
| Token BSI séparé (BRAIN_TOKEN_KERNEL) | Redondant avec le modèle de tokens existant dans product-vision — ajouter de la complexité sans valeur |
| Blocage total des satellites zone:kernel | Bride le système — contredit la philosophie "brain peut s'auto-éditer" |
| kerneluser = champ claim | Trop verbeux, trop répétitif — c'est une propriété du brain, pas d'une session |
---
## Conséquences
**Positives :**
- Le brain peut s'auto-éditer (satellites kernel) librement sous délégation owner — zéro friction sur usage solo
- La sensibilité des zones est auditable via `zone` inféré dans les claims
- Protection forward-compatible pour le multi-user SaaS futur — sans changer l'usage actuel
- Cohérence avec zones 0-3 (`product-vision.md`) et 3 couches (`architecture.md`)
**Négatives / trade-offs assumés :**
- `zone` inféré = logique de mapping à maintenir quand le brain évolue structurellement
- `kerneluser: false` n'est pas encore implémenté — c'est une spec forward, pas une feature active
---
## Actions requises
```
1. [x] ADR-014 rédigé (cette session)
2. [x] bsi-schema.md v1.5 — zone documenté comme champ calculé
3. [ ] brain-compose.yml — ajouter champ kerneluser: true (session dédiée kernel)
4. [ ] satellite-boot.md — ajouter vérification zone au boot satellite (BSI-v3-6)
5. [ ] KERNEL.md — documenter la règle de délégation zone:kernel
```
---
## Références
- `agents/bsi-schema.md` — schema claim
- `agents/satellite-boot.md` — protocole satellite
- `profil/product-vision.md` — zones 0-3, tokens, modèle distribution
- `profil/architecture.md` — 3 couches kernel/instance/personnel
- `profil/decisions/001-bsi-locking-optimiste.md` — origine BSI

View File

@@ -0,0 +1,126 @@
---
name: 015-architecture-deux-niveaux-agents-L1-L2
type: decision
context_tier: warm
status: accepted
---
# ADR-015 — Architecture deux niveaux agents : local (L2) vs git-triggered relay (L1)
> Date : 2026-03-17
> Statut : actif
> Décidé par : session brain 2026-03-17
---
## Contexte
Aujourd'hui, tous les agents opèrent en session locale (Level 2) mais le protocole BSI les traite uniformément comme Level 1 : claim créé, commité, pushé avant de travailler. Cette friction est acceptable pour les sessions humaines — elle ancre la session dans le kernel et rend le contexte visible au VPS et aux sessions parallèles. Elle est en revanche un blocage structurel pour les agents automatiques (ambient daemon, agent-review inline, debug ephemere) qui doivent démarrer sans friction.
Deux insights ont émergé lors de la session 2026-03-17 :
1. **Le BSI crée une friction qui bloque l'automatisation locale.** Un agent local qui doit créer un claim, commiter et pusher avant de travailler est un agent qui ne peut pas opérer à la vitesse d'une session.
2. **Git est le bus de coordination naturel.** La transition entre travail local (éphémère) et travail persisté (kernel) passe naturellement par un commit. Git est déjà le mécanisme de versionning, de relay, et de déclencheur.
Note orthogonale validée le même jour : la séparation pay-gate (fonctionnalités monétisées) vs BSI opérationnel (plomberie) est une décision distincte — les endpoints de revenu restent gatés quelle que soit la provenance de la requête.
---
## Décision
Formaliser une architecture à deux niveaux d'exécution agents, avec des protocoles et des infrastructures distincts.
### Level 1 — Git-triggered relay (asynchrone)
- **Trigger :** webhook git (push, PR, commit kernel)
- **Protocole BSI :** complet — claim créé, commité, pushé
- **Artefacts durables :** `decisions/`, `claims/`, `toolkit/`, `audits/`
- **Auth + tier enforcement :** complet, aucune exception
- **Use cases :** agent-review sur PR, deploy agent sur push main, kernel-auditor sur commit kernel
- **Infrastructure requise :** endpoint `POST /webhook` dans brain-engine — **NON CONSTRUIT** (vision future)
### Level 2 — Local fast (synchrone, frictionless)
- **Trigger :** session courante, appel direct `localhost:7700`
- **Protocole BSI :** aucun. Pas de claim. Pas de commit. Pas de push. Log éphémère local optionnel.
- **localhost trust :** endpoints BSI opérationnels (`GET /boot`, `/agents`, `/teams`, `/workflows`, `POST /workflows/create`) — aucune auth requise, aucun tier gate
- **Pay endpoints :** maintenus gatés même en localhost — aucune exception
- **Use cases :** agent-review inline, debug, bact-scribe, workflow-auditor local, ambient daemon notify
- **Infrastructure requise :** helper `_is_localhost()` dans brain-engine — **À CONSTRUIRE**
### Règle de promotion L2 → L1
Un Level 2 qui veut persister son travail dans le kernel fait un commit. Ce commit déclenche le relay Level 1. Git est le seul mécanisme de transition L2 → L1. Il n'y a pas d'autre voie.
### Endpoints jamais bypassed même en Level 2
| Endpoint | Feature | Raison |
|---|---|---|
| `GET /visualize` | pro | génère du revenu |
| `GET /infra` | pro | génère du revenu |
| `PUT /brain/{path}` | pro | génère du revenu |
Ces endpoints sont pay-gated sans exception de provenance.
### Conventions de session
- **Sessions humaines :** Level 1 par convention. Le claim anchor la session dans le kernel, la rend visible aux sessions parallèles et au VPS.
- **Agents locaux automatiques :** Level 2 par défaut. Le boot claim BSI est optionnel — aucune friction imposée.
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| BSI allégé (claim sans push) | Ne résout pas la friction pour les daemons — le commit reste bloquant. |
| Token court-circuit local (token spécial localhost) | Introduit une surface d'auth supplémentaire à maintenir. La confiance localhost sans token est plus simple et plus robuste. |
| Endpoint /local-boot sans auth global | Trop large — expose des endpoints qui devraient rester gatés (pay features). La granularité par endpoint est préférable. |
---
## Vision webhook future (à ne pas perdre)
```
git push
→ Gitea webhook → POST brain-engine/webhook
→ brain-engine parse le payload (branch, files modifiés, author)
→ route vers l'agent relay approprié selon les fichiers touchés :
agents/*.md modifié → kernel-auditor
brain-ui/** → agent-review frontend
brain-engine/** → agent-review backend
claims/*.yml fermé → workflow-auditor
→ agent s'exécute avec contexte complet (diff, commit message, author)
→ résultat commité dans audits/ ou decisions/
```
Ne pas construire avant un use case concret. L'infrastructure webhook L1 est une vision, pas un backlog immédiat.
---
## Conséquences
**Positives :**
- Les agents locaux automatiques peuvent démarrer sans friction BSI
- La distinction est claire : local = éphémère, git = durable
- Git reste la source de vérité — aucune donnée persistée hors kernel sans commit
- Les sessions humaines ne changent pas de comportement (Level 1 par convention)
- Le protocole BSI existant reste intact pour les sessions qui en ont besoin
**Négatives / trade-offs assumés :**
- Une session Level 2 est invisible au VPS et aux autres sessions tant qu'elle ne commit pas
- Le helper `_is_localhost()` doit être implémenté dans brain-engine avant de pouvoir bénéficier des endpoints frictionless
- La ligne pay-gate / BSI-opérationnel doit être maintenue explicitement dans le code — risque de dérive si non documentée
---
## Références
- Fichiers concernés :
- `brain-engine/server.py` — tier enforcement, endpoints à séparer par niveau
- `CLAUDE.md` — boot claim BSI, à qualifier "optionnel pour les sessions Level 2"
- `brain-constitution.md` — Layer 0, invariants de session
- `brain-compose.yml` — modes session, permissions BSI par mode
- Sessions où la décision a émergé :
- Session 2026-03-17 — friction BSI agents locaux + git comme bus de coordination
- ADR-014 — zone-aware BSI, kerneluser (contexte parent)

View File

@@ -0,0 +1,96 @@
---
name: 016-bsi-canal-push-garanti-now-md
type: decision
context_tier: warm
---
# ADR-016 — BSI : canal de push garanti via brain/now.md
> Date : 2026-03-17
> Statut : actif
> Décidé par : brainstorm session brain
---
## Contexte
Le BSI (Brain Session Index) a été conçu comme outil de synchronisation de sessions parallèles via des claims git-committés. À l'usage, plusieurs problèmes ont émergé :
1. **Jamais vraiment mandatory** — des sessions entières tournaient sans claim, sans que personne s'en rende compte
2. **Temporal inference bug** — les timestamps des claims amenaient Claude à inférer l'heure de la journée et suggérer d'arrêter de travailler, fragmentant la journée en sessions multiples inutiles
3. **Pull probabiliste, pas push garanti** — après migration vers MCP, `brain_boot()` trouve le contexte via RAG sémantique, mais seulement si la query matche. Un claim important peut passer invisible
4. **Git = mauvais outil pour l'async** — un commit est une opération lourde et synchrone. Pour de l'état async temps réel, git est le mauvais primitif
**Ce que le BSI faisait vraiment bien**, malgré tout : permettre à Claude d'absorber l'état courant sans que l'utilisateur ait à réexpliquer "où on en était". C'était un canal de push context async.
---
## Décision
Le canal de push garanti est assuré par **`brain/now.md`**, un fichier unique écrit par Claude en fin de session via `brain_write()`, lu en **slot prioritaire** dans `brain_boot()` — avant le RAG, lecture directe, toujours présent.
**Migration BSI → MCP :**
| BSI claim type | Remplacé par |
|----------------|-------------|
| Sprint actif | `brain_workflows()` |
| Décision prise | `brain_decisions()` + ADRs formels |
| Focus du moment | `brain_focus()` |
| Contexte général | `brain_boot()` RAG |
| État live session | `brain/now.md` (nouveau) |
---
## Contenu de brain/now.md
```markdown
# Now — <date>
## Étape courante
<sprint + step + ce qui était en cours>
## Services actifs (connus)
<ports, pm2, ce qui tournait>
## Prochain action immédiate
<une ligne, la prochaine chose à faire>
## Contexte implicite
<variables importantes qui ne sont pas dans focus.md>
```
Écrit par Claude en fin de session. Overwrite systématique (`current`). Non archivé — l'historique est dans git.
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| Session snapshot stocké | Stale avec le temps — invalide après quelques jours sans session |
| Continuer BSI git | Git = sync lourd, pas adapté à l'async multimodal |
| RAG seul (brain_boot actuel) | Pull probabiliste — un push important peut ne pas remonter |
| brain_state() auto-généré | Dérive l'environnement mais pas l'intention ni l'étape courante |
---
## Conséquences
**Positives :**
- Push garanti : Claude lit `now.md` à chaque boot, sans exception
- Zéro temporal inference — now.md ne contient pas de timestamp d'activité
- Léger : un seul fichier, overwrite systématique
- Compatible avec le modèle multimodal — toutes les sessions lisent la même source
**Négatives / trade-offs assumés :**
- Dépend de Claude pour l'écriture — si la session se termine abruptement, now.md n'est pas mis à jour
- Contenu subjectif (ce que Claude "pensait" de l'état) — pas dérivé du système réel (c'est brain_state() qui couvre ça)
---
## Références
- Fichiers concernés : `brain-engine/mcp_server.py` (brain_boot + brain_write), `brain/now.md` (à créer)
- ADR-015 : architecture deux niveaux L1/L2
- ADR-017 : brain_state() environnement dérivé Layer 2
- Sessions où la décision a émergé : session brain 2026-03-17 — modèle d'utilisation brain

View File

@@ -0,0 +1,92 @@
---
name: 017-brain-state-layer2-environnement-derive
type: decision
context_tier: warm
---
# ADR-017 — brain_state() : environnement fondamental dérivé, Layer 2
> Date : 2026-03-17
> Statut : actif
> Décidé par : brainstorm session brain
---
## Contexte
À chaque recontextualisation après compactage, Claude redemande des informations fondamentales sur l'environnement de l'utilisateur : quels services tournent, quels ports, quelle machine, quel état infra. Ces "variables implicites" ne sont ni dans focus.md (direction) ni dans les ADRs (décisions) ni dans now.md (étape courante).
Un snapshot stocké ne résout pas le problème — il devient stale avec le temps. Si brain-mcp est fixé 3 jours après qu'un snapshot a capturé "brain-mcp 401 en cours", le snapshot est désormais incorrect et nuisible.
La solution : **dériver l'état depuis les sources vivantes à chaque appel**, jamais stocker.
---
## Décision
`brain_state()` est un outil MCP qui **dérive** l'environnement fondamental à la demande depuis des sources stables :
- `pm2 jlist` → services actifs (live)
- `git log -1 --oneline` → version brain courante
- Variables d'environnement connues → ports configurés
- Retourne un bloc markdown structuré, jamais mis en cache
**Layer 2 uniquement** — gate `_is_localhost()` sur l'endpoint `/state` de brain-engine. L'inventaire de l'infrastructure ne sort pas du périmètre local.
**Appelé en premier dans `brain_boot()`**, avant les queries RAG — l'environnement frame le reste du contexte.
---
## Contenu retourné
```markdown
## Environnement fondamental
**Machine** : <hostname>
**Brain version** : <git log -1 --oneline>
**Services (pm2)**
| Nom | Status | Port |
|-----|--------|------|
| brain-engine | online | 7700 |
| brain-mcp | online | 7701 |
| brain-key-server | online | 7432 |
**Infra**
- Apache proxy : /mcp/ → :7701, /api/ → :7700
- MCP configuré : oui/non
```
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| Snapshot stocké | Stale — invalide sans prévenir après quelques jours |
| Variables en mémoire Claude | Perdues au compactage |
| Fichier infra.md manuel | Manuel = dérive, pm2 status > fichier statique |
| Pas d'outil dédié | Continue de générer des questions répétitives sur l'environnement |
---
## Conséquences
**Positives :**
- Zéro staleness — toujours frais, dérivé au moment de l'appel
- Élimine les questions "quel port ? quel service tourne ?" après compactage
- Layer 2 gate : l'inventaire infra reste local
- Composable : brain_boot() l'appelle en premier, tout le reste s'appuie dessus
**Négatives / trade-offs assumés :**
- Dépend de pm2 — si pm2 est down, l'état est incomplet
- Layer 2 seulement — pas accessible depuis une session distante (voulu)
---
## Références
- Fichiers concernés : `brain-engine/server.py` (GET /state), `brain-engine/mcp_server.py` (brain_state tool)
- ADR-016 : now.md canal de push garanti
- ADR-018 : migration Rust iterative
- Sessions où la décision a émergé : session brain 2026-03-17

View File

@@ -0,0 +1,72 @@
---
name: ADR-019-session-modes-soft-lock
type: decision
context_tier: cold
---
# ADR-019 — Session modes : soft lock comportemental par déclaration au boot
> Date : 2026-03-17
> Statut : actif
> Décidé par : brainstorm session sess-20260317-1329-boot
---
## Contexte
Sans mécanisme de mode, une session Claude dérive naturellement vers l'exécution technique même quand elle devrait rester en navigation/coaching. Le contexte se pollue, la présence coach se dilue, et c'est l'humain qui porte la charge de garder le cap.
Trois alternatives ont été évaluées : mode dans le memory-global (permanent), mode dans les claims BSI (inter-sessions), mode déclaré à la session.
---
## Décision
Les modes sont déclarés au démarrage d'une session Claude via un mot-clé, chargent un fichier `modes/<nom>.md`, et constituent un **soft lock** : Claude refuse d'exécuter ce qui dépasse le périmètre du mode et redirige vers une session dédiée.
**Déclaration :** mot-clé dans le premier message (`brain +navigate`, `brain +kernel`, etc.)
**Fichiers :** `Brain/modes/<nom>.md` — chargés au boot si le mot-clé est détecté par helloWorld
**Enforcement :** soft — Claude dit "ouvre une autre session pour ça", il n'exécute pas
**Périmètre :** intra-session uniquement — pas de visibilité cross-sessions
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| Mode dans `memory-global/` | Permanent = toujours actif. Un mode est ponctuel, pas identitaire |
| Mode dans claims BSI | BSI = gouvernance fichiers. Ne gère pas le comportement Claude. Mauvais périmètre |
| Mode dans `~/.claude/session-role/` | Local machine, non tracké, pas distributable avec le brain |
---
## Conséquences
**Positives :**
- Contexte préservé — pas de pollution par des tâches hors périmètre
- Présence coach maintenue sur la durée
- Livrable immédiatement — pas de dépendance BSI
- Distributable avec le brain-template
**Négatives / trade-offs assumés :**
- Soft lock uniquement — repose sur la discipline Claude, pas un mécanisme dur
- Pas de visibilité cross-sessions (hard lock = futur, attend évolution BSI)
- Nécessite que helloWorld détecte le mot-clé et charge le bon fichier mode
---
## À construire
- `Brain/modes/` — répertoire des modes
- `Brain/modes/brain-navigate.md` — premier mode à forger
- Modification de `agents/helloWorld.md` — détection mot-clé + chargement mode
- `brain-template/modes/` — mode example dans le template
---
## Références
- Fichiers concernés : `Brain/modes/` (à créer), `agents/helloWorld.md`, `memory-global/coach_presence.md`
- Sessions : `sess-20260317-1329-boot`
- Lexique : `profil/lexique.md` — distinction type de session / mode

View File

@@ -0,0 +1,81 @@
---
name: ADR-020-presence-layer-live-states
type: decision
context_tier: cold
---
# ADR-020 — Presence layer : live-states.md comme registre inter-sessions
> Date : 2026-03-17
> Statut : actif
> Décidé par : brainstorm session sess-20260317-1329-boot
---
## Contexte
Sans visibilité inter-sessions, l'humain porte manuellement l'état de toutes les sessions parallèles. Il sait qui travaille sur quoi, qui est bloqué, qui attend une décision. C'est épuisant et ça force la sérialisation de ce qui pourrait être parallèle.
BSI existe mais gouverne les fichiers, pas l'état des sessions Claude. Les signaux BSI sont lents (file-based, asynchrones). Il manque un layer de présence temps-réel queryable depuis n'importe quelle session.
---
## Décision
Un fichier unique `workspace/live-states.md` sert de registre de présence inter-sessions. Chaque session écrit son état à l'open et le met à jour au close. La session navigate le lit pour avoir une vue d'ensemble sans lire les contextes individuels.
**Clé unique :** `sess_id` (BSI claim ID) — jamais le nom du projet.
**8 champs :** `sess_id`, `project`, `doing`, `status`, `needs`, `priority`, `team`, `blocking`, `context`, `updated`
**Remplissage :** session-orchestrator steps 6.5 (open) + 7 (close)
**Lecture :** session navigate, session-orchestrator, brain-state-bot (futur)
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| Signaux BSI pour la présence | BSI = gouvernance fichiers. Présence = état sessions. Périmètres distincts |
| Entrée par `project` comme clé | Collision si plusieurs sessions sur le même projet |
| Intégré dans BRAIN-INDEX.md | BRAIN-INDEX = claims BSI. Mélanger présence et gouvernance = drift |
---
## Tiers d'automatisation (brain-state-bot)
| Tier | Remplissage | Champs auto-dérivés |
|------|-------------|-------------------|
| `free` | Manuel (session ou humain) | `sess_id`, `project`, `updated` depuis claims BSI |
| `pro` | Bot bash (cron 10min) | + `blocking[]`, `team[]`, `priority:critical` |
| `owner` | phi-3-mini enrichi | + `context` synthétisé, détection blockers implicites, alertes navigate |
---
## Conséquences
**Positives :**
- L'humain ne porte plus l'état dans sa tête
- Navigate lit 20 lignes au lieu de 5 contextes — ~90% de réduction token
- Workflow sans humain possible : session-orchestrator lit `needs`, route vers navigate ou agent
- Distributable dans le brain-template (fichier vide + spec)
**Négatives / trade-offs assumés :**
- `needs` ne peut pas être dérivé automatiquement — toujours écrit par la session
- En tier free, le bot n'existe pas — remplissage manuel ou par session-orchestrator uniquement
- Stale si session-orchestrator ne tourne pas correctement au close
---
## À construire
- `brain-state-bot` — spec dédiée (étape 5)
- Stale detection : `updated` > 2h + `status: progressing` → bot passe à `idle`
- Archive : `status: closed` + 24h → `workspace/live-states-archive/`
---
## Références
- Fichiers : `workspace/live-states.md`, `wiki/live-states.md`, `agents/session-orchestrator.md`
- Sessions : `sess-20260317-1329-boot`
- ADR lié : ADR-019 (session modes — orthogonal, même session)

View File

@@ -0,0 +1,120 @@
---
name: 021-scope-drift-guardrails-session-permissions
type: decision
context_tier: warm
status: actif
---
# ADR-021 — Guardrails de scope : permissions implicites par type de session
> Date : 2026-03-17
> Statut : actif
> Décidé par : brainstorm navigate + coach (session 2026-03-17 ~22h)
---
## Contexte
### Le diagnostic
Le brain est une solution à un problème d'interface fondamental :
**Claude n'a pas de mémoire persistante native, et aucun mécanisme natif n'empêche le scope drift.**
Sans guardrails, chaque session fait ce qu'elle veut :
- `brain.md` grossit à chaque session (83k chars atteints) parce que rien ne discipline les writes
- Une session-work charge du contexte navigate par accident
- Un agent répond sur un domaine hors de son scope parce que rien ne le bloque
- L'humain porte seul la discipline de scope — et c'est insoutenable
### Le pattern identifié
Toute l'architecture brain (L0/L1/L2, session-*.yml, modes/, BSI) est une tentative de **compenser l'absence de guardrails natifs** entre l'humain, Claude, et le contexte chargé.
Les fichiers allègent la charge contextuelle. Mais ils ne font pas respecter le scope.
### La friction comme signal
Quand une solution augmente la friction humaine (ex : "pense à lancer le script après la session"), c'est un signal que le guardrail est au mauvais endroit. Un guardrail qui demande à l'humain de se souvenir — c'est une convention fragile, pas un guardrail.
### Les deux niveaux manquants
| Niveau | Ce qu'on a | Ce qui manque |
|---|---|---|
| **Contextuel** | session-*.yml, L0/L1/L2, audits | header auto-dérivé (brain-todo-header) |
| **Comportemental** | modes/brain-navigate.md (soft lock) | permissions implicites par type → settings.json |
---
## Décision
**Les permissions d'une session Claude sont déterminées par son type déclaré au boot — pas par la bonne volonté de l'humain ou de Claude.**
Deux nouvelles sessions en priorité absolue :
### `session-edit-brain` — sudo brain
- Accès complet en écriture sur tout le brain
- Chargée explicitement quand l'humain veut modifier la structure du brain lui-même
- Toutes les actions brain autorisées sans confirmation supplémentaire
- Scope : brain meta-work (agents, ADRs, sessions, kernel)
- Permissions settings.json : writes brain/* autorisés
### `session-kernel` — lecture seule kernel
- Interdit toute modification des fichiers identifiés comme kernel
- Kernel = PATHS.md, KERNEL.md, CLAUDE.md, brain-compose*.yml, agents/coach*.md
- Toute tentative de write kernel → refus explicite + redirection vers session-edit-brain
- Protège l'identité cognitive du brain contre la dérive accidentelle
---
## Principe directeur
> **Le type de session = contrat de permissions, pas une déclaration d'intention.**
Ce n'est pas "dans cette session on essaie de ne pas modifier le kernel". C'est "dans cette session, modifier le kernel est techniquement impossible sans escalade explicite".
La discipline ne doit pas reposer sur la mémoire de l'humain ou la bonne volonté de Claude — elle doit être dans la configuration.
---
## Alternatives considérées
| Option | Raison du rejet |
|--------|----------------|
| Soft lock comportemental seul (ADR-019) | Insuffisant — Claude peut "oublier" en session longue ou post-compaction |
| Convention documentée | Fragile — repose sur la discipline humaine |
| Confirmation à chaque action sensible | Trop de friction — inverse du problème |
---
## Conséquences
**Positives :**
- Scope drift impossible par construction pour les sessions typées
- L'humain n'a plus à porter la discipline de scope dans sa tête
- Les sessions deviennent des contrats exécutables, pas des intentions
- brain.md et le kernel ne peuvent pas grossir accidentellement hors session-edit-brain
**Négatives / trade-offs assumés :**
- Requiert un audit granulaire L0/L1 pour que chaque session-*.yml soit précis (déjà PRIORITÉ 1)
- La configuration settings.json devient un artefact critique à maintenir
- session-edit-brain = session à ouvrir explicitement → légère friction intentionnelle (c'est le point)
---
## Livrable immédiat
1. `profil/contexts/session-edit-brain.yml` — L0/L1 write-all brain
2. `profil/contexts/session-kernel.yml` — L0/L1 read-only kernel + soft lock write
3. Audit kernel : identifier les fichiers protégés (liste dans KERNEL.md)
4. Lier audit granulaire L0/L1 (PRIORITÉ 1) à la définition des permissions par session
---
## Références
- Sessions où la décision a émergé : navigate 2026-03-17 ~22h
- ADR-019 — session modes soft lock (précurseur comportemental)
- ADR-020 — presence layer live-states
- `todo/brain.md` — PRIORITÉ 1 audit granulaire
- `profil/contexts/session-navigate.yml` — premier exemple de session avec soft lock
- `modes/brain-navigate.md` — soft lock comportemental existant

View File

@@ -0,0 +1,86 @@
---
name: 022-open-core-distribution-model
type: decision
context_tier: warm
status: actif
---
# ADR-022 — Modèle de distribution open-core
> Date : 2026-03-17
> Statut : actif
> Décidé par : brainstorm navigate + coach (session 2026-03-17 ~23h)
---
## Contexte
Brainstorm sur la vision produit et la frontière kernel/locked.
Question centrale : distribuer le kernel seul, ou kernel + capacité de distillation ?
---
## Décision
**Modèle open-core :**
- **Kernel** = forkable, open, chaque fork = instance propriétaire
- **Features avancées** = locked derrière `keys.tetardtek.com` (PayByFeature existant)
- **MCP** = pont entre distribution OS (fork/own) et runtime BaaS (instance expose un service)
---
## Frontière free / paid
| Free (kernel) | Paid (PayByFeature — clé) |
|---|---|
| Structure brain + agents | Distillation engine |
| Coach de base (présence, pousse à progresser) | Coach complet (milestones, progression tracée) |
| Sessions typées + mémoire globale | BACT / SYMSEC |
| Agents métier | Multi-session orchestration + ambient layer |
| | Brain qui grandit seul (brain-state-bot, phi-3-mini) |
---
## Modèle de distribution
```
git clone brain-template → kernel propre (pas l'instance perso)
claude → CLAUDE.md boot → Claude IS l'onboarding (pas de wizard)
keys.tetardtek.com → gate PayByFeature sur features locked
```
Chaque fork = instance propriétaire. L'humain possède son brain.
Sans clé = rails sans le train. Utilisable, pas transformatif.
---
## Le vrai différenciateur
Pas les agents qui travaillent ensemble (commodity — n8n, Make font ça).
**La continuité de contexte dans le temps.** Un brain qui connaît qui tu es,
trace ta progression, te pousse à grandir. Ça ne se reproduit pas sans la clé
et sans avoir accumulé du contexte sur la durée.
---
## Ce qui n'est PAS encore prêt
- `brain-template` incomplet : mélange instance perso + kernel distribuable
- Séparation perso/kernel à finaliser avant toute distribution publique
---
## Cible
N'importe quel dev qui ouvre le repo dans Claude Code comprend en 20 minutes.
Claude = l'onboarding. `git clone + claude` = installation complète.
Horizon distribution : post-Avril 2026 (brain still owner-only jusqu'au 2026-04).
---
## Références
- ADR-006 (BaaS) — compatible, pas exclusif
- ADR-007 (distribution kernel) — prérequis
- `brain-key-server` + `keys.tetardtek.com` — gate existant
- `brain-template/` — repo distribution (à compléter)

View File

@@ -0,0 +1,57 @@
---
name: 024-source-verite-session-state
type: decision
context_tier: warm
status: actif
---
# ADR-024 — Source de vérité session state
> Date : 2026-03-17
> Statut : actif
> Décidé par : brainstorm navigate + coach (session 2026-03-17 ~23h)
---
## Décision
Trois systèmes coexistent — scopes distincts, aucun doublon.
| Système | Scope | Analogie | Source de vérité pour |
|---------|-------|----------|-----------------------|
| `claims/*.yml` | Historique | git log | "Quelles sessions ont existé ?" — audit trail, gouvernance |
| `workspace/now.md` | Contexte bridge | Sticky note | "Qu'est-ce que la prochaine session doit savoir ?" |
| `workspace/live-states.md` | Présence live | Tableau blanc | "Qu'est-ce qui tourne EN CE MOMENT ?" |
---
## Priorité de lecture au boot
```
1. now.md → toujours présent, toujours frais — prioritaire
2. live-states.md → si brain-state-bot actif (tier pro+)
3. BSI claims → gouvernance uniquement, jamais contexte boot
```
---
## Règle d'écriture
- `now.md` : écrit par Claude à chaque fermeture de session — écrase le précédent
- `live-states.md` : écrit par session-orchestrator (open/close) + brain-state-bot
- `claims/*.yml` : écrit une fois à l'open, fermé au close — jamais modifié après
---
## Conséquence
BSI claims n'est plus la source de vérité contextuelle au boot.
`now.md` prend ce rôle. Claims = audit, pas contexte.
---
## Références
- ADR-016 (now.md push garanti)
- ADR-020 (live-states présence layer)
- ADR-001 (BSI locking optimiste — gouvernance)

View File

@@ -1,51 +0,0 @@
# ToDo — <Domaine ou Projet>
---
<!--
Convention des statuts :
⬜ à faire
🔄 en cours
⏸ en attente d'un prérequis
✅ réalisé (garder 2 semaines, puis supprimer)
⚠️ bloquant / urgent
Convention des fichiers :
Un fichier par projet ou domaine
Une entrée = une session à planifier avec son intention claire
Ordre : ⚠️ urgents en premier, ✅ réalisés en bas
Règle d'or :
focus.md = état actuel (ce qui est fait, ce qui tourne)
todo/ = intentions futures (ce qu'on va faire)
Pas de doublon entre les deux.
-->
---
## ⬜ <Titre de la tâche>
> Planifié : <DATE>
> Agents à charger : `<agent-1>`, `<agent-2>` (ou "aucun" si action manuelle)
> Prérequis : <prérequis si applicable> (ou supprimer la ligne)
**Intention :** <Pourquoi cette tâche — le problème qu'elle résout ou la valeur qu'elle apporte.>
**Ce qu'on veut :**
- <livrable 1>
- <livrable 2>
**Garde-fou :** <ce qu'il ne faut pas faire / les dérives à éviter>
---
<!--
Template section ✅ (copier quand une tâche est réalisée) :
## ✅ <Titre de la tâche>
> Planifié : <DATE>
> Réalisé : <DATE>
**Réalisé :** <ce qui a été fait — court>
-->