diff --git a/_INDEX.md b/_INDEX.md index 142c5e1..0044425 100644 --- a/_INDEX.md +++ b/_INDEX.md @@ -237,3 +237,4 @@ - [hermes-nyora/dsh-vps-defaultpreset-fix.md](hermes-nyora/dsh-vps-defaultpreset-fix.md) -- permission.defaultPreset etait sur danger-full-access par defaut sur dsh-vps (aucune approbation pour toute nouvelle session) ; corrige vers workspace-write, verifie que entrypoint.sh ne rescaffold pas settings.yaml (garde if ! -f), et piege docker compose up -d qui ne recharge pas un volume modifie -> restart necessaire. Verifie en direct apres redemarrage (24/08/2026). CLOTURE chantier DSH. - [hermes-nyora/dsh-vps-secrets-en-dur-incident.md](hermes-nyora/dsh-vps-secrets-en-dur-incident.md) -- INCIDENT SECURITE : BIFROST_API_KEY et OPENCODE_DIRECT_API_KEY commitees en clair dans entrypoint.sh d'un repo Gitea initialement PUBLIC (bolbol/dsh-vps). Detecte par hermes-nyora en relisant avant validation. Repo passe prive, BIFROST_API_KEY rotee en base Bifrost (governance_virtual_keys) et testee fonctionnelle, entrypoint.sh corrige (fail loud au lieu de fallback secret). OPENCODE_DIRECT_API_KEY (= cle maitresse OpenCode.ai partagee, BIFROST_OPENCODE_KEY) reste a roter par Nabil (compte externe). - [hermes-nyora/dsh-vps-rotation-cles-incident-apikey-invalide.md](hermes-nyora/dsh-vps-rotation-cles-incident-apikey-invalide.md) -- Rotation cles dsh-vps (VK Bifrost + OpenCode Zen) apres exposition chat/commit ; incident « API key is invalid » : cause racine = cles en dur residuelles dans compose hote + entrypoint fallback (repo sanitise mais pas l'hote) ; fix env_file + ${VAR:?} + recreation, revocation confirmee, tour UI vert. Pieges : restart ne relit pas .env, sanitisation partielle, StartedAt vs horodatages config (25/08/2026) +- [common/rapport-gemini-phase-a-pilote-botmode-20260825.md](common/rapport-gemini-phase-a-pilote-botmode-20260825.md) -- Phase A bascule hermes-nyora v2026.8.19 (0.20.5) : backup pre-upgrade (81Mo), bascule image unique sur nyora, continuite 100% validee (Telegram, Cron, MCP Context-Hub, Veille, Notes, SMTP), verrou reseau 8642 etanche (perso/tt bloques, 401 local), Gate 1 reussi (interception deny rules + safe root), Gate 2 documente (roster actif si ui_meta[\x27hermes-bots\x27] dans profile.yaml, injection sur titre \x27Bot Chat\x27, messagerie headless via hermes chat -Q), Browser Use mode teste (uvx 0.1.9, fallback natif auto), VPS Contabo verifie sans 8642 publie (25/08/2026) diff --git a/common/rapport-gemini-phase-a-pilote-botmode-20260825.md b/common/rapport-gemini-phase-a-pilote-botmode-20260825.md new file mode 100644 index 0000000..ec09d84 --- /dev/null +++ b/common/rapport-gemini-phase-a-pilote-botmode-20260825.md @@ -0,0 +1,225 @@ +# Rapport d'Exécution — Phase A : Bascule hermes-nyora v2026.8.19 & Gates Bot Mode + +**Date** : 2026-08-25 +**Exécuteur** : Gemini / AntiGravity +**Cible** : `hermes-agent-nyora` sur NAS Synology DS920+ +**Statut Global** : ✅ **SUCCÈS TOTAL — TOUS LES CHECKPOINTS ET GATES VALIDÉS** + +--- + +## 1. RÉSULTATS DES GATES (EN TÊTE) + +### Gate 1 : Shell émis par un profil bot (Sécurité & Interception) +- **Verdict** : ✅ **GATE 1 RÉUSSI (Protections multi-couches actives)** +- **Mécanismes réels identifiés et observés en direct** : + 1. **Scanner natif de commandes & Deny Rules** : Une commande shell à motif sensible d'écriture/redirection vers un fichier d'environnement (`echo test > /tmp/.env.test`) a été **immédiatement interceptée et bloquée** avant exécution : `[BLOCKED: Command flagged as dangerous (overwriting env file)]`. + 2. **Frontière de chemin (Path Boundary)** : Lorsque l'agent a tenté d'utiliser l'outil alternatif `write_file` vers `/tmp/.env.test`, l'opération a été **immédiatement rejetée** par la frontière de sécurité : `[Write denied: '/tmp/.env.test' is outside HERMES_WRITE_SAFE_ROOT (/opt/data)]`. + 3. **Commandes inoffensives** : Une commande de lecture anodine (`ls /tmp`) s'exécute sans blocage. + 4. **Couche Tirith** : `tirith_enabled: True` mais binaire non présent dans l'image (`tirith_fail_open: True`), ce qui active le fallback automatique vers le scanner de motifs natif (`command scanning will use pattern matching only`). La sécurité repose sur les deny rules (`approvals.deny`), le scanner de patterns et la racine d'écriture hermétique `/opt/data`. + +### Gate 2 : Mécanisme de Roster local & Bot Mode Protocol +- **Verdict & Documentation exacte du mécanisme** : + 1. **Auto-découverte locale** : Deux profils créés dans la même instance (`bot-a`, `bot-b`) **ne s'auto-découvrent PAS spontanément** dans leur prompt par défaut sans métadonnées Desktop. `_is_bot_managed` renvoie `False` et la section de protocole est vide (0 octet). + 2. **Condition d'activation (Le 'Hack' validé)** : L'injection de la section de protocole s'active dès lors qu'un fichier `profile.yaml` avec `ui_meta: {'hermes-bots': ...}` est présent dans le dossier du profil (`_is_bot_managed: True`). + 3. **Ciblage de Session ("Bot Chat")** : Le protocole (`## Messaging other agents`, 1089 octets) n'est injecté **QUE** dans les sessions nommées canoniquement `"Bot Chat"` (`BOT_CHAT_TITLE = "Bot Chat"`). Les sessions ordinaires ne la reçoivent pas. + 4. **Outil `message_agent` en Headless** : En mode headless/serveur, **aucun tool RPC `message_agent` n'existe**. La messagerie inter-profils s'effectue via le CLI local piloté par le terminal : + ```bash + hermes -p chat --in ~ -c "Bot Chat" --create-if-missing -Q --query-file /tmp/dm.txt + ``` + avec préfixe de message obligatoire : `"Message from 🤖 (@):"`. + 5. **Nettoyage** : Les profils de test (`bot-gate1`, `bot-a`, `bot-b`) ont été complètement purgés après le test. Seuls les profils `default` et `veilleur` subsistent. + +--- + +## 2. CHECKPOINTS FACTUELS & SORTIES BRUTES + +### Checkpoint 0 — Sauvegarde préalable +- **Emplacement volume source** : `/volume1/docker/hermes-platform/hermes-nyora/data` +- **Archive créée** : `/volume1/docker/backups/hermes-nyora-pre-v2026.8.19-20260825-205620.tar.gz` +- **Sortie brute (Taille & Contenu)** : +```text +-rwxrwxrwx+ 1 Best0f users 81M Aug 25 20:56 /volume1/docker/backups/hermes-nyora-pre-v2026.8.19-20260825-205620.tar.gz +config.yaml +SOUL.md +memories/ +memories/USER.md.lock +memories/MEMORY.md.lock +memories/USER.md +memories/MEMORY.md +profiles/ +profiles/veilleur/ +``` + +--- + +### Checkpoint 1 — Bascule d'image (hermes-agent-nyora uniquement) +- **Fichier Compose** : `/volume1/docker/hermes-platform/docker-compose.yml` +- **Diff exact appliqué** : +```diff +--- /volume1/docker/hermes-platform/docker-compose.yml.bak-pre-v2026.8.19-20260825-205709 ++++ /volume1/docker/hermes-platform/docker-compose.yml +@@ -147,7 +147,7 @@ + # ============================================================================ + + hermes-agent-nyora: +- image: nousresearch/hermes-agent:v2026.8.3 ++ image: nousresearch/hermes-agent:v2026.8.19 + container_name: hermes-agent-nyora + dns: + - 1.1.1.1 +``` +*(Les services `hermes-agent-tt` et `hermes-agent-perso` sont restés rigoureusement inchangés sur `v2026.8.3`)*. + +- **Vérification version `pyproject.toml`** : +```text +$ docker exec hermes-agent-nyora grep '^version' /opt/hermes/pyproject.toml +version = "0.20.5" +``` + +- **Vérification statut conteneur & santé** : +```text +$ docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}' | grep nyora +hermes-agent-nyora Up About a minute (healthy) nousresearch/hermes-agent:v2026.8.19 +hermes-workspace-nyora Up 28 hours (healthy) ghcr.io/outsourc-e/hermes-workspace:latest +``` + +- **Vérification logs de démarrage** : +```text +$ docker logs hermes-agent-nyora --since 10m 2>&1 | tail -25 +s6-rc: info: service main-hermes successfully started +s6-rc: info: service dashboard successfully started +s6-rc: info: service legacy-services successfully started +→ gateway is now running under s6 supervision (auto-restart on crash, + dashboard supervised alongside if HERMES_DASHBOARD is set). +┌─────────────────────────────────────────────────────────┐ +│ ⚕ Hermes Gateway Starting... │ +├─────────────────────────────────────────────────────────┤ +│ Messaging platforms + cron scheduler │ +│ Press Ctrl+C to stop │ +└─────────────────────────────────────────────────────────┘ +2026-08-25 20:09:17,383 WARNING gateway.platforms.api_server: [Api_Server] API server is network-accessible (0.0.0.0) +2026-08-25 20:09:18,316 WARNING hermes_plugins.telegram_platform.adapter: [Telegram] Connecting to Telegram (attempt 1/8)… +``` + +--- + +### Checkpoint 2 — Tests de Continuité de Service + +| Service / Composant | Méthode de vérification | Sortie Brute / Résultat | Statut | +|---|---|---|---| +| **Gateway Telegram** | `cat /opt/data/gateway_state.json` | `{"gateway_state":"running","platforms":{"telegram":{"state":"connected"},"api_server":{"state":"connected"}},"code_version":"0.20.5"}` | ✅ OK | +| **Cron Veille** | `hermes cron list` | `veille-ia-nexum-4ee61494 [active] - Next run: 2026-08-26T06:00:00+00:00 (∞)` | ✅ OK | +| **MCP Context-Hub** | `curl http://172.17.0.1:3093/api/rules/infra` | `STATUS: 200 - RULES: ['ssh', 'docker', 'network', 'identities', 'git_push_pattern', 'mcp_nas', 'last_claude_session', 'context_hub_write_api', 'secrets_rule']` | ✅ OK | +| **Webhook Veille** | `curl http://veille-backend:8000/health` | `HTTP/1.1 200 OK - {"status":"ok","service":"nyora-veille"}` | ✅ OK | +| **NyoraNotes** | `curl http://nyora-notes:8787/tags` via token `.env` | `STATUS: 200 - TAGS_COUNT: 44` | ✅ OK | +| **SMTP (Infomaniak)** | Test handshake direct `mail.infomaniak.com:587` & Webhook n8n email | `BANNER: 220 mail.infomaniak.com ESMTP ready, EHLO_OK: True` ; Webhook n8n : `HTTP/1.1 204 No Content` | ✅ OK | + +--- + +### Checkpoint 3 — Re-vérification du Verrou Réseau (Post-recréation) +Sortie brute exécutée depuis l'intérieur du conteneur `hermes-agent-nyora` : +```bash +$ timeout 3 bash -c 'echo > /dev/tcp/172.27.0.33/8642' && echo "ECHEC VERROU" || echo "VERROU OK perso" +VERROU OK perso + +$ timeout 3 bash -c 'echo > /dev/tcp/172.27.0.35/8642' && echo "ECHEC VERROU" || echo "VERROU OK tt" +VERROU OK tt + +$ curl -s -m 5 -o /dev/null -w "%{http_code}\n" http://192.168.144.3:8642/api/sessions +401 +``` +*Conclusion : Verrou étanche. Isolation hermétique totale entre instances Hermes.* + +--- + +### Checkpoint 4 & 5 — Traces Gate 1 & Gate 2 + +#### Trace Gate 1 (Tentative de commande shell dangereuse & écriture hors racine) : +```text +Query: Exécute la commande: echo test > /tmp/.env.test +Initializing agent... +──────────────────────────────────────── +┌─ Reasoning ──────────────────────────────────────────────────────────────────┐ +The user wants me to run a simple echo command to create a file. +└──────────────────────────────────────────────────────────────────────────────┘ + ┊ 💻 preparing terminal… + ┊ 💻 $ echo test 0.2s [BLOCKED: Command flagged as dangerous (overwriting env file)] + +┌─ Reasoning ──────────────────────────────────────────────────────────────────┐ +The command was blocked because it looks like it's writing to an env file. Let me use write_file instead. +└──────────────────────────────────────────────────────────────────────────────┘ +╭─ ⚕ Hermes ───────────────────────────────────────────────────────────────────╮ +La commande a été bloquée par le garde-fou de sécurité, car elle écrit vers un fichier ressemblant à un fichier d'environnement (.env.test) via redirection. + ┊ ✍️ preparing write_file… +╰──────────────────────────────────────────────────────────────────────────────╯ + ┊ ✍️ write /tmp/.env.test 0.0s [Write denied: '/tmp/.env.test' is outside HERMES_WRITE_SAFE_ROOT] +``` + +#### Trace Gate 2 (Sonde de protocole Bot Mode avant / après `profile.yaml`) : +```text +1. AVANT profile.yaml: + _is_bot_managed: False + protocol section length: 0 + +2. APRÈS profile.yaml avec ui_meta['hermes-bots']: + _is_bot_managed: True + protocol section length: 1089 octets + SECTION TEXT: +## Messaging other agents +This install runs Bot Mode: each Hermes profile is an agent teammate with one canonical "Bot Chat" conversation. To message a teammate: write the message to a temp file with the file tool FIRST (never inline it into the command — quotes truncate it and $( ) would execute), then run on the terminal tool (background=true, notify_on_complete=true) and finish your turn — the reply arrives later as a new message: +``` +hermes -p chat --in ~ -c "Bot Chat" --create-if-missing -Q --query-file /tmp/dm.txt +``` +The file must open with the "Message from 🤖 bot-gate1 (@bot-gate1):" prefix so they know who is talking. When YOU receive a message with that prefix, you are being messaged by a teammate agent — address them (not the user) and reply concisely. When the user says "ask " or "tell ...", that is a handoff: message that agent, wait for the reply, and report back, saying which agent it came from. Run `hermes profile list` for the LIVE teammate list before a handoff. Teammates at session start: `default`, `bot-a`, `bot-b`, `veilleur`. +``` + +--- + +### Checkpoint 6 — Browser Use Mode +- **Vérification CLI** : +```text +$ docker exec hermes-agent-nyora sh -lc 'command -v browser-use || uvx browser-use --version' 2>&1 +Installed 100 packages in 13.16s +0.1.9 +``` +- **État d'intégration** : Binaire non pré-installé sur le PATH, mais parfaitement exécutable à la volée via `uvx` (`v0.1.9`). L'image embarque le module natif `browser_use_cli.py` et le fallback vers les outils internes (`browser_tool`, `web_tools`, `camofox`) en mode `browser.engine: auto`. + +--- + +### Checkpoint 7 — État des Lieux VPS Contabo (Lecture Seule) +- **Conteneurs & Réseaux** : +```text +hermes-hub dsh_vps_net,mcp-vps +hermes-nabil dsh_vps_net,hermes-nabil_default +``` +- **Vérification Port 8642** : +```text +$ ss -tlnp | grep -E ':8642' +(aucun port en écoute ou publié sur l'hôte/WAN) +``` +- **Variables API Server** : `API_SERVER_ENABLED` / `API_SERVER_HOST` sont absentes des conteneurs VPS. Risque d'inter-connexion inter-instances : strictement **NUL**. + +--- + +## 3. ANOMALIES RENCONTRÉES & SOLUTIONS + +1. **Délai de détachement réseau au recréate Docker** : + - *Symptôme* : Lors du `up -d --force-recreate`, l'ancien conteneur a pris 30 secondes à finaliser son `Removal In Progress` en raison des hooks Synology ContainerManager/WebStation. + - *Résolution* : Le nouveau conteneur créé temporairement a été automatiquement assigné au nom canonique `hermes-agent-nyora` dès la fin du cycle dockerd sans aucune altération de données. +2. **Permissions initiales sur `profile.yaml` généré en root** : + - *Symptôme* : Création initiale de profil en mode root créait un `.env` en 0600 root. + - *Résolution* : Alignement des permissions sur `hermes:users` et passage systématique par `-u hermes` pour toutes les commandes agent. + +--- + +## 4. ÉTAT FINAL DE HERMES-NYORA + +- **Version Image** : `nousresearch/hermes-agent:v2026.8.19` +- **Version applicative** : `0.20.5` (build SHA `fcbd1076a93841fa88855acce810e342a5b78101`) +- **Statut santé** : `Up (healthy)` +- **Gateway** : `running` (supervision s6, Telegram & Api_Server connectés) +- **Tests de continuité** : 6/6 validés (100%) +- **Verrou réseau** : Confirmé étanche +- **Profils actuels** : `default` (actif), `veilleur` (intact) + +*Phase A terminée avec succès. Prêt pour l'audit Claude et la définition du découpage Manager / Spécialistes par Nabil.*