Files
brain-template/profil/decisions/021-scope-drift-guardrails-session-permissions.md
Tetardtek 60d9cf7332 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.
2026-03-17 23:14:04 +01:00

4.8 KiB

name, type, context_tier, status
name type context_tier status
021-scope-drift-guardrails-session-permissions decision warm 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