# 99 — Auto-évaluation de couverture du gate `validation_tache2.md` > Relecture case par case. ✅ = couvert ; ⚠️ = couvert avec réserve / hors périmètre design (à confirmer en implémentation). Légende des renvois : fichiers de `docs/design/tache2/`. --- ## §1 Discipline & périmètre | Case | État | Renvoi | |---|---|---| | Aucun code de production modifié (server/client/shared/templates/configs) | ✅ | Seuls `docs/design/tache2/**` + section clôture `tache2.md` créés. À vérifier par `git status`. | | Jalon 1 et jalon 2 intacts | ✅ | Aucun fichier de jalon touché. | | Aucun autre chantier hors périmètre | ✅ | Hors-scope listés comme suggestions (`00-synthese.md §6`). | | Dépôts de référence non copiés | ✅ | `nas-ops`/`linux-update-dashboard` cités en inspiration, pseudo-shell réécrit. | ## §2 Complétude — Axes | Axe | État | Renvoi | |---|---|---| | A — Templates APT + sémantique + profils OS + proxy | ✅ | `10-templates-apt.md`, `60-profils-os-machine.md` | | B — Capture prévu/appliqué consommable Hermes | ✅ | `40-contrats-json.md` (snapshot/diff/dédup/réduction) | | C — Taxonomie erreurs + remédiation | ✅ | `50-erreurs.md` | | D — Docker scan/pull/up/down/prune + détection + JSON | ✅ | `20-docker.md` | | E — Scripts personnalisés + overrides + garde-fous | ✅ | `30-scripts-custom.md` | ## §2 Complétude — Livrables §4 | Livrable | État | Renvoi | |---|---|---| | Inventaire des templates | ✅ | `10` §2, `20` §2, `30` §2/§4 | | Contenu proposé (pseudo-shell, `===SU:XXX===`) | ✅ | `10` §4, `20` §4, `30` §4 | | Schémas JSON canoniques étendus | ✅ | `40` | | Taxonomie des erreurs | ✅ | `50` | | Modèle profils OS + overrides | ✅ | `60` | | Modèle profils machine | ✅ | `60` §5 | | Modèle scripts personnalisés | ✅ | `30` | | Note de sécurité | ✅ | `70` | | Découpage en sous-jalons priorisé | ✅ | `80` | ## §2 — 8 questions d'investigation | | État | Renvoi | |---|---|---| | Q1–Q8 tranchées (MVP/alternatives/risques) | ✅ | `90-questions-investigation.md` | ## §3 Cohérence & intégration | Case | État | Renvoi | |---|---|---| | Types JSON compatibles `shared/types.ts`, rétro-compatibles | ✅ | `40` §1–§4 (champs optionnels, payload jalon 1 valide) | | Convention templates (`===SU:`, `LC_ALL=C`, `sudo -S`, parsable) | ✅ | `10`/`20`/`30` | | Parsing (JSON-in-shell vs TS) explicite et justifié | ✅ | `90` Q1, `40` §7 | | Couche SSH réutilisée (`server/ssh/client.ts`) | ✅ | `00` §4, `90` Q6 | | Frontière Hermes/MCP, réduction déterministe | ✅ | `70`, `40` §7 | | Sécurité actions destructives + pas de secret | ✅ | `70` §1/§2 | | Profils OS n'invalident pas Debian/Ubuntu prod | ✅ | `60` §2 (fallback `base`) | | Sous-jalons indépendamment implémentables | ✅ | `80` | ## §4 Non-régression | Case | État | Note | |---|---|---| | `pnpm check`/`test`/`build` verts | ⚠️ | Hors périmètre design (aucun code touché) ; à exécuter par l'orchestrateur. Aucune modification de code n'a été faite. | | Flux jalon 1 inchangés | ✅ | Extensions additives uniquement ; templates jalon 1 non modifiés. | ## §6 Focus Docker Compose | Case | État | Renvoi | |---|---|---| | Gestion par SSH, réutilise couche existante, `docker context` = alternative | ✅ | `20` §1 | | Stacks depuis racines déclarées `composeRoots`, scan limité, validation UI | ✅ | `20` §1/§4.1 | | Détection labels en complément | ✅ | `20` §1/§4.1 | | Stack détecté = `candidate`, actions sur `enabled` seulement | ✅ | `20` §1 | | `scan-compose.sh.tpl` (fichiers compose, ignore .git/node_modules/backup/old/archive, `config --quiet`) | ✅ | `20` §4.1 | | `inspect-compose.sh.tpl` (`config --images`, `ps --format json`, `images --format json`, `image inspect`) | ✅ | `20` §4.2 | | `pull-check.sh.tpl` (`pull --policy always --ignore-buildable`, compare ID/digest/labels, non passif) | ✅ | `20` §4.3, §1 tableau | | `apply-compose.sh.tpl` (`up -d --remove-orphans`, recapture) | ✅ | `20` §4.4 | | `prune-images.sh.tpl` (safe `-f`, agressif `-a -f --filter until=168h` validé) | ✅ | `20` §4.5 | | `down-compose.sh.tpl` (séparé/destructif, `--volumes`/`--rmi` interdits) | ✅ | `20` §4.6 | | Flux 1→8 formalisé | ✅ | `20` §3 | | `pull` télécharge sans démarrer | ✅ | `20` §3 | | `up -d` recrée si changement, préserve volumes, `down` inutile | ✅ | `20` §3 | | `prune -f` vs `-a` (destructif) | ✅ | `20` §2/§3 | | Sources Docker citées | ✅ | `20` §1 | | Snapshot Docker rétrocompatible (bloc optionnel) | ✅ | `40` §3 | | Bloc snapshot Docker (stacks/services/ID/digest/labels/candidat/statut) | ✅ | `40` §3 (« bloc Docker minimal ») | | `ExecutionResult.docker` (pull/up/prune/erreurs/recréés/supprimés/octets) | ✅ | `40` §4 | | Erreurs Docker structurées (10 codes) | ✅ | `50` §3 | | Réduction Hermes (lignes Docker) + log brut archivé | ✅ | `20` §5, `40` §7 | | Config machine (`dockerEnabled`/`composeRoots`/`composeScanDepth`/`composeStacks[]`) sans casser `MachineView` | ✅ | `20` §6, `40` §5 | | Refresh combiné apt+docker ou Docker séparé | ✅ | `20` §6 | | `ActionType` étendu (docker_*) + filtrage autorisation | ✅ | `40` §2, `20` §6 | | Réutilise `executions`/WS/`rawLogPath`/`reportPath`/statut | ✅ | `20` §6 | | UI compteur Docker séparé + détail + boutons validés | ✅ | `20` §6 | | Validation UI apply/prune agressif/down ; Hermes ne déclenche pas | ✅ | `20` §6, `70` §2 | | Secrets registry jamais lus ; erreurs nettoyées | ✅ | `20` §6, `70` §1 | ## §7 Focus APT/reboot | Case | État | Renvoi | |---|---|---| | `apt_update_analyze` distinct des upgrades destructifs | ✅ | `10` §2, `40` §2 | | update + `-s upgrade` + `-s dist-upgrade` | ✅ | `10` §4.1 | | Snapshot liste paquets prévus (nom/cur/cible/origine/arch) | ✅ | `10` §4.1, `40` §3 | | Distingue upgrade vs full/dist (maj/install/remove/held) | ✅ | `10` §4.1, `40` §3 | | Simulations parsées via `Inst`/`Conf`/`Remv`, log brut archivé | ✅ | `10` §1/§4.1 | | Statut `ok/updates_available/warning/error`, warning si remove/held | ✅ | `10` §4.1, `40` §3 | | Sources APT citées | ✅ | `10` §1 | | Distingue `os_family` et `machine_kind` à l'ajout | ✅ | `60` §1/§6 | | Choix manuel OS (Debian/Ubuntu/Proxmox/RPi/autre) | ✅ | `60` §6 | | Choix manuel type (VM/physique/Proxmox/LXC/RPi/GPU-workstation) | ✅ | `60` §6 | | `machine_probe` détecte/corrige | ✅ | `60` §6 | | Scripts dépendent du couple OS/type | ✅ | `60` §5 | | Debian firmware vérifie contrib/non-free/non-free-firmware | ✅ | `60` §4 | | Proxmox = profil dédié | ✅ | `60` §2/§4 | | Scripts hardware/drivers/benchmark jamais par défaut, validation | ✅ | `60` §5 | | Templates APT attendus (update-analyze/upgrade/full-upgrade/autoremove/clean/reboot-check/reboot) | ✅ | `10` §2/§4 | | Politique non interactive (`noninteractive`, `-y`, confdef/confold) | ✅ | `10` §4.2, `50` §2 | | Justification confdef/confold | ✅ | `10` §4.2, `50` §2 | | Prompts traités comme risques de blocage | ✅ | `50` §2 | | Timeout inactivité/global → erreur contrôlée | ✅ | `50` §2 | | `human_interaction_required` prévu | ✅ | `50` §2 | | Pas seulement exit code | ✅ | `50` §1, `10` §4.2 | | dpkg-query before/after | ✅ | `10` §4.2 | | Diff backend (maj/install/remove/inchangé/versions/anomalies) | ✅ | `40` §4, `90` Q4 | | `ExecutionResult.apt` (planned/applied/installed/removed/held/errors/reboot) | ✅ | `40` §4 | | Rapport MD résume diff + réf log | ✅ | `70` §4, `40` §8 | | Reboot vérifié (boot_id avant/après, attente, reconnexion) | ✅ | `10` §4.5, `40` §4 | | Reboot ok si revient ET boot_id changé | ✅ | `10` §4.5 | | `RebootResult` (beforeBootId…status/errors) | ✅ | `40` §4 | | Délai adaptatif par machine | ✅ | `10` §4.5, `40` §4 | | Statuts d'échec reboot distingués | ✅ | `40` §4 (`RebootResult.status`) | | Reboot = action validée ; Hermes ne déclenche pas | ✅ | `70` §2 | | `apt_update_analyze` alimente snapshot + tuile | ✅ | `10` §6, `20` §6 | | Actions via même route + table `executions` | ✅ | `20` §6, `10` §6 | | UI avant exécution (paquets/suppressions/held/reboot/risque) | ✅ | `70` §2, `40` §3 (renvoi tâche 3 pour le rendu) | | UI après exécution (réussite/diff/reboot/rapport/log) | ✅ | `70` §4 (renvoi tâche 3) | | Confirmation UI pour dist/full/autoremove/reboot | ✅ | `70` §2 | | Nouveaux champs/actions rétrocompatibles | ✅ | `40` §1/§2 | ## §8 Focus post-install | Case | État | Renvoi | |---|---|---| | Interdit questions interactives SSH → champs formulaire | ✅ | `30` §1 | | Profils cochables dépliant leurs champs | ✅ | `30` §1/§3 | | Manifeste (`id`/`label`/`description`/`fields`/défauts/validations/preview/risk/confirmations) | ✅ | `30` §1/§3 | | Bouton désactivé si champs invalides | ✅ | `30` §1 | | Preview avec masquage secrets + signalement réseau/reboot | ✅ | `30` §1, `70` §1 | | Échec structuré si décision manquante | ✅ | `30` §1/§4 | | Profils attendus (bootstrap_root/identity_network/base_tools/network_tools/dev_git/sharing/docker_official/vm_guest_tools + optionnels) | ✅ | `30` §2 | | Champs `identity_network` | ✅ | `30` §3 | | Champs `docker_official` | ✅ | `30` §3 | | Champs `sharing` | ✅ | `30` §3 | | Champs `vm_guest_tools` | ✅ | `30` §3 | | Champs préremplis modifiables | ✅ | `30` §3 | | Exemple de manifeste | ✅ | `30` §3 | | Templates custom attendus (bootstrap/identity/install-package-groups/docker-official/sharing/vm-guest-tools) | ✅ | `30` §4 | | Sources citées | ✅ | `30` §4 | | identity_network à risque (confirmation/preview/sauvegardes) | ✅ | `30` §4.2, `70` §2 | | Résultat JSON ancien/nouveau endpoint + reconnectHost | ✅ | `40` §4 (`PostInstallResult.networkChange`), `30` §4.2 | | Pas de coupure sans stratégie reconnexion ; reboot via reboot_verified | ✅ | `30` §4.2 | | Webapp vérifie reconnexion + met à jour machine | ✅ | `30` §4.2 | | Erreurs réseau distinguées (6 codes) | ✅ | `50` §4 | | `ExecutionResult.postInstall` rétrocompatible | ✅ | `40` §4 | | Résultat liste profils/variables non sensibles/fichiers/paquets/services/reboots/erreurs | ✅ | `40` §4 | | Secrets jamais inclus | ✅ | `30` §5, `70` §1 | | Changements réseau/Docker marqués dans rapport MD | ✅ | `30` §5, `70` §4 | | Même mécanique (templates/preview/SSH/WS/executions/rapport/log) | ✅ | `30` §6 | | Valeurs réutilisables stockées (où) | ✅ | `30` §6 (`script_variables_presets`/`machine_profile_state`) | | Hermes propose/explique, JSON réduit, pas de déclenchement risqué | ✅ | `30` §6, `70` §2/§3 | | Profils découpés en sous-jalons indépendants | ✅ | `80` SJ-8/SJ-9 | --- ## Réserves résiduelles (⚠️) 1. **Non-régression build/tests (§4)** : non exécutée dans cette mission de design (aucun code touché, par consigne). L'orchestrateur doit lancer `pnpm check/test/build` pour confirmer 0 régression — attendu vert puisque aucune modification de code. 2. **Rendu UI fin (§7/§8 « UI avant/après »)** : le design pose les données et les exigences ; le rendu visuel exact relève de la **tâche 3**. Couvert au niveau contrat/exigence, pas au niveau JSX. 3. **Détails Mustache vs Go-templates Docker** : les `{{ }}` de `docker inspect --format` entrent en conflit avec Mustache ; le pseudo-shell le signale (échappement) — choix de délimiteurs à figer en implémentation (SJ-4). Aucune réserve bloquante identifiée. Verdict visé : **✅ Accepté**.