ajoute les alertes Prometheus du self-healing et installe Larastan (dette de l'étape 8, 72 erreurs corrigées à la racine)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-12 21:32:52 +02:00
parent f2649d0f8b
commit d47e8356fc
23 changed files with 340 additions and 22 deletions

View file

@ -748,3 +748,28 @@ La vraie difficulté du self-healing n'est pas de détecter une panne, c'est de
**Suite**
Prochaines étapes du bloc A : TURN 443 pour la visio, sauvegarde OpenStack (fait le 2026-10-12), pilote avec une vraie classe. Pas de montée de version d'OpenStack (décision d'Adam : la 2025.2 reste en place).
## 2026-10-12 — Alerte Prometheus pour le self-healing, et Larastan (dette de l'étape 8)
**Alerte Prometheus**
- Trois règles ajoutées (`kolla/config/prometheus/alertes.rules`) : `VmPanneGenerale` (critique, 5 min), `VmIrreparable` (avertissement, 5 min), `VmSurveillanceArretee` (si `labs:surveiller-vm` ne publie plus sa métrique, comme `CertificatNonMesure`).
- Déployées par `kolla-ansible reconfigure --tags prometheus` (service systemd, survit à une coupure SSH) : correctif en route, le premier essai a échoué faute du `PATH` du venv Kolla dans l'environnement du service — même piège que l'étape 5 (« install-deps : No such file or directory 'ansible-galaxy' »), corrigé en ajoutant `PATH=/opt/kolla-venv/bin:...` à `systemd-run`.
- Vérifié : les 3 règles chargées (`/api/v1/rules`, toutes `health: ok`) ; `VmIrreparable` injectée via l'API d'Alertmanager (comme à l'étape 7), reçue en « active ». Confirmation de la notification ntfy par Adam à faire.
- Au passage : le nom d'utilisateur de l'API Prometheus/Alertmanager n'est pas `prometheus` mais `admin` (lu dans la config réelle du conteneur, `prometheus.yml`) — à corriger partout où le runbook `supervision.md` dirait le contraire.
**Larastan (dette de l'étape 8, jamais traitée depuis)**
- `larastan/larastan` ^3.0 installé, `phpstan.neon` (niveau 6, `app/` seulement — les tests ont leur propre style Pest, pas une exigence du CLAUDE.md).
- 72 erreurs au premier passage, 0 à la fin, sans aucune suppression (`@phpstan-ignore`, baseline, `@var`) : chaque défaut corrigé à la racine.
- **33 generics manquants** sur les relations Eloquent (`BelongsTo<Related, $this>`, etc.) et `HasFactory<...>` : mécanique, mais a mis en évidence 3 modèles (`LabSession`, `LabSessionMachine`, `Seance`) qui utilisaient `HasFactory` sans qu'aucune factory n'existe pour eux — trait mort, retiré.
- **14 `property.notFound`/`method.notFound`** : conséquence directe des generics manquants (une relation sans type précis rend tous ses modèles liés `Model` générique aux yeux de PHPStan) ; disparues une fois les generics posés.
- **Vrai bug trouvé** (`StockChaud::estUtilisable`) : la signature `array{nom: string, id: string}` ne déclarait pas la clé `instances`, pourtant testée par le même `isset()` — PHPStan jugeait ce test « toujours vrai » sur les deux clés déclarées et « sur une clé inexistante » sur la troisième. La vraie origine du doute (une valeur décodée du JSON de Redis, donc jamais garantie par le type) a été redonnée à la signature (`array<string, mixed>|null`), avec un contrôle de type explicite sur `nom`/`id` : les `isset()` redeviennent un vrai rempart, pas une façade.
- **`Redis::eval()`/`Redis::lrem()` mal typés par la façade** : la classe que la façade Laravel donne à lire à PHPStan (`Illuminate\Redis\Connections\Connection`, abstraite) porte elle-même `@mixin \Redis` (l'extension native), jamais la classe réellement choisie à l'exécution (`PhpRedisConnection`, qui réordonne les arguments) — un angle mort documenté de Laravel/Larastan, pas un bug de Syllabus. Contourné en appelant `Redis::command('eval'|'lrem', [...])` directement (méthode réelle, pas un mixin), avec les arguments dans l'ordre que `PhpRedisConnection` leur donnerait — même effet, correctement typé.
- Une fermeture de `CreerStackLab` retournait le booléen de `->save()` là où `FabriqueStack::fabriquer()` attendait une fermeture `void` : changée en bloc explicite.
- Vérifié : `./vendor/bin/phpstan analyse` → 0 erreur ; Pint → aucun changement ; 54 tests Pest toujours au vert.
- Dette retirée.
**Comprendre**
La plupart des 72 erreurs venaient d'une seule cause répétée dix fois (des relations Eloquent sans generics), pas de dix bugs différents — las de ça, régler la cause réelle (les generics) a fait disparaître les trois quarts du travail d'un coup. Les erreurs qui restaient ensuite étaient plus intéressantes : deux ne venaient pas du code de Syllabus mais d'une imprécision des annotations de Laravel lui-même sur sa façade Redis, et une révélait un vrai défaut (une signature de type qui en disait moins que ce que le code vérifiait vraiment). La règle du prompt (« ne jamais juste faire taire l'outil ») a forcé à distinguer ces trois cas plutôt qu'à tout traiter de la même façon.