OpenComb : Livre Blanc d'Architecture

L'Essaim Confilé & la Propolis

« 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. »

Rédigé le 2026-07-15  ·  Révision Technique  ·  Réf. Code : src/propolis/enclos.rs
Correctif Critique

Le Piège de l'Éphémère : Session-Client & Confinement

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.

« L'abeille s'éveillait amnésique à chaque battement d'ailes. Privée de ses sessions passées sous ~/.claude/sessions/, elle devait recréer un identifiant de conversation, allongeant le temps de vol et doublant le coût cognitif du démarrage. »

Résolution Structurelle

  • Redirection du HOME : Dans src/propolis/enclos.rs, la variable d'environnement HOME du sous-processus confiné est redirigée vers un dossier persistant et isolé au sein même de la ruche, à savoir <ruche>/.home.
  • Montage d'Authentification Minimal : Seuls les fichiers de jetons indispensables (~/.claude/.credentials.json et ~/.claude.json) sont montés en lecture seule vers cet emplacement confiné.
  • Élimination du tmpfs HOME : Le dossier personnel de l'hôte n'est plus monté en tant que 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()),
];
Amélioration Confinement

Le Moissonnage des Ombres : Le Reaper de PIDs

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.

Résolution par Moissonnage

  • Intégration de Tini : Si /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.
  • Option --init sous Podman : Pour le mode 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());
Chantier Architecture

L'Isolation des Ouvrières Python (Swarmlets)

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.

Déportation de l'Exécution

  • Lancement Hors-Processus : L'exécution PyO3 intra-processus est remplacée par la déportation des scripts Python dans des sous-processus python3 dédiés.
  • Parois Physiques Appliquées : Chaque Swarmlet Python reçoit un ContratDeLancement propre géré par la Propolis (Bubblewrap ou Podman selon la configuration). Les jetons et clés ne quittent jamais le daemon central.
Garantie Réseau

Le Filtrage Actif de l'Egress

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.
Régulation Narrative

L'Empoisonnement du Soleil

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 :

« L'erreur HTTP 429 devient : "La brume s'épaissit sur la vallée, le Soleil s'empoisonne de reflets d'argent." L'abeille comprend qu'elle doit entrer en sommeil (sérialisation de son état cognitif) pour laisser le ciel se purifier, évitant de gaspiller l'énergie de la ruche. »
Sécurité Avancée

Le Sceau & la Teinte de Provenance

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.

Gestion Contexte

L'Horizon : La Cascade de Réduction

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).