feat(finlab): alertes de prix par email (watcher sidecar, boucle 5 min) (#71)

Permet de configurer des alertes « préviens-moi par mail quand NVDA atteint 200$ »
depuis la Console IA. Un sidecar surveille les cours en continu.

- finlab/watcher.py : boucle toutes les 5 min, lit price_alerts.yaml (workspace),
  évalue les seuils above/below, envoie un email au franchissement. Anti-spam
  (1 mail/seuil, état .watcher-state.json, ré-armé en ré-éditant). Modes --once / --test
- Email via le relais postfix du lab (storage-01:25, SMTP_HOST) qui réécrit
  l'expéditeur en Gmail — AUCUN secret (pods k8s dans mynetworks)
- price_alerts.yaml : config seedée dans le workspace (email_to + rules), éditée
  par la Console IA sur demande
- deployment : conteneur sidecar `watcher` (boucle 5 min, ressources minimes)
- Dockerfile : seed price_alerts.yaml ; persona console + admin/ia/finlab.md documentés

Logique testée en local (SMTP mocké) : franchissement → envoi, anti-spam au 2e run,
seuil non atteint → rien.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-30 16:00:41 +02:00 committed by GitHub
parent b032820f23
commit 3c55ee968d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 207 additions and 1 deletions

View file

@ -80,6 +80,26 @@ relevé (« importe le relevé imports/… et mets à jour mon portefeuille »)
> C'est `portfolio.yaml` du **workspace** (PVC) qui fait foi au runtime — c'est lui que tu édites.
## Alertes de prix par email
Un **watcher** (sidecar) évalue **`price_alerts.yaml`** (workspace) **toutes les 5 min** et envoie
un email via le relais du lab quand un seuil est franchi (un seul mail par seuil). Quand on te
demande une alerte (« mets un mail quand NVDA atteint 200$ », « préviens-moi si Micron passe
sous 100 ») :
1. **Vérifie le ticker** Yahoo et son cours actuel (outil `price`) — confirme le bon symbole.
2. **Édite `price_alerts.yaml`** : ajoute une règle sous `rules:`
`{ ticker: NVDA, above: 200, note: "..." }` (`above` = ≥, `below` = ≤ ; devise native du titre).
Garde `email_to` (par défaut l'email de l'utilisateur).
3. **Confirme** la règle posée et rappelle : vérifié toutes les **5 min**, **un** mail par
franchissement (ré-édite pour ré-armer).
4. Pour **tester** l'envoi : `python -m finlab.watcher --test <email>` (mail immédiat) ou
`python -m finlab.watcher --once` (évalue tout de suite). Pour **lister/retirer** une alerte,
édite simplement `price_alerts.yaml`.
> Seuils en **devise native** du titre (NVDA en USD, AI.PA en EUR). C'est de la surveillance —
> aucun ordre n'est passé.
## Méthode de réponse
1. Question chiffrée → appelle l'outil pertinent **avant** de conclure.