2026 — Plugins OpenClaw : fail-closed et manifeste obligatoire sur une passerelle Mac physique distant 7×24 — openclaw doctor, interrupteurs ACP dispatch et runbook de retour arrière contrôlé (extraits grep + FAQ)
Ingénieurs plateforme et sécurité qui exploitent un Mac physique distant comme passerelle sans opérateur savent que chaque plugin est une dépendance d’approvisionnement : une liste blanche contournée peut exécuter des accès réseau ou fichiers non déclarés à 3 h du matin. Cet article combine manifeste obligatoire (pas de manifeste conforme, pas de chargement) et fail-closed (échec de validation = refus d’exécution plutôt que dégradation silencieuse vers l’autorisation). Vous obtenez qui doit adopter quelle posture, deux matrices de décision, un runbook en sept étapes, des extraits grep prêts à coller et une FAQ. Pour le poste distant et l’hôte d’extensions, voir Cursor / VS Code Remote SSH vers Mac physiques multirégions ; pour le choix de région d’hébergement, comment choisir la région de son serveur Mac cloud en 2026.
Introduction et périmètre
Sur un Mac sans tête dans un rack distant, les plugins font partie de la surface d’attaque. Le schéma dominant en 2026 est le manifeste obligatoire (sans manifeste conforme, pas de chargement) plus le fail-closed (validation en échec = refus d’exécution plutôt qu’autorisation silencieuse).
Ce guide transforme cette posture en points de checklist vérifiables par openclaw doctor et en grep attachables à un ticket de changement ; il traite le dispatch ACP (Agent Client Protocol) comme l’interrupteur principal pour qui peut atteindre l’ordonnanceur de plugins. Associez des instantanés pour que le RTO de retour arrière reste dans votre fenêtre de maintenance. Hors périmètre : contrats fournisseurs de modèles ; on suppose que launchd épingle l’utilisateur du service et WorkingDirectory. Croisez ce runbook avec votre procédure de canaux openclaw update et snapshots avant tout durcissement manifeste. Pour aligner SecretRef, openclaw env et LaunchAgent sur le même type de nœud, voir OpenClaw env, SecretRef et LaunchAgent sur Mac physique distant ; pour cadrer RTT, jitter et perte de paquets avant une montée en charge multirégion, voir Mac physique distant multi-régions : validation SLO sans pièges.
Points de friction
- Contrainte : pouvoirs implicites et « ça tourne, on livre ». Des capacités telles que
fs,networkousubprocessabsentes du manifeste sont souvent autorisées silencieusement en mode fail-open : les audits ne peuvent pas prouver ce qui était permis. - Coût caché : doctor au vert ≠ politique effective.
openclaw doctorcouvre parfois runtime et ports alors que le rechargement à chaud n’a jamais pris les nouveaux drapeaux d’application du manifeste — de l’extérieur, le comportement reste hérité. - Stabilité et audit : retour arrière sans instantanés appariés = fiction. Un fail-closed agressif casse une automation légitime dans la nuit ; sans instantanés config + bundle plugin, on édite du JSON à la main sous astreinte, ce qui viole les SLO 7×24.
Matrices fail-closed × manifeste
Le premier tableau répond à « quelle dureté ? ». Le second relie signaux de changement et vérifications.
| Environnement | Manifeste | Fail-closed | ACP dispatch |
|---|---|---|---|
| Production passerelle 7×24 | Obligatoire | Activé | clientId / espace de travail en liste autorisée uniquement |
| Staging intégration | Obligatoire | Activé (ombre par plugin possible) | Locataire équipe assoupli + JSONL complet |
| Portable développeur | Obligatoire recommandé (miroir prod) | Optionnel désactivé pour itérer vite | Tout ouvert local ou lié à loopback |
| Signal de changement | Action recommandée | Acceptation supplémentaire |
|---|---|---|
| Nouveau plugin ou upgrade majeur | Nœud canary + diff double manifeste | doctor + grep version de schéma déclarée |
| Plus de clients ACP / agents externes | Resserrer liste autorisée et limites de débit | Tracer les étendues plugin par requestId |
| Pic d’erreurs avec refus dans les journaux | Comptage shadow d’abord, puis décision de rollback | Diff fenêtres cinq minutes avant/après rollback |
Checklist d’audit openclaw doctor
Considérez doctor comme la preuve que la politique est réellement chargée — cochez chaque point sur le ticket (mappez les clés vers openclaw.json ou variables d’environnement selon votre distribution).
- Runtime et PATH : Alignés sur l’utilisateur launchd ;
which openclawcorrespond au binaire du plist. - Résolution manifeste : Affiche les racines plugin effectives ; refuse les répertoires sans manifeste lorsque l’application est active.
- Drapeaux fail-closed : Doctor imprime le booléen et le fichier d’origine ; tout WARN est bloquant pour une mise en production.
- ACP dispatch : État de l’interrupteur et cardinalité de la liste autorisée ; liste vide avec dispatch actif doit avertir qu’aucun client ne peut entrer.
- Santé externe : Coupler
curllocalhost avec/ready(si présent) pour éviter « auto-check vert, reverse proxy rouge ».
Interrupteurs ACP dispatch
ACP dispatch désigne ici si les requêtes des clients agents (IDE, CLI, orchestrateurs externes) peuvent entrer dans l’ordonnanceur de plugins. Avec fail-closed, enchaînez valider l’ensemble plugin via manifeste puis utiliser dispatch pour garder la porte d’entrée afin qu’un client compromis ne saute pas directement vers un hook à risque.
JSON illustratif (remplacez les clés par le schéma de votre release avant production) :
{
"plugins": {
"requireManifest": true,
"failClosed": true,
"manifestSchemaVersion": "2026-05"
},
"acp": {
"dispatchEnabled": true,
"allowedClientIds": ["ci-runner-prod", "vscode-workspace-ops"],
"denyByDefault": true
}
}
Alignez allowedClientIds sur OAuth interne ou sujets mTLS, et journalisez le produit cartésien clientId × pluginId en JSONL pour la forensique.
Extraits grep d’acceptation
À lancer depuis votre archive ou espace de travail actif (adaptez les chemins) :
# Drapeaux explicites fail-closed / requireManifest
grep -RniE 'failClosed|fail_closed|requireManifest|require_manifest' \
~/.config/openclaw ./openclaw.json 2>/dev/null
# Chaque répertoire plugin doit porter un manifeste (absent = ne doit pas charger)
find "$OPENCLAW_PLUGIN_ROOT" -maxdepth 2 -type f \( -name 'manifest.json' -o -name 'plugin.yaml' \) | wc -l
# Liste autorisée ACP dispatch : non vide en production
grep -Rni 'dispatchEnabled|allowedClientIds|denyByDefault' ~/.config/openclaw ./openclaw.json 2>/dev/null
Si le premier grep ne renvoie rien, vous êtes probablement encore en fail-open implicite — ne validez pas la production sur la seule mémoire musculaire.
Runbook de retour arrière contrôlé en sept étapes
- Gel : Annoncer la maintenance ; suspendre les tâches cron qui élargissent la surface d’appel.
- Instantané : Archiver en tarball
openclaw.json, arborescences plugin, plists launchd et la sortie stdout de doctor. - Manifestes obligatoires ON : Recharger, vérifier par grep, surveiller les compteurs « refus de chargement ».
- Fail-closed ON : Codes d’erreur uniformes pour capacités non déclarées ; conserver une baseline JSONL sur cinq minutes.
- Resserrer ACP dispatch : Shadow (journalisation seule) d’abord, puis deny-by-default.
- Déclencheur rollback : Si le SLO casse, restaurer les instantanés appariés,
launchctl kickstart, relancer doctor. - RCA : Mettre à jour la checklist grep et le ticket ; planifier le prochain canary.
Chiffres et paramètres réutilisables
- Fenêtre d’observation : Observer au moins une fenêtre glissante de cinq minutes après une modification de politique avant de décider maintien ou rollback — les pics au démarrage ne sont pas des incidents.
- Rétention d’instantanés : Conserver trois révisions de configuration restaurables en production, chacune avec l’empreinte du tarball plugin.
- Rétention audit : Joindre la sortie doctor complète et les captures grep au ticket pendant au moins 30 jours pour les contrôles conformité internes courants.
FAQ
Le manifeste liste des capacités — pourquoi « non déclaré » ?
Comparez le chemin résolu affiché par doctor avec le fichier édité ; surveillez la version de schéma et la casse des champs. Rejouez le même bundle en staging avec journaux de chargement complets si besoin.
Après coupure du dispatch, d’anciennes sessions appellent-elles encore les plugins ?
Cela dépend des files et de l’implémentation : rechargez, abandonnez le travail non acquitté si le SLO le permet, puis fumée en lecture seule sur les chemins critiques.
Fail-closed et mode shadow coexistent-ils ?
Oui — le shadow incrémente des compteurs « aurait refusé » sans changer le statut HTTP ; passez au refus dur une fois les métriques stabilisées.
Édition anglaise : OpenClaw plugins fail-closed & manifest (English).
Synthèse : pourquoi le Mac mini convient à cette charge
La gouvernance des plugins déplace la confiance du savoir tacite vers une politique vérifiable par la machine : le manifeste borne les capacités, le fail-closed fixe la posture à l’échec, le dispatch ACP réduit la surface d’entrée, et doctor plus grep fournissent la chaîne de preuve attendue par l’audit.
Sur macOS, cela s’aligne avec launchd, Unified Logging, Gatekeeper et SIP. Un Mac mini M4 Apple Silicon consomme de l’ordre de 4 W au repos — idéal pour passerelles et sondes 7×24 ; face à des mini-PC au même prix, les longues sessions avec OpenClaw, exporteurs de santé et un runner CI léger sur une même machine physique distante restent en général plus stables.
Si vous voulez exécuter ce runbook sur un nœud hébergé dédié plutôt que du matériel en rack maison, le Mac mini M4 reste en 2026 l’un des meilleurs points d’entrée rapport qualité-prix — obtenir un Mac physique distant et transformer application stricte des manifestes et rollback en procédure répétable.
Besoin d’un Mac distant dédié pour la gouvernance des plugins OpenClaw ?
Nœuds cloud Mac mini conçus pour passerelles 7×24, durcissement des manifestes et retours arrière auditables.