0fbca06d3d
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>
183 lines
12 KiB
Markdown
183 lines
12 KiB
Markdown
# 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é**.
|