# Protocole de validation — Tâche 8 (app locale Rust/GNOME) > **Type** : grille de validation. Utilisée après la mission décrite dans `tache8.md`. > **But** : vérifier que l'app locale future est conçue comme client API sûr, sans dupliquer la logique SSH/backend. > **Gate validé par l'utilisateur le 2026-06-05** : le développement Rust peut démarrer. > **Rappel** : l'app locale reste cliente du backend et ne remplace pas la webapp serveur. --- ## 0. Quand lancer cette validation - La mission `tache8.md` avance par incréments. - Les choix techniques Rust/GNOME restent argumentés au fur et à mesure. - Le contrat API attendu est défini avant chaque intégration UI. --- ## 1. Discipline & périmètre - [x] Le code Rust créé reste dans le périmètre `app_rust/system-update-gnome`. - [x] L'app locale reste future, pas bloquante pour la webapp MVP. - [x] L'app ne fait pas de SSH direct au MVP. - [x] Les credentials machines restent côté backend. - [x] Le design réutilise les contrats JSON existants. --- ## 2. Architecture - [x] Rust + GTK4/libadwaita étudié. - [x] Alternatives comme `relm4`/`iced` comparées si utile. - [x] Client HTTP/WebSocket défini. - [x] Cache local lecture seule défini. - [x] Notifications desktop prévues. - [x] Configuration serveur/token prévue. --- ## 3. API commune - [x] `/api/capabilities`. - [x] Machines/state/hardware/metrics. - [x] Snapshots/executions/reports/messages. - [x] Actions via backend. - [x] Live output via WS/SSE. - [x] Settings si scope admin. - [~] Erreurs structurées et version API. *(jalons 8.1/8.2 non encore couverts)* --- ## 4. Sécurité - [~] Token stocké via trousseau local. *(keyring prévu dans tache8.md §6 et plan_8.md jalon 8.3 ; pas encore implémenté)* - [x] Token jamais stocké en clair. *(README et règles explicites ; token lu en env var dans le scaffold — acceptable à ce stade)* - [x] Scopes de token définis. *(tache1.9.md api_clients + tache8.md §6)* - [x] Révocation/rotation prévues. *(tache1.9.md api_clients : champ revoked_at, status)* - [x] Actions dangereuses confirmées dans l'app. *(tache8.md §6)* - [x] Logs locaux sans secret. *(tache8.md §6 ; pas de log de token dans le scaffold)* - [~] HTTPS/certificats traités. *(api.rs rejette explicitement https:// avec un test nommé "until_tls_client_is_added" — accepté comme dette connue et documentée)* --- ## 5. UX native - [x] Layout GNOME HeaderBar/Sidebar spécifié. - [x] Tuiles machine adaptées. - [x] Détail machine avec onglets. - [x] Paramètres natifs spécifiés. - [x] Thème Gruvbox via tokens GNOME. - [x] Différences webapp/app locale assumées. --- ## 6. Cohérence avec objectif final webserver Docker Compose - [x] L'app locale consomme le serveur Docker Compose, elle ne le remplace pas. - [x] Le backend reste la source de vérité. - [x] La webapp reste utilisable sans app locale. - [x] Les API nécessaires sont compatibles avec un backend containerisé. --- ## 7. Verdict **🟡 Accepté avec réserves** Le premier incrément (jalon 8.0 et scaffold 8.3 partiel) est cohérent, bien périmétré et non bloquant pour le MVP web. Les réserves ci-dessous sont attendues et planifiées pour les jalons 8.1–8.3 ; elles ne remettent pas en cause la direction. --- ## 8. Notes de validation > 2026-06-05 — revue effectuée par l'orchestrateur (validation déléguée). ### Résumé de la revue **Périmètre scaffold** Le dossier `app_rust/system-update-gnome/` contient uniquement : `Cargo.toml`, `Cargo.lock`, `.gitignore`, `README.md`, `src/main.rs`, `src/api.rs`, `src/config.rs`. Le dossier `target/` est ignoré par `.gitignore`. Aucun fichier Rust n'a été créé en dehors de ce périmètre. Conforme. Le `Cargo.toml` déclare `edition = "2024"` et n'a aucune dépendance externe (`[dependencies]` vide), ce qui est cohérent avec la priorité « client API avant UI GTK » et permet un premier build vérifiable sans accès réseau. **Contrat API / capabilities** `GET /api/capabilities` est exposé par le backend (`server/routes/index.ts`), généré par `server/services/capabilities.ts`, typé dans `shared/types.ts` (`ServerCapabilities`). Le client Rust (`api.rs`) consomme cet endpoint. La chaîne est complète pour le jalon 8.0. **SSH direct** Aucune référence SSH dans le code Rust. Le README rappelle explicitement la règle. Conforme. **Credentials machines** Le scaffold ne manipule que l'URL serveur et un token API optionnel. Pas de credential machine. Conforme. **Sécurité token** Le token est lu depuis la variable d'environnement `SYSTEM_UPDATE_TOKEN` ou la CLI `--token`, jamais écrit dans un fichier. La crate `keyring` est bien listée dans `tache8.md §4` et dans la checklist §11 ; son implémentation est planifiée au jalon 8.3. Acceptable à ce stade ; à réaliser avant tout déploiement. **HTTPS** Le client HTTP artisanal (`std::net::TcpStream`) supporte uniquement `http://` et rejette `https://` avec un test unitaire explicitement nommé `rejects_https_until_tls_client_is_added`. C'est une dette assumée et documentée. À traiter (crate `rustls` ou `reqwest` avec TLS) avant toute utilisation hors localhost. **Erreurs structurées / version API** Non encore couverts dans le code Rust (jalons 8.1/8.2). La structure de base existe côté backend (`apiVersion: "1"` dans capabilities). La tache8.md §5 liste les besoins. Réserve mineure. **Cohérence inter-tâches** - `tache1.9.md` : table `api_clients` avec `token_hash`, `scopes_json`, `status`, `revoked_at` — cohérente avec le modèle de sécurité de tache8.md. - `tache5.md` : `GET /api/capabilities` listé parmi les endpoints API ; cohérent. - `design_system/tokens/tokens.gnome.css` : fichier présent, référencé dans tache8.md §4 et §11 ; le scaffold ne l'utilise pas encore (normal : UI GTK pas commencée). - `tache7.md` : référencé pour sécurité token/cache/metrics — cohérent. - L'app ne remplace pas la webapp, elle en est cliente. Conforme à l'objectif Docker Compose. ### Réserves (non bloquantes pour ce jalon) 1. **HTTPS/TLS** : à implémenter avant tout usage hors localhost (jalon 8.3). La dette est documentée dans le code. 2. **Keyring** : le token n'est pas encore stocké via le trousseau système. À réaliser au jalon 8.3 avant toute distribution. 3. **Erreurs structurées et pagination** : jalons 8.1/8.2 non démarrés ; nécessaires avant l'UI GTK. 4. **Choix GTK4 direct vs relm4** : case du gate cochée (comparaison mentionnée dans tache8.md) mais la décision formelle est reportée au démarrage du jalon 8.4 (normal à ce stade). ### Coquilles corrigées Dans `plan_8.md` : - Sections 5 et 6 étaient inversées dans l'ordre de numérotation (section 6 apparaissait avant la section 5) : corrigé. - Faute de conjugaison ligne 120 : « pour que tu commence le dev » → « pour que tu commences le dev » : corrigé.