Cartographie complète (liste_taches/coherence_taches), briefs tacheN + gates validation_tacheN, design tâche 2 (docs/design/tache2/), specs/plans jalon 1-2 et tâche 1.9/2 (Phase 1, Phase 2, SJ-0→3). Validations consignées (1.9 ✅, 2-8 🟡). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
8.1 KiB
Tâche 2 — Moteur de templates de mise à jour : synthèse de design
Type : document de design / spec. Aucune implémentation. Langue : français. Périmètre : design du moteur de templates (APT + Docker + scripts custom) et des contrats de données associés, prêt à passer en
writing-plans. Statut : design figé proposé, à valider contrevalidation_tache2.md(gate obligatoire avant tout code).
1. Objet de la mission
Concevoir — sans coder — le moteur de templates de mise à jour complet et les contrats JSON associés, couvrant cinq axes :
- Axe A — Templates APT complets et OS-aware (update/analyse, upgrade, full/dist-upgrade, clean, autoremove, reboot-check, reboot vérifié), profils OS + type machine, proxy apt-cacher-ng.
- Axe B — Capture des mises à jour prévues (snapshot) et appliquées (diff réel avant/après), consommables par Hermes via déduplication + réduction déterministe.
- Axe C — Taxonomie des erreurs APT/dpkg/Docker + stratégie de remédiation.
- Axe D — Docker Compose : scan, inspect, pull-check, apply, prune, down, par SSH, avec racines déclarées + détection labels.
- Axe E — Scripts personnalisés (post-install, installation de paquets) avec garde-fous, manifestes et champs dynamiques.
La logique métier vit dans des templates shell versionnés sur disque (esprit nas-ops), rendus en Mustache et poussés en SSH (server/ssh/client.ts). Le backend orchestre, parse en JSON canonique, archive logs + rapports. Hermes analyse les JSON réduits, n'exécute jamais de SSH, ne reçoit jamais de secret.
2. Cartographie des livrables
| Fichier | Contenu | Axe / Livrable §4 |
|---|---|---|
00-synthese.md (ce fichier) |
Vue d'ensemble, décisions clés, couverture du gate | tous |
10-templates-apt.md |
Inventaire + pseudo-shell des templates APT, sémantique, marqueurs | A, §4.1, §4.2 |
20-docker.md |
Inventaire + pseudo-shell Docker Compose, flux, sécurité prune/down | D, §4.1, §4.2 |
30-scripts-custom.md |
Modèle des profils post-install, manifestes, champs dynamiques, garde-fous | E, §4.1, §4.7 |
40-contrats-json.md |
Schémas JSON canoniques étendus + types TS rétro-compatibles + déduplication/réduction | B, §4.3 |
50-erreurs.md |
Taxonomie des erreurs APT/dpkg/Docker/réseau + codes + remédiation | C, §4.4 |
60-profils-os-machine.md |
Modèle profils OS + type machine + overrides + proxy APT + détection | A, §4.5, §4.6 |
70-securite.md |
Frontière Hermes/MCP, actions destructives, validations, surface MCP | §4.8 |
80-sous-jalons.md |
Découpage en sous-jalons priorisé, prêt pour writing-plans |
§4.9 |
90-questions-investigation.md |
Les 8 questions §3 tranchées (MVP / alternatives / risques) | §3 |
99-couverture-gate.md |
Auto-évaluation case par case de validation_tache2.md |
gate |
3. Décisions structurantes (résumé)
Détail et justifications dans 90-questions-investigation.md. Synthèse :
- Parsing : hybride, parsing-TS dominant (MVP). On conserve l'approche actuelle (marqueurs
===SU:XXX===+ parsing TS dansserver/services/), enrichie par des données structurées en TSV/clé=valeur produites côté shell (ex.dpkg-query -W -f=...,docker ... --format json) là où le format est déjà stable et documenté. Pas de génération de gros JSON imbriqué dans le shell. Rétro-compatible avec le jalon 1. - Profils OS = fichiers de templates par profil + héritage par convention de dossier. Arborescence
templates/<famille>/<commande>.sh.tplavec un profilbaseet des overrides par OS résolus par ordre de priorité. Le moteur de rendu choisit le template le plus spécifique disponible (fallback versbase). - Type machine = choix manuel à l'ajout + action
machine_probede correction. L'opérateur choisitos_familyetmachine_kindau formulaire ; une sonde non destructive propose des corrections (jamais appliquées automatiquement sans validation). - Diff avant/après = snapshot dpkg autour de chaque action APT réelle.
dpkg-query -W -f='${binary:Package}\t${Version}\t${Architecture}\n'avant et après ; le backend calcule le diff. L'exit code APT ne suffit jamais à déclarer un succès. - Extensions de
shared/types.ts: tout en champs optionnels. Élargissement des unions (OsFamily,ActionType,AptProxyMode), ajout de blocs optionnelsapt(détaillé),docker,custom/postInstall,reboot,errorssurUpdateSnapshot/ExecutionResult. Un snapshot/exécution du jalon 1 reste strictement valide. - Opérations longues :
nohup+ fichier exit-code généralisé pour les actions applicatives longues, mais pas pour le refresh. Reboot vérifié = mécanisme dédié (boot_id avant/après, reconnexion, délai adaptatif). Le refresh/analyse reste synchrone et court. - Sécurité prune/down/scripts : barrière de validation côté webapp +
action_requests. Hermes propose, ne déclenche jamais. Secrets jamais lus ni renvoyés (registry creds, sudo, tokens). Erreurs nettoyées avant UI/MCP. - Surface MCP minimale, en lecture + déclenchement d'actions déjà autorisées. Réutilise les outils v1 du rapport (
list_machines,get_machine_snapshot,get_machine_execution,list_templates,preview_template,run_refresh,run_action,search_reports) ; aucune nouvelle primitive d'exécution SSH exposée.
4. Principes invariants respectés
- Convention templates : tous les templates émettent des marqueurs
===SU:XXX===;LC_ALL=C;DEBIAN_FRONTEND=noninteractivepour APT ; exécution soussudo -SviarunScriptSudo(base64) ; marqueur de sortie===SU:EXIT=N===. - Réduction déterministe avant LLM : le réducteur (
aptReduce.ts, à étendre enreduceLines.ts) ne garde que les lignes utiles APT et Docker ; le log brut complet est archivé séparément (raw_artifacts/rawLogPath). - Déduplication : APT par
os_family + package + from + to + origin; Docker parimage + fromDigest + toDigest(fallbackimage + fromImageId + toImageId). - Templates versionnés sur disque : éditables depuis le front mais sauvegardés comme ressources de projet (revues Git), versionnés via
install_recipe_versionspour les scripts custom. - Backend orchestre, shell porte la logique métier, JSON canonique = langage commun frontend / MCP / Hermes.
- Réutilisation de l'existant : pas de nouveau mécanisme d'exécution SSH ; on s'appuie sur
runScriptSudo/runPlainet sur la tableexecutions+ WebSocket terminal.
5. Alignement avec tache1.9.md (schéma BDD cible)
Les contrats JSON et tables dérivées de ce design se rangent dans les tables prévues :
- Snapshot APT/Docker →
snapshots(kind, payload_json, important_json)+ tables dérivéesapt_planned_packages,docker_compose_stacks,docker_stack_services. - Résultats d'exécution →
executions(result_json, important_json)+apt_applied_packages,docker_image_events,apt_errors. - Scripts custom →
install_profiles,install_recipes,install_recipe_versions,machine_profile_state,script_variables_presets. - Messages importants extraits →
important_messages. - Config Docker par machine →
docker_settings,docker_compose_roots. - Profils OS / type machine → colonnes
machines.os_family / machine_kind / virtualization / hardware_profile+machine_hardware(sonde).
Aucune table nouvelle n'est requise par la tâche 2 ; le design réutilise la cible tache1.9.md.
6. Ce qui reste hors périmètre (suggestions, pas exécuté)
- Catalogue détaillé des scripts post-install → renvoyé à tâche 4 (ce design pose le mécanisme moteur + les manifestes attendus).
- API/jobs/route d'action, file de jobs persistante → tâche 5.
- Affichage UI fin des snapshots/actions → tâche 3.
- Skill Hermes et analyse → tâche 6.
- Politique de rétention/purge des logs → tâche 7.
- Découverte réseau de machines → hors tâche 2.
Ces points sont mentionnés comme contexte d'emboîtement mais ne sont pas conçus en détail ici.