Acceptation de la version du plugin
Un plugin de première partie est accepté pour une version lorsqu’un opérateur peut l’installer par son nom sur un binaire zeroclaw publié, sans chaîne d’outils Rust sur la machine, et peut démontrer que c’est le plugin, et non une fonctionnalité intégrée, qui effectue le travail. Cette page est le guide d’exécution de cette preuve et le modèle de ses éléments de preuve. Elle utilise le plugin de canal Discord comme exemple détaillé. Pour un autre paquet, remplacez son nom, son alias, ses clés requises et ses destinations.
Une exécution ne valide qu’une version de package sur un seul build publié de l’hôte. Elle ne dit rien des autres cibles, des autres versions de l’hôte, ni du comportement sous charge.
Quand l’exécuter
Exécutez-le après la publication de la version et l’apparition de la version du paquet dans le registre, une fois pour chaque version de paquet que la version déclare prendre en charge. Relancez-le lorsque l’un des deux côtés change : une nouvelle version du paquet, ou une version de l’hôte qui modifie l’interface des plugins.
Avant de commencer
- L’artefact. Une archive publiée de la CLI
zeroclawpour une cible 64 bits dont l’hôte de plugins compile des composants.wasm. Vérifiez-la d’abord avec Vérification de l’artefact de publication. Une archive x86_64 Linux dans un conteneur neuf est l’endroit le plus simple pour montrer qu’aucune chaîne de compilation n’a été impliquée. - Une machine vierge. Aucune chaîne d’outils Rust et aucune configuration résiduelle d’une exécution précédente.
- Comptes de test des plateformes. Pour Discord, une application de bot dédiée dans un petit serveur de test, jamais un bot de production, avec Message Content Intent activé et le bot invité (voir le guide de démarrage rapide Discord), ainsi qu’un second compte Discord pour le testeur. Prévoyez de réinitialiser le token du bot une fois l’exécution terminée.
- Un fournisseur de modèle. Tout fournisseur configuré convient. Un fournisseur local scripté rend les réponses de l’agent reproductibles.
- Un fichier de preuves. Copiez le modèle de preuves et remplissez-le au fur et à mesure.
Saisissez le jeton du bot uniquement à l’invite masquée de zeroclaw config set. Ne le placez jamais dans un fichier, sur une ligne de commande, dans l’historique du shell, dans une capture d’écran ni dans les preuves.
1. Consigner l’environnement
command -v cargo rustc || echo "Aucune chaîne d'outils Rust"
sha256sum zeroclaw-<target>.tar.gz
zeroclaw --version
zeroclaw plugin search discord
Enregistrez le nom et l’empreinte de l’archive, la chaîne de version, ainsi que l’entrée de registre résolue par l’installation : son nom, sa version, l’URL de l’archive et sha256.
2. Installer par nom et associer une instance
zeroclaw plugin install discord --channel-alias acceptance --egress declared
zeroclaw config set plugins.entries.zpi1_WyJkaXNjb3JkIiwiY2hhbm5lbCIsImFjY2VwdGFuY2UiXQ.config.bot_token
zeroclaw config set plugins.enabled true
zeroclaw plugin info discord
L’installation affiche la liaison et les hôtes qu’elle a autorisés. plugin info doit indiquer que le paquet se charge sur cet hôte et que la clé d’instance ci-dessus existe. Ensuite, manuellement :
- Ajoutez
plugin.acceptanceauxchannelsd’un seul agent activé ; - Ajoutez un groupe de pairs avec
channel = "plugin.acceptance"dontexternal_peerscontient l’identifiant utilisateur numérique Discord du testeur.
La page Discord montre les deux. Ne configurez aucune table [channels.discord.<alias>] nulle part, puis démarrez le daemon. Conservez une copie de config.toml comme preuve ; ses secrets restent chiffrés.
3. Mettre le plugin à l’épreuve
Suivez le modèle dans l’ordre et consignez ce que vous observez, y compris tout ce qui est inattendu. Les enregistrements de journal nommés ci-dessous figurent dans le journal structuré du démon, que lisent la page Logs du tableau de bord et GET /api/logs (voir Observabilité). Utilisez du texte de message synthétique du début à la fin.
Modèle de preuve
| Revendication | Action | Preuve | Résultat |
|---|---|---|---|
| Installé par nom, sans chaîne d’outils | Étapes 1 et 2 | sortie de command -v, sortie d’installation, entrée de registre, condensat de l’archive | |
| Chargé sur cet hôte | zeroclaw plugin info discord | Son verdict de charge | |
| Le trafic entrant passe par le plugin | Le testeur envoie un message | Un enregistrement channel inbound message avec zeroclaw.channel = plugin.acceptance | |
| Le trafic sortant passe par le plugin | L’agent répond | Enregistrement reply delivered pour plugin.acceptance ; capture d’écran expurgée de la réponse | |
| Le canal intégré ne gérait rien | Lire la sortie de démarrage et /health | La liste des canaux affiche plugin.acceptance et aucun discord.* ; /health liste channel:plugin.acceptance et aucun channel:discord.* ; la copie de la configuration ne contient pas de table [channels.discord] | |
| Contrôle négatif | Définissez channels.plugin.acceptance.enabled sur false, redémarrez, puis envoyez un message | Aucun enregistrement entrant ni réponse ; remettez-le à true et redémarrez avant la ligne suivante | |
| Reconnexion | Couper le réseau de la machine pendant au moins deux minutes, puis le rétablir | Le message suivant reçoit une réponse ; indiquez si le plugin a repris sa session ou en a démarré une nouvelle. | |
| Arrêt | Arrêter le démon | Le processus se termine proprement ; notez le temps que met le bot à s’afficher hors ligne | |
| Destination refusée | Supprimez *.discord.gg de egress_hosts de l’instance, puis redémarrez. | La passerelle ne se connecte pas, le bot reste hors ligne et aucun message entrant n’arrive. Un hôte qui journalise les connexions WebSocket refusées écrit aussi un enregistrement plugin_egress_denied avec transport = websocket, l’hôte refusé et une commande remedy ; la v0.8.6 n’en écrit aucun. | |
| Autorisation restaurée | Rétablissez *.discord.gg et appliquez-le au démon en cours d’exécution avec POST /admin/reload depuis la même machine (voir Remote daemon reload), sans redémarrage complet. Enregistrer la modification, avec zeroclaw config set ou en éditant config.toml, ne suffit pas à la transmettre au démon en cours d’exécution. | Le bot se reconnecte ; notez le temps que cela a pris | |
| Expéditeur refusé | Envoyer depuis un compte extérieur au groupe de pairs | Un enregistrement plugin_channel_sender_denied et aucune réponse | |
| Autorisation de plateforme manquante | Retirez au bot la permission Envoyer des messages dans un canal, puis envoyez-lui un message dans ce canal. | Échec d’envoi dans le journal, le démon est toujours en cours d’exécution, aucune boucle de reconnexion | |
| Jeton invalide | Définissez un jeton syntaxiquement valide mais invalide ou révoqué via l’invite masquée config set, puis redémarrez | Le plugin signale le refus d’authentification de Discord et applique une temporisation ; aucune boucle de reconnexion n’apparaît dans le journal sur cinq minutes. Un jeton mal formé rejeté localement par configure() ne sollicite ni l’authentification de la plateforme ni la temporisation. | |
| Trust policy holds | Définissez plugins.security.signature_mode sur strict sans faire confiance à la clé de l’éditeur du paquet, puis redémarrez | Le démon ignore le paquet et consigne le refus de signature ; plugin.acceptance ne démarre pas. La CLI signale le paquet refusé comme Plugin discord not found ou No plugins installed, consultez donc le journal du démon pour en connaître la raison. Rétablissez le mode précédent |
Expurger avant publication
Les enregistrements channel inbound message et reply delivered contiennent le texte du message et l’identifiant utilisateur de l’expéditeur. Avant de publier quoi que ce soit :
- remplacer les identifiants d’utilisateur, de serveur et de canal par des espaces réservés ;
- ne conserver que le texte du message synthétique ;
- remplacer chaque valeur
enc2:de la copie de configuration par<encrypted>; - Rogner les captures d’écran pour ne garder que les messages testés.
Le jeton n’apparaît jamais dans les preuves, expurgé ou non.
Publier les preuves
Publiez sur le ticket de suivi de la version : le nom et l’empreinte de l’artefact, la sortie de zeroclaw --version, l’entrée de registre et la version du paquet, les commandes exactes des étapes 1 et 2, le tableau rempli, ainsi que les liens vers les pull requests qui ont modifié le paquet ou l’hôte depuis la dernière exécution acceptée.
Nettoyer
- Arrêtez le démon et exécutez
zeroclaw plugin remove discord. La suppression conserve la ligne[[plugins.entries]]de l’instance et sa liaison[channels.plugin.acceptance], et les affiche toutes deux ; supprimez-les. - Réinitialisez le jeton du bot dans le portail des développeurs Discord, afin que le jeton utilisé lors de l’exécution cesse de fonctionner.