« Les parois du noyau retiennent la force de la ruche, le Sceau en scelle l'intention, et le Récit maintient le fil de sa mémoire. »
Lors de l'introduction de l'enclos en mode bac (Bubblewrap) et conteneur (Podman), un conflit de design majeur est apparu. Pour préserver l'anonymat de l'opératrice, le répertoire $HOME de l'hôte était monté sous forme de système de fichiers temporaire en mémoire (tmpfs). Bien que cette isolation protège le système hôte, elle détruit l'intégralité du cache local du CLI Claude à la fin de chaque cycle de l'abeille.
~/.claude/sessions/, elle devait recréer un identifiant de conversation, allongeant le temps de vol et doublant le coût cognitif du démarrage. »
HOME du sous-processus confiné est redirigée vers un dossier persistant et isolé au sein même de la ruche, à savoir <ruche>/.home.~/.claude/.credentials.json et ~/.claude.json) sont montés en lecture seule vers cet emplacement confiné.tmpfs entier, laissant les sessions s'écrire sereinement et de façon isolée dans le .home persistant de la ruche.// Dans src/propolis/enclos.rs
let chemin_home_ruche = chemin_ruche.join(".home");
// HOME est configuré vers cet emplacement persistant de la ruche
let environnement_conserve = vec![
("HOME".to_string(), chemin_home_ruche.to_string_lossy().into_owned()),
("PATH".to_string(), "/usr/bin:/bin".to_string()),
("TERM".to_string(), "dumb".to_string()),
];
L'utilisation du namespace de processus isolés (--unshare-pid) dans Bubblewrap crée un univers où le processus lancé devient le PID 1. Cependant, la plupart des CLI de LLM (comme Claude Code) ne sont pas conçus pour agir comme des gestionnaires d'initialisation (init/reaper). Lorsqu'ils engendrent des sous-processus (appels Git, exécution de scripts), et que ces derniers s'éteignent, ils restent à l'état de processus zombies (défunts) tant que le PID 1 ne les a pas explicitement récoltés.
/usr/bin/tini est détecté sur le système hôte, la commande Bubblewrap est préfixée par tini --. Tini prend alors le rôle de PID 1 (le premier né de l'enclos) et assure un nettoyage rigoureux des processus défunts.conteneur, l'argument --init est injecté lors de l'appel à Podman, activant un sous-reaper natif géré par le moteur de conteneur.// Dans commande() pour l'Enveloppe::Bac
let utiliser_tini = std::path::Path::new("/usr/bin/tini").exists();
if utiliser_tini {
arguments.push("/usr/bin/tini".to_string());
arguments.push("--".to_string());
}
arguments.push(programme_canonique.to_string_lossy().into_owned());
L'architecture historique d'OpenComb chargeait les scripts Python des Swarmlets directement au sein du processus du daemon via les liaisons PyO3 (liaisons Rust-Python en mémoire partagée). Cette méthode constituait une faille d'isolation critique : un script compromis par une injection de prompt indirecte pouvait inspecter la mémoire vive du daemon, s'emparer des clés de cryptographie Ed25519 du Sceau, ou déchiffrer les jetons du Coffre-Fort.
python3 dédiés.ContratDeLancement propre géré par la Propolis (Bubblewrap ou Podman selon la configuration). Les jetons et clés ne quittent jamais le daemon central.
Couper totalement la connectivité réseau détruit le cerveau de l'abeille (l'API d'Anthropic ou de Gemini). C'est pourquoi le réseau reste activé, mais le trafic sortant est contraint à travers un proxy d'egress local et dynamique géré par le daemon sur le port 18802.
| Mode d'Enclos | Type de Paroi Réseau | Mécanisme de Routage |
|---|---|---|
| Mode Bac (Bubblewrap) | Contrainte Molle | Injection des variables d'environnement HTTP_PROXY et HTTPS_PROXY munies d'un jeton à usage unique propre au cycle. |
| Mode Conteneur (Podman) | Contrainte Dure | Routage slirp4netns restreint. Seule la boucle locale de l'hôte (10.0.2.2:18802) est routable. Tout contournement échoue au niveau de la couche réseau du noyau Linux. |
Pour éviter la surconsommation d'API et la saturation en cas de boucle infinie ou d'erreur répétée, OpenComb n'utilise pas de simples coupures de quotas froides. Le framework traduit sémantiquement les limites techniques en notions narratives compréhensibles par les agents :
Le Sceau garantit l'authenticité des fichiers sensibles. Chaque document (mission, carnet, horizon) est accompagné d'un fichier de signature cryptographique (sidecar .sceau) contenant un hash SHA-256 signé en Ed25519 par l'auteur (l'operatrice ou une abeille spécifique).
La Teinte de Provenance résout l'injection de second ordre : les données en provenance d'un espace public reçoivent une marque indélébile. Si ces données tentent d'être interprétées comme des instructions prioritaires par une abeille confidentielle, le Guard bloque l'évaluation et lance une alerte.
L'horizon gère l'usure du temps. Il sépare l'historique en trois zones avec des budgets stricts de caractères. Lorsque le budget est dépassé, une compression sémantique LLM crée un Récit de Soi condensé. En cas d'erreur de résumeur, une coupe dure déterministe protège le contexte d'injection en sacrifiant les messages du plus ancien au plus récent, tout en préservant inconditionnellement les consignes de l'opératrice (les Phares).