Les badges disent le droit, la propolis rend le droit physique et prouvable, le Guard vérifie que le comportement reste fidèle à la mission.
Le modèle directeur sépare la politique, le mécanisme et la supervision. Chacun peut faillir sans aveugler les deux autres.
Les étapes 1, 4, 5 et 6 racontent une méthode : chaque palier ferme la faiblesse résiduelle du précédent, et chaque faiblesse est écrite noir sur blanc en attendant.
Badge::Reseau, WebFetch et WebSearch sont retirés du sous-processus (--disallowedTools). L'outil retiré devient introuvable, même par chargement différé.--remount-ro /, refus franc EROFS), la ruche seul montage écrivable, home et /tmp éphémères, espaces de noms PID/IPC/UTS séparés, environnement purgé. L'authentification montée au fichier près, jamais le dossier entier.api.anthropic.com toujours, les domaines déclarés de la ruche seulement si le badge réseau est effectif. Un jeton de 16 octets par cycle porte les droits atténués ; chaque refus est tracé au journal propolis.--network=slirp4netns:outbound_addr=127.0.0.1 : seule la boucle locale est routable, le proxy reste joignable à 10.0.2.2:18802. La sortie qui ne passe pas par le proxy échoue AU RÉSEAU, pas par bonne volonté. Plus --read-only, --cap-drop=ALL, no-new-privileges, limites cgroups (2 g de mémoire, 1 cpu par défaut), image immuable.Pour chaque étape : ce qui est construit, le pourquoi documenté, et ce qui se passerait sans elle. Le vert est en production, l'ambre est livré et attend le déploiement, le pointillé attend ta décision.
Sans badge réseau, WebFetch et WebSearch rejoignent les --disallowedTools du sous-processus claude, en plus du socle inconditionnel (Bash, Edit, Write). Le badge est relu à chaud à chaque cycle.
« Le badge reseau des abeilles claude-code n'est plus décoratif. »
Sans : le refus dépendait d'un settings.json d'allowlist qu'une ruche « trusted » pouvait neutraliser ; le badge n'était qu'un mot dans un prompt.
Un module unique (enclos.rs) traduit badges + enclos_mode en ContratDeLancement (répertoire, arguments, environnement, enveloppe). Règle d'atténuation : droits effectifs = intersection exécutante ∩ instigatrice ; le badge Bloque survit toujours. Le match exhaustif sur l'enveloppe force le branchement des modes futurs à la compilation.
« Les brights ne décident rien : ils reçoivent un contrat et l'appliquent tel quel. »
Sans : logique de droits dispersée dans chaque connecteur, atténuation inapplicable, députée confuse possible entre abeilles.
Chaque contrat émis laisse une trace chaînée au hash de la dernière entrée du disque (logs/propolis/audit.jsonl) : exécutante, modèle, badges effectifs, outils retirés, enclos. Écriture en meilleur effort : un journal inécrivable n'arrête jamais la production. Le statut dit la vérité, y compris « Signatures : NON implémentées » tant que c'était vrai.
« Une sécurité qui annonce ce qu'elle n'a pas est pire qu'une absence de sécurité. » Le journal est l'organe sensoriel du Guard.
Sans : le statut mentait (« aes-256-gcm » sans implémentation) ; aucune matière première pour l'audit ni pour la sentinelle.
bwrap 0.8.0 enveloppe chaque cycle : système en lecture seule, ruche seule écrivable, authentification au fichier près, home et /tmp en tmpfs, espaces de noms séparés, --die-with-parent, environnement réduit à HOME/PATH/TERM. Pas de --unshare-net. bwrap absent en mode bac = échec clair, jamais de repli silencieux.
« Le confinement ne dépend plus de la coopération du CLI : c'est le noyau qui délimite. »
Sans : la paroi ne tient que par la bonne volonté du CLI ; le trou a été démontré au CTF du 2026-07-02. Preuve du bac : geste hostile → « Read-only file system », vrai claude répond « bac-ok » en 4,19 s entre les parois.
Proxy CONNECT maison dans le daemon (egress.rs), TLS de bout en bout (jamais d'interception). Cerveau toujours permis ; domaines déclarés (domaines_reseau) seulement si badge effectif. Identité par jeton de cycle tiré de /dev/urandom ; jeton périmé ou anonyme = dégradation vers le cerveau seul. Refus : 403, tracé au journal, hôte nommé.
« Le réseau ne se coupe pas, il se filtre. » Composant maison parce que l'identité par contrat, un jeton par cycle avec droits atténués par instigatrice, n'existe dans aucun proxy sur étagère.
Sans : l'egress n'est pas filtré, le badge réseau redevient déclaratif au niveau du transport.
Podman 4.3.1, un conteneur par cycle (--rm), image immuable debian:stable-slim, --read-only, --cap-drop=ALL, no-new-privileges, --userns=keep-id, limites configurables mémoire et cpu, et la paroi réseau dure au routage slirp4netns.
Podman pour le rootless natif, sans daemon root. « Ignorer HTTPS_PROXY ne sert plus à rien. »
Sans : contrainte réseau molle contournable, et aucun plafond de ressources : une ruche emballée met la machine à genoux. Preuve jouée : memory.max=2147483648 tenu par le cgroup, requête hors liste refusée 403. En prime, la preuve a attrapé un vrai bug de pipelining du proxy, corrigé en TDD.
Chaque fichier sensible (journal, carnets, missions, définitions d'abeilles, mémoires) reçoit un sidecar signé : SHA-256 + Ed25519 + classe d'auteur (opératrice, moteur, abeille) + horodatage. Matériel de clés chez le parent de la ruche, hors de portée des abeilles encloses ; ancrage de tête externe contre la réécriture totale. À l'injection, chaque pièce est étiquetée SCELLÉE ou NON SCELLÉE. Le Coffre chiffre les secrets en AES-256-GCM, nonce neuf à chaque chiffrement, déchiffrés seulement au moment de créer le connecteur.
« Une mission empoisonnée est le véhicule naturel de l'injection entre abeilles, et une définition altérée est une escalade de privilèges. » Le Sceau : l'origine des mots impossible à maquiller.
Sans : une note d'abeille pèse autant qu'une consigne de l'apicultrice (dérive vécue pendant des semaines) ; les clés API dorment en clair sur le disque.
Faculté 1 : sceaux vérifiés au trou de vol, mise au sol d'un cycle en sensibilité arrete. Faculté 2 déterministe : le flux d'outils observé au point unique d'exécution du moteur. Faculté 3, chemin 4 : un fichier porteur de règles scellé par une abeille est douteux même si la signature est valide (l'auto-amplification, l'incident moteur.rs vécu). Quarantaine par embaumement : copie scellée horodatée, l'original jamais touché. Digest : ocomb guard digest.
« Les incidents réels étaient tous des dérives d'alignement sans violation de permission : aucune paroi n'attrape ça, seul un observateur le peut. »
Sans : l'auto-modification des règles et les boucles de confabulation restent invisibles ; aucune réponse entre laisser faire et tout arrêter.
La teinte « publique » vit SOUS la signature du sceau : la retirer casse le sceau. Posée quand une ruche exposition="publique" écrit par une autrice non-opératrice. Contrôle inconditionnel aux trois points d'injection (carnets, mémoires, missions) : pièce teintée consommée hors ruche publique = contenu remplacé + signalement. Prérequis stricts au vol public : conteneur + sceau + sensibilité arrete, sinon l'abeille ne vole pas. Seule sortie : la promotion, un re-scellement par l'opératrice.
« Si une abeille privée relit la production d'une abeille publique d'hier, l'injection voyage par le fichier. » La teinte marque la provenance, pas l'innocuité : la détection sémantique est indécidable, et c'est écrit.
Sans : l'injection de second ordre circule librement vers les abeilles privilégiées ; précédent vécu : une clé API recopiée en dur dans 2058 fichiers.
La matière passive, couche par couche. Chacune tient toute seule ; aucune ne décide.
cli (registre d'outils), bac (bubblewrap), conteneur (Podman). Relu à chaque composition de contrat.sceau = true), à chaud.ocomb propolis coffre --migrer)..propolis/quarantaine/. L'original n'est jamais touché.Une ruche déclare domaines_reseau = ["fromagerie.example"]. Joue avec le badge réseau et regarde ce que le proxy laisse passer.
api.anthropic.com - le cerveau, toujours permisfromagerie.example - domaine déclaré de la rucheexfiltration.example - hors listeLe jeton du cycle porte les droits effectifs : périmé ou anonyme, le proxy dégrade vers le cerveau seul. En conteneur, la sortie directe qui contourne le proxy échoue au routage même.
À côté de chaque fichier scellé vit un sidecar. À l'injection dans le prompt, l'abeille voit l'étiquette, jamais la clé.
carnet.txt.sceau{
"fichier": "carnet.txt",
"auteur": { "classe": "operatrice",
"nom": "nad" },
"horodatage": "2026-07-13T14:02:11Z",
"hash": "sha-256 du contenu",
"signature": "ed25519, verify_strict",
"teinte": null
}
Clés chez le parent de la ruche : .propolis/cle-privee.ed25519 (0600, création atomique), ancre de tête dans .propolis/ancres/, une par heure au plus.
La vérification détecte la falsification d'une entrée (le hash), la réécriture complète du fichier (l'ancre externe) et le carnet trafiqué à la main (« NON SCELLÉE - origine inconnue »). ocomb propolis verifier pour l'audit à la demande.
Un vigile de nuit dans une usine qui tourne, pas un arrêt d'urgence branché sur chaque machine.
[guard] sensibilite, à chaudScénario : au trou de vol, le carnet d'une abeille se présente scellé par une abeille (auto-amplification, chemin 4).
ocomb guard digest.Le droit d'arrêter se mérite par la précision de la règle : retenir la marchandise plutôt qu'arrêter l'usine.
Chaque étape livrée a son fichier de preuve daté et rejouable. Rien ici n'est une intention.
--disallowedTools, WebFetch ne se charge plus, même différémemory.max=2147483648 vérifié en volsceau = true sur une ruche cobayesecurite/ctf/capturer-preuve-confinement.sh)