feat: workflow n8n d'alerte + doc, fin Phase 3 (v0.18.0)

Export JSON workflows-n8n/chlova-alerts.v1.0.0.json (webhook → mail,
formate par type d'alerte) + doc d'asset (palier privileged, rollback).
ALERT_WEBHOOK_URL dans .env.example + compose (vide = log-only).
need-review.md : alertes implémentées. Compose revalidé, 53 tests, 0 vuln.

Palier de risque : privilégié (workflow envoie des mails) — désactivable
via ALERT_WEBHOOK_URL vide ; non exécuté depuis le dépôt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kantin-Petit
2026-06-23 01:54:46 +02:00
parent db96c4a25e
commit b617487d0d
7 changed files with 121 additions and 3 deletions
+40
View File
@@ -0,0 +1,40 @@
## CHLOVA Alerts
- **Type** : `workflow-n8n`
- **Version** : `v1.0.0`
- **Palier de risque** : `privileged` (envoie des mails / sortie externe)
- **Statut (need-review)** : `n/a` (créé à la main, hors auto-extension)
- **Lien commit** : voir tag `v0.18.0`
- **Créé le** : 2026-06-23
- **Fichier** : `workflows-n8n/chlova-alerts.v1.0.0.json`
### Rôle
Reçoit les alertes du backend CHLOVA (webhook) et envoie un mail. Met en œuvre la
stratégie anti-fatigue : tentative bloquée, 1ʳᵉ exécution provisoire, rappel J-1,
digest quotidien (voir `docs/need-review.md`).
### Entrées / sorties
- **Entrée** : `POST /webhook/chlova-alert`, corps JSON
`{ source, ts, kind, ... }` (`kind` ∈ blocked_attempt | first_provisional_exec |
countdown_j1 | daily_digest). Jamais de secret.
- **Sortie** : un mail (sujet + corps formatés par le node *Format mail*).
### Dépendances
- n8n (instance existante) + credential **SMTP** (`SMTP CHLOVA`, à créer dans n8n).
- Backend : variable `ALERT_WEBHOOK_URL` = URL de ce webhook (par **référence**).
### Sécurité
- Le webhook ne reçoit que des métadonnées (ids/types/statuts/dates).
- Destinataire et identifiants SMTP vivent dans n8n (jamais dans le dépôt) :
remplacer `toEmail` et le credential `smtp` après import.
- Palier `privileged` : sortie mail externe.
### Rollback
- Désactiver/supprimer le workflow dans n8n ; ou vider `ALERT_WEBHOOK_URL` côté
backend → retour au log-only (`NullAlertSender`), sans rupture.
- `git revert` du commit pour retirer l'export.
### Tests / vérification
- Importer le JSON, brancher SMTP, exécuter un `POST` de test avec
`{"kind":"daily_digest","blocked":1,"provisional":0,"items":[]}` → mail reçu.
- Le dépôt fait foi : ré-exporter le workflow ici après toute modif (bump version).
+13 -3
View File
@@ -50,8 +50,18 @@ peut alors valoir `false`).
- `git revert` du commit de l'asset fautif ; redeploy version N-1 (GitOps).
- Un asset REFUSÉ reste tracé (audit) ; suppression via op SQL manuelle si besoin.
## Reste à faire (Phase 3+)
- Alertes mail via n8n (1ʳᵉ exéc provisoire, digest quotidien, rappel J-1,
alerte BLOQUÉ) — actuellement un simple hook de log `onBlockedAttempt`.
## Alertes (Phase 3 — implémenté)
Stratégie anti-fatigue (`src/alerts/`) :
- **tentative bloquée** → alerte immédiate (`onBlockedAttempt`) ;
- **1ʳᵉ exécution d'un asset PROVISOIRE** → alerte immédiate (`onFirstProvisionalExec`) ;
- **digest quotidien** + **rappel J-1**`startAlertScheduler` (`runAlertCycleOnce`).
Transport : `HttpAlertSender` POST vers `ALERT_WEBHOOK_URL` (webhook n8n) ; sans
URL, `NullAlertSender` log-only (fail-safe). Best-effort : une panne d'alerte ne
casse jamais l'agent. Le mail est envoyé par le workflow
`workflows-n8n/chlova-alerts.v1.0.0.json` (doc : `docs/assets/workflow-chlova-alerts.md`).
Le payload ne contient aucun secret.
## Reste à faire (Phase 4+)
- Auto-extension : CHLOVA génère commit + version + doc d'un asset **avant**
de le passer en need-review (Phase 4).