Module 16 / 16← Ordre des modules
● Recette finale · tests fonctionnels · reboot · Golden

Validation finale de Jarvis

Exécuter une recette complète du cœur Jarvis après les Modules 00 à 15. Le but n’est plus d’installer : il faut prouver que chaque composant fonctionne, persiste après redémarrage et peut être restauré. La méthode recommandée est désormais de lancer le prompt de validation directement dans Hermes.

Verdict attendu

SANTÉ: OK

Dernier test

Reboot complet

Après validation

Options 01 → 03

Règle de réception : un composant obligatoire en échec signifie que le Module 16 n’est pas validé. Corrigez le module concerné puis reprenez la validation à partir de ce point.
Périmètre public : Gmail, Google Calendar et Home Assistant/réseau ont été déplacés dans les options. Leur absence n’empêche donc pas le verdict SANTÉ: OK du cœur Jarvis.
Attention : les étapes de sauvegarde et de reboot provoquent volontairement des actions système. Ne lancez pas jarvis-bootstrap --rebuild-all sur une machine Jarvis opérationnelle.
Lecture seuleModificationValidationOptionnel

Ordre de validation

1 · Calcul local

Ubuntu → Ollama/ROCm → Qwen → Hermes.

2 · Interfaces

Gateway/API → Telegram → voix → Camofox → Open WebUI.

3 · Exploitation

Scripts → NFS → backup → watchdog → hooks → bootstrap.

4 · Résilience

jarvis-health → reboot → contrôle rapide → freeze Golden.

Validation recommandée directement dans Hermes

Au lieu de lancer chaque contrôle manuellement, copiez ce prompt dans Hermes. Il réalise la recette en lecture seule, masque les secrets et produit un verdict structuré. Les étapes détaillées plus bas restent la référence pour diagnostiquer un échec.

Recommandé : lancer d’abord le prompt principal. S’il conclut VERDICT CŒUR JARVIS : VALIDÉ, effectuer ensuite le reboot manuellement puis lancer le second prompt.

Prompt Hermes · Validation complète avant reboot

Validation
Tu es en phase de VALIDATION FINALE de Jarvis.

Objectif : auditer le cœur Jarvis installé sur cette machine et produire un verdict factuel.

RÈGLES DE SÉCURITÉ
- Commence uniquement par des contrôles en lecture seule.
- Ne lance aucune installation, mise à jour, suppression, prune, modification de configuration, restart/stop de service, montage/démontage ou reboot.
- Ne lance jamais `jarvis-bootstrap --rebuild-all`.
- Ne révèle jamais les valeurs de secrets, tokens, clés API ou mots de passe. Si tu lis ~/.hermes/.env ou ~/.config/jarvis/jarvis.env, affiche uniquement les noms des variables utiles et masque leurs valeurs.
- Si une anomalie est détectée, explique-la et propose la commande de correction, mais ne l’exécute pas sans mon accord explicite.
- Home Assistant, UniFi, Gmail et Google Calendar sont OPTIONNELS : leur absence ne doit pas dégrader le verdict du cœur Jarvis.

PÉRIMÈTRE OBLIGATOIRE À VALIDER
1. Ubuntu : version, kernel, synchronisation horaire et espace disque.
2. Docker : service opérationnel.
3. Ollama : service actif, API locale, paramètres Golden (context 65536, Flash Attention, KV cache q8_0, keep-alive), modèle principal disponible.
4. GPU/ROCm : confirmer que le modèle actif est placé sur GPU et signaler toute anomalie visible dans les logs récents.
5. Hermes CLI : `hermes config check`, `hermes doctor` et modèle configuré.
6. Hermes Gateway/API : service user actif, linger, port configuré et endpoint /health accessible. Ne jamais afficher API_SERVER_KEY.
7. Telegram : vérifier la configuration et l’état du Gateway. Ne lance un message de test que si je t’autorise explicitement.
8. Voix locale : vérifier la configuration STT/TTS, provider, modèle et dépendances. Ne change rien.
9. Camofox : service actif, écoute locale uniquement et endpoint /health.
10. Skills cœur : confirmer la présence des skills installés et signaler uniquement ceux qui sont obligatoires au cœur.
11. Open WebUI : conteneur actif, restart policy, port publié, endpoint /health et présence de /app/backend/data/webui.db. Ne lance pas `docker inspect` complet si cela risque d’afficher des secrets.
12. Scripts Jarvis : vérifier la présence et les permissions de `jarvis-health`, `jarvis-system-info`, `jarvis-bootstrap`, `jarvis-backup`, `jarvis-backup-extra`, `jarvis-backup-safe`, `jarvis-watchdog`; exécuter `python3 -m py_compile` sur les scripts Python et `bash -n` sur les scripts Bash.
13. NFS / sauvegarde : vérifier le point de montage configuré, son accessibilité, les derniers backups locaux/NFS, leurs fichiers .sha256 et l’état du timer. Ne déclenche pas un nouveau backup sans mon accord.
14. Watchdog : vérifier service, timer, dernier état enregistré et logs récents. Ne lance `--test-alert` qu’avec mon accord.
15. Hooks Hermes : `hermes hooks list` et `hermes hooks doctor`; confirmer que les actions système sensibles sont protégées.
16. Bootstrap : exécuter uniquement les modes sûrs disponibles, en priorité `jarvis-bootstrap --check` puis `jarvis-bootstrap --simulate-all`. Ne jamais lancer `--rebuild-all`.
17. Diagnostic final : exécuter `jarvis-system-info`, puis `jarvis-health`, récupérer son code retour et vérifier qu’il termine par `SANTÉ: OK`.

MÉTHODE
- Mesure l’état actuel au moment du test ; ne conclus pas à partir d’anciens logs seuls.
- Pour chaque contrôle, indique la commande réellement utilisée et résume le résultat sans exposer de secret.
- Si une commande n’existe pas sur cette version, indique-le et utilise une méthode de vérification équivalente sans modifier la machine.
- N’invente aucun résultat.

FORMAT DU RAPPORT FINAL
Présente un tableau : `Composant | Test | Résultat | Statut | Action requise`.
Utilise seulement les statuts : ✅ OK, ⚠️ À SURVEILLER, ❌ ÉCHEC, ⏭️ OPTIONNEL.
Puis termine par :
- `VERDICT CŒUR JARVIS : VALIDÉ` uniquement si tous les composants obligatoires sont OK ;
- sinon `VERDICT CŒUR JARVIS : NON VALIDÉ`.

Si le cœur est validé, NE REDÉMARRE PAS la machine. Termine par :
`PHASE 1 VALIDÉE — redémarrage complet à effectuer manuellement, puis relancer le prompt de contrôle post-reboot du Module 16.`
Pourquoi : Hermes orchestre les contrôles lui-même, sans transformer la validation en procédure de correction automatique.
Résultat attendu : Un tableau de réception complet et le verdict VERDICT CŒUR JARVIS : VALIDÉ uniquement si toutes les briques obligatoires sont saines.

Prompt Hermes · Contrôle après reboot

Validation
Contrôle post-reboot Jarvis.

Ne modifie rien et ne redémarre aucun service. Vérifie l’état ACTUEL après le redémarrage :
1. `systemctl is-active ollama`
2. `hermes gateway status`
3. `systemctl --user is-active camofox.service`
4. conteneur Open WebUI actif et endpoint /health accessible
5. `systemctl --user is-active jarvis-backup.timer`
6. `systemctl --user is-active jarvis-watchdog.timer`
7. `systemctl --user list-timers` pour confirmer les prochaines échéances
8. `jarvis-system-info`
9. `jarvis-health` puis son code retour

Home Assistant, UniFi, Gmail et Google Calendar restent optionnels et ne doivent pas dégrader le verdict du cœur s’ils ne sont pas configurés.
N’affiche aucun secret. N’utilise pas d’anciens logs comme preuve unique : vérifie l’état courant.

Retourne un tableau `Composant | Résultat | Statut` puis termine exactement par l’un des deux verdicts :
- `VALIDATION POST-REBOOT : OK`
- `VALIDATION POST-REBOOT : ÉCHEC`

En cas d’échec, explique la cause probable et propose les commandes de diagnostic/correction, sans les exécuter sans mon accord.
Pourquoi : Le reboot doit rester une action volontaire. Ce deuxième prompt vérifie ensuite que les services, conteneurs et timers ont réellement persisté.
Résultat attendu : VALIDATION POST-REBOOT : OK et jarvis-health en SANTÉ: OK avec un code retour 0.

Recette finale

Exécutez les étapes dans l’ordre. Les tests optionnels peuvent être omis sans invalider le cœur.

16.01 · Poser le périmètre de validation

Lecture seule
test -r "$HOME/.config/jarvis/jarvis.env" && echo "CONFIG_JARVIS=OK" || echo "CONFIG_JARVIS=ABSENTE"
printf '%s\n' "Cœur obligatoire : Ollama, Hermes, Telegram, voix, Camofox, Open WebUI, scripts, backup, watchdog"
printf '%s\n' "Options hors verdict : Gmail, Calendar, Home Assistant / réseau"
Pourquoi : Éviter qu'une intégration optionnelle bloque la réception du cœur Jarvis.
Résultat attendu : Le périmètre obligatoire est clair. Home Assistant/UniFi et les autres options seront validés séparément après ce module.

16.02 · Vérifier le socle Ubuntu

Validation
hostnamectl --static
timedatectl status | sed -n '1,12p'
uname -r
free -h
df -h /
Pourquoi : Une validation applicative n'a pas de sens si l'hôte est mal synchronisé, saturé ou instable.
Résultat attendu : Hostname attendu, heure synchronisée, kernel cohérent, mémoire et espace disque suffisants.

16.03 · Vérifier Docker et Ollama

Validation
systemctl is-active ollama
docker info >/dev/null && echo "DOCKER=OK"
ollama --version
docker --version
docker compose version
Pourquoi : Confirmer que les deux moteurs qui portent l'IA locale et Open WebUI répondent réellement.
Résultat attendu : Ollama est active, Docker répond sans erreur et les versions sont affichées.

16.04 · Vérifier les paramètres Golden Ollama

Validation
systemctl show ollama -p Environment --value | tr ' ' '\n' | \
  grep -E '^(OLLAMA_CONTEXT_LENGTH|OLLAMA_FLASH_ATTENTION|OLLAMA_KV_CACHE_TYPE|OLLAMA_KEEP_ALIVE)='
Pourquoi : Le modèle peut fonctionner avec de mauvais paramètres tout en semblant sain. Cette étape valide les réglages de contexte et cache.
Résultat attendu : On retrouve CONTEXT_LENGTH=65536, FLASH_ATTENTION=true, KV_CACHE_TYPE=q8_0 et KEEP_ALIVE=-1.

16.05 · Tester le modèle local et le GPU

Validation
set -a
[ -r "$HOME/.config/jarvis/jarvis.env" ] && . "$HOME/.config/jarvis/jarvis.env"
set +a
MODEL="${JARVIS_MODEL:-qwen3.6:35b-a3b}"
ollama run "$MODEL" "Réponds uniquement : JARVIS_OK"
ollama ps
Pourquoi : Valider une inférence réelle puis contrôler le placement et le contexte, pas seulement la présence du modèle sur disque.
Résultat attendu : La réponse contient JARVIS_OK. Le modèle actif apparaît dans ollama ps avec le contexte attendu et, sur la cible Strix Halo Golden, 100 % GPU.

16.06 · Valider Hermes CLI

Validation
hermes config check
hermes doctor
hermes config get model
Pourquoi : Séparer une erreur Hermes d'une erreur Ollama et confirmer le modèle réellement sélectionné.
Résultat attendu : La configuration est valide, doctor ne remonte pas d'erreur bloquante et le modèle local attendu est sélectionné.

16.07 · Faire une conversation Hermes réelle

Validation
hermes chat
Pourquoi : Le test ultime de la chaîne locale reste une requête utilisateur qui traverse Hermes vers Ollama.
Résultat attendu : Dans le chat, demander « Réponds uniquement : HERMES_OK ». La réponse doit arriver sans fallback cloud ni traceback.

16.08 · Valider le Gateway et l'API

Validation
hermes gateway status
JARVIS_IP="$(ip route get 1.1.1.1 | awk '{for(i=1;i<=NF;i++) if($i=="src"){print $(i+1); exit}}')"
printf 'IP_LAN=%s\n' "$JARVIS_IP"
ss -lntp | grep ':8642' || true
curl -fsS "http://$JARVIS_IP:8642/health" && echo
Pourquoi : Open WebUI et les clients distants dépendent du Gateway, pas seulement du CLI Hermes.
Résultat attendu : Gateway actif, port 8642 en écoute sur l'interface prévue et endpoint /health joignable depuis Jarvis.

16.09 · Valider Telegram texte

Validation
hermes send --to telegram "Validation finale Jarvis : Telegram texte OK"
Pourquoi : Confirmer le canal d'alerte utilisé ensuite par le watchdog.
Résultat attendu : Le message de test est reçu sur le compte Telegram autorisé.

16.10 · Valider la voix locale

Validation
hermes config get stt
hermes config get tts | grep -E '^(provider|speed):|model|language' || true
Pourquoi : Vérifier que STT/TTS restent configurés localement avant le test fonctionnel.
Résultat attendu : STT local/faster-whisper en français et TTS NeuTTS configuré. Envoyer ensuite une note vocale Telegram et vérifier transcription + réponse vocale.

16.11 · Valider Camofox

Validation
systemctl --user is-active camofox.service
curl -fsS http://127.0.0.1:9377/health && echo
ss -lntp | grep ':9377' || true
Pourquoi : Le navigateur de fallback doit être actif tout en restant local.
Résultat attendu : Service actif, /health OK et écoute limitée à 127.0.0.1:9377.

16.12 · Vérifier les skills principaux

Validation
hermes skills list | grep -E 'strix-halo-local-ai|coding-automation|jarvis-maintenance|research-watch' || true
for d in \
  "$HOME/.hermes/skills/local-ai/strix-halo-local-ai" \
  "$HOME/.hermes/skills/coding/coding-automation" \
  "$HOME/.hermes/skills/maintenance/jarvis-maintenance" \
  "$HOME/.hermes/skills/research/research-watch"; do
  test -f "$d/SKILL.md" && echo "OK $d" || echo "ABSENT $d"
done
Pourquoi : La présence des skills est une dépendance fonctionnelle d'Hermes mais ne doit pas être supposée à partir de la seule configuration.
Résultat attendu : Les quatre skills cœur sont présents et visibles par Hermes.

16.13 · Valider Open WebUI

Validation
JARVIS_IP="$(ip route get 1.1.1.1 | awk '{for(i=1;i<=NF;i++) if($i=="src"){print $(i+1); exit}}')"
docker ps --filter name=open-webui
docker port open-webui 8080/tcp
curl -fsS "http://$JARVIS_IP:3000/health" && echo
docker exec open-webui test -f /app/backend/data/webui.db && echo "WEBUI_DB=OK"
Pourquoi : Vérifier à la fois le conteneur, le bind réseau et la persistance des données.
Résultat attendu : Conteneur Up, port publié sur l'adresse LAN prévue, /health OK et webui.db présent.

16.14 · Valider les scripts Jarvis

Validation
python3 -m py_compile "$HOME/.local/bin/jarvis-health" "$HOME/.local/bin/jarvis-system-info"
for f in jarvis-bootstrap jarvis-backup jarvis-backup-extra jarvis-backup-safe jarvis-watchdog; do
  bash -n "$HOME/.local/bin/$f" || exit 1
done
stat -c '%a %n' "$HOME/.local/bin"/jarvis-*
Pourquoi : Les scripts d'exploitation sont désormais une partie du produit Jarvis et doivent être validés comme du code.
Résultat attendu : Aucune erreur Python/Bash. Les scripts exécutables sont en permission 700.

16.15 · Valider le stockage NFS

Validation
set -a
. "$HOME/.config/jarvis/jarvis.env"
set +a
findmnt -T "$JARVIS_NFS_MOUNT"
TEST_FILE="$JARVIS_NFS_MOUNT/.jarvis-validation-$$"
printf 'JARVIS_NFS_OK\n' > "$TEST_FILE"
grep -qx 'JARVIS_NFS_OK' "$TEST_FILE"
rm -f "$TEST_FILE"
echo "NFS_RW=OK"
Pourquoi : La sauvegarde réseau doit être réellement accessible en lecture/écriture, pas seulement montée.
Résultat attendu : findmnt montre le stockage attendu et le test temporaire lecture/écriture se termine par NFS_RW=OK.

16.16 · Exécuter une sauvegarde complète

Modification
systemctl --user start jarvis-backup.service
systemctl --user status jarvis-backup.service --no-pager || true
journalctl --user -u jarvis-backup.service -n 80 --no-pager
Pourquoi : Tester le même chemin que le timer : jarvis-backup-safe, snapshot complémentaire, archive, SHA-256 et copie NFS.
Résultat attendu : Le oneshot termine sans échec, Hermes est revenu actif et le journal confirme archive + checksum + copie réseau vérifiée.

16.17 · Valider backup et watchdog automatiques

Validation
systemctl --user is-enabled jarvis-backup.timer
systemctl --user is-active jarvis-backup.timer
systemctl --user is-enabled jarvis-watchdog.timer
systemctl --user is-active jarvis-watchdog.timer
systemctl --user list-timers --all | grep -E 'jarvis-(backup|watchdog)'
jarvis-watchdog --test-alert
Pourquoi : Une installation finalisée doit continuer à se protéger sans session interactive.
Résultat attendu : Les deux timers sont enabled + active, leurs prochaines échéances sont visibles et l'alerte de test est reçue.

16.18 · Valider les hooks de sécurité

Validation
hermes hooks list
hermes hooks doctor
printf '%s\n' '{"tool_name":"terminal","tool_input":{"command":"systemctl --user restart hermes-gateway.service"}}' | \
  "$HOME/.hermes/agent-hooks/protect-system-actions.py"
Pourquoi : Confirmer que les garde-fous ne sont pas seulement présents mais réellement exécutables et allowlistés.
Résultat attendu : hooks doctor est sain et le test synthétique renvoie action=approve sans redémarrer réellement le service.

16.19 · Auditer le bootstrap en lecture seule

Validation
jarvis-bootstrap --check
jarvis-bootstrap --simulate-all
Pourquoi : Le bootstrap public sert aussi d'audit global et doit être capable de décrire la reconstruction sans toucher à la production.
Résultat attendu : Les contrôles se terminent sans échec bloquant. Ne jamais lancer --rebuild-all sur le Jarvis opérationnel.

16.20 · Vérifier le seed modèle si utilisé

Optionnel
jarvis-bootstrap --check-model-seed
Pourquoi : Le seed Qwen hors ligne réduit fortement la dépendance à Internet lors d'une reconstruction.
Résultat attendu : Si un seed a été publié, les checksums et le marqueur .complete sont valides. Sinon, cette étape peut rester non validée.

16.21 · Lancer le diagnostic final

Validation
jarvis-system-info
jarvis-health
RC=$?
printf 'JARVIS_HEALTH_RC=%s\n' "$RC"
exit "$RC"
Pourquoi : Terminer par les deux scripts qui synthétisent l'état réel après tous les tests précédents.
Résultat attendu : jarvis-system-info ne produit aucun traceback. jarvis-health termine par SANTÉ: OK et JARVIS_HEALTH_RC=0. L'absence d'intégrations optionnelles ne doit pas dégrader le cœur.

16.22 · Test de redémarrage complet

Modification
sudo reboot
Pourquoi : Un système peut être sain avant reboot tout en ayant des services ou timers non persistants. Ce test valide réellement la reconstruction.
Résultat attendu : Après reconnexion, exécuter le bloc de contrôle rapide ci-dessous. Tous les composants obligatoires doivent revenir automatiquement.

16.23 · Contrôle rapide après reboot

Validation
systemctl is-active ollama
hermes gateway status
systemctl --user is-active camofox.service
docker ps --filter name=open-webui
systemctl --user is-active jarvis-backup.timer
systemctl --user is-active jarvis-watchdog.timer
jarvis-health
Pourquoi : Vérifier la persistance après démarrage sans répéter toute la recette.
Résultat attendu : Ollama, Gateway, Camofox, Open WebUI et les deux timers sont revenus ; jarvis-health termine par SANTÉ: OK.

16.24 · Figer ce nouvel état Golden

Optionnel
jarvis-bootstrap --freeze
# Si votre NAS Golden est configuré et que vous souhaitez publier les sources de reprise :
# jarvis-bootstrap --publish-seed
# jarvis-bootstrap --publish-model-seed
Pourquoi : Une fois la machine validée, figer les versions rend les prochaines restaurations reproductibles. La publication du modèle est volontairement séparée car elle copie un volume important.
Résultat attendu : Le manifest Golden et ses checksums sont créés. Les publications NAS ne sont lancées qu'en connaissance de cause.

Checklist de réception

La validation finale n’est acquise que lorsque tous les éléments obligatoires ci-dessous sont cochés.

Socle Ubuntu sain et synchronisé.
Docker et Ollama actifs.
Paramètres Ollama Golden présents.
Modèle local testé et placement GPU cohérent.
Hermes config/doctor/CLI validés.
Gateway et API Hermes accessibles.
Telegram texte validé.
STT/TTS locaux validés fonctionnellement.
Camofox actif uniquement en local.
Skills cœur présents.
Open WebUI actif, accessible et persistant.
Scripts Jarvis sans erreur de syntaxe.
NFS accessible en lecture/écriture.
Sauvegarde complète réussie et vérifiée.
Timers backup + watchdog enabled/active.
Alerte watchdog Telegram reçue.
Hooks Hermes sains et action sensible protégée.
jarvis-bootstrap --simulate-all réussi.
jarvis-health = SANTÉ: OK / RC=0.
Tous les services reviennent après reboot.

STOP — Cœur Jarvis validé

Si toutes les cases obligatoires sont validées, que le reboot est passé et que jarvis-health retourne SANTÉ: OK avec un code retour 0, l’installation principale de Jarvis est terminée. Vous pouvez maintenant ajouter uniquement les intégrations dont vous avez besoin.