Production Controls CVNTrade¶
Version : 1.0 Date : 2026-04-10 Statut : specification (pas encore implemente)
Ce document definit les controles de production pour le runtime CVNTrade. Il couvre le kill switch, l'observabilite, l'alerting, la detection de drift, le rollback et le deploiement progressif.
1. Kill Switch¶
Env var¶
CVN_KILL_SWITCH=1 arrete immediatement toute activite de trading.
Valeur par defaut : 0 (trading actif).
Comportement attendu¶
| Composant | Reaction a CVN_KILL_SWITCH=1 |
|---|---|
| Runtime service (port 8030) | Health-check retourne {"status": "HALTED"}. Aucun signal n'est transmis a l'adapter. Sessions ouvertes passent en PAUSED. |
| Backtest engine | Skip du run avec log event=kill_switch_active action=skip. |
| DAG Airflow (pre-check) | Task check_kill_switch echoue avec message explicite. Le DAG ne s'execute pas. |
Points d'implementation¶
- Runtime : verifier
CVN_KILL_SWITCHau debut de chaque cycle de candle dans le session actor. - Backtest : verifier dans
_run_candle_loop_ldp()et_run_candle_loop_legacy()avant la boucle principale. - DAGs : ajouter un
ShortCircuitOperatoren premier task de chaque launcher DAG.
Declenchement manuel¶
# Activer le kill switch
kubectl set env deployment/cvntrade-runtime CVN_KILL_SWITCH=1 -n cvntrade
# Desactiver le kill switch
kubectl set env deployment/cvntrade-runtime CVN_KILL_SWITCH=0 -n cvntrade
Via Helm (persistant) :
Log event (ADR-32)¶
2. Observabilite¶
Point d'entree unique : Grafana (ADR-26).
Metriques Prometheus¶
| Metrique | Type | Labels | Description |
|---|---|---|---|
cvntrade_candle_latency_seconds |
Histogram | crypto, stage |
Latence par etape du pipeline (enrichment, inference, filters, execution) |
cvntrade_pnl_total |
Gauge | crypto |
P&L cumule par crypto |
cvntrade_pnl_drawdown_pct |
Gauge | crypto |
Drawdown courant en pourcentage |
cvntrade_filter_block_total |
Counter | crypto, filter |
Nombre de signaux bloques par filtre (CUSUM, trend, confidence, meta, regime, cost, kelly) |
cvntrade_filter_pass_total |
Counter | crypto, filter |
Nombre de signaux passes par filtre |
cvntrade_prediction_distribution |
Histogram | crypto, class |
Distribution des probabilites BUY/HOLD |
cvntrade_feature_psi |
Gauge | crypto, feature |
PSI par feature (mis a jour par batch quotidien) |
cvntrade_prediction_psi |
Gauge | crypto |
PSI des predictions par rapport a la distribution de training |
cvntrade_positions_open |
Gauge | crypto |
Nombre de positions ouvertes |
cvntrade_signal_count_total |
Counter | crypto, signal |
Compteur de signaux BUY/HOLD emis |
Dashboard Grafana : Production Controls¶
| Panel | Source metrique | Visualisation |
|---|---|---|
| Kill Switch Status | cvntrade_kill_switch_active |
Stat (vert/rouge) |
| P&L par crypto | cvntrade_pnl_total |
Time series |
| Drawdown courant | cvntrade_pnl_drawdown_pct |
Gauge avec seuils 5%/10% |
| Latence pipeline | cvntrade_candle_latency_seconds |
Heatmap |
| Taux de blocage par filtre | cvntrade_filter_block_total / (block + pass) |
Bar chart |
| Distribution predictions | cvntrade_prediction_distribution |
Histogram |
| Feature drift (PSI) | cvntrade_feature_psi |
Table triee par PSI desc |
| Positions ouvertes | cvntrade_positions_open |
Stat par crypto |
Log events (ADR-32)¶
Chaque action de controle produit un evenement structure :
event=position_opened crypto=BTCUSDC side=BUY size=0.15 confidence=0.72
event=position_closed crypto=BTCUSDC side=SELL reason=tp pnl=+1.2%
event=filter_blocked crypto=BTCUSDC filter=cusum candle_ts=2026-04-10T12:00:00Z
event=drift_detected crypto=BTCUSDC feature=rsi_14 psi=0.25 action=warn
event=kill_switch status=active source=auto trigger=drawdown_critical
3. Alerting¶
Seuils et severites¶
| Signal | WARN | CRITICAL | Action WARN | Action CRITICAL |
|---|---|---|---|---|
| Drawdown | > 5% | > 10% | Notification Slack | Kill switch automatique |
| Feature drift (PSI) | > 0.2 | > 0.3 | Trigger retrain | Kill switch automatique |
| Prediction drift (PSI) | > 0.2 | > 0.3 | Trigger retrain | Kill switch automatique |
| Latence pipeline | > 2s | > 5s | Notification Slack | Notification PagerDuty |
| Exchange rate limit | > 80% utilisation | > 95% utilisation | Throttle (doublement du cooldown) | Pause des requetes 60s |
| Position age | > 2x horizon | > 3x horizon | Notification Slack | Force close |
| Health check failure | 1 echec consecutif | 3 echecs consecutifs | Log warning | Restart pod |
Canaux d'alerte¶
| Severite | Canal | Delai cible |
|---|---|---|
| WARN | Slack #cvntrade-alerts |
< 1 min |
| CRITICAL | Slack #cvntrade-alerts + PagerDuty |
< 30s |
Implementation¶
Alerting via Grafana Alerting (unifie avec ADR-26) : - Alert rules definies dans le dashboard Production Controls - Contact points : Slack webhook + PagerDuty integration - Notification policies : route CRITICAL vers PagerDuty, WARN vers Slack uniquement
4. Drift Detection¶
Methode : PSI (Population Stability Index)¶
PSI mesure la divergence entre la distribution de reference (training) et la distribution courante (production).
| PSI | Interpretation | Action |
|---|---|---|
| < 0.1 | Pas de changement significatif | Aucune |
| 0.1 - 0.2 | Changement modere | Monitoring renforce |
| 0.2 - 0.3 | Changement significatif | Trigger retrain (WARN) |
| > 0.3 | Rupture de distribution | Kill switch (CRITICAL) |
Perimetre¶
- Features : PSI calcule sur les top-20 features par importance (selon le modele XGBoost). Stocke dans
cvntrade_feature_psi. - Predictions : PSI calcule sur la distribution des probabilites BUY. Stocke dans
cvntrade_prediction_psi.
Frequence¶
| Timeframe | Frequence de calcul | Fenetre de reference |
|---|---|---|
| 30m | Quotidien | Derniers 7 jours vs training set |
| 5m | Toutes les 6h | Derniers 24h vs training set |
Stockage¶
- Metriques temps reel : Prometheus (retention 15j)
- Audit log : fichier JSONL par crypto, un record par batch
- Format :
{"ts": "...", "crypto": "...", "features": {"rsi_14": 0.12, ...}, "prediction_psi": 0.08, "action": "none"} - Chemin :
logs/drift/{crypto}_drift.jsonl
Distribution de reference¶
La distribution de reference est calculee a partir du training set et stockee comme artifact MLflow lors de l'entrainement. Elle est chargee par le runtime via CacheInterface.get_training_distribution().
5. Rollback Procedure¶
5.1 Rollback modele (< 5 min)¶
Quand : modele en production degrade (drift, performance, bug).
Procedure :
-
Identifier le modele N-1 dans MLflow :
-
Promouvoir N-1 en Production (ADR-42 : promotion atomique par crypto) :
-
Redemarrer le runtime pour forcer le rechargement :
-
Verifier dans Grafana que le modele charge est bien la version N-1.
5.2 Rollback config¶
Quand : changement de configuration ayant degrade le comportement.
# Rollback Helm (source de verite pour la config runtime)
helm rollback cvntrade-runtime <revision> -n cvntrade
# Ou git revert si le changement est dans values-prod.yaml
git revert <commit-sha>
# Puis redeploy via CI
5.3 Feature flag : version override¶
CVN_MODEL_VERSION_OVERRIDE permet de forcer une version specifique du modele, independamment du stage MLflow.
Quand cette variable est definie, le runtime charge la version specifiee au lieu de la version Production. Log event :
Pour retirer l'override :
5.4 Etat des sessions¶
Les sessions sont event-sourced (ADR-41). Un rollback de modele n'affecte que les futures predictions. Les sessions en cours conservent leur historique complet et peuvent etre rejouees avec le nouveau modele si necessaire.
6. Staged Rollout¶
Etapes¶
| Etape | Perimetre | Duree | Critere de passage |
|---|---|---|---|
| Shadow | 1 crypto (UNI) | 24-48h | Predictions loggees, pas d'execution. Comparison avec modele actif. |
| Canary | 1 crypto (UNI) | 24h minimum | Execution reelle, capital reduit (10% du capital cible). |
| Expansion | Groupe complet (ex: defi) | 48h | Canary valide, metriques stables. |
| Full rollout | Toutes les cryptos | - | Expansion validee. |
Shadow mode¶
Le nouveau modele tourne en parallele du modele actif. Il recoit les memes candles, produit des predictions, mais ne genere aucun ordre.
Env var : CVN_SHADOW_MODE=1
Metriques comparees : - Distribution des predictions (BUY rate, confidence moyenne) - Taux de filtrage par chaque filtre - P&L simule vs P&L reel du modele actif
Log event :
Canary¶
Procedure :
- Promouvoir le nouveau modele sur UNI uniquement (ADR-42 : promotion atomique par crypto).
- Configurer le capital canary :
- Monitorer 24h dans Grafana.
Criteres de succes canary :
| Metrique | Seuil |
|---|---|
| Drawdown | < 5% |
| Latence pipeline | < 2s p95 |
| Feature PSI | < 0.2 |
| Nombre de trades | > 0 (le modele n'est pas muet) |
| Erreurs runtime | 0 |
Full rollout¶
Apres validation canary :
- Promouvoir le modele sur les cryptos du groupe une par une.
- Attendre 1h entre chaque promotion pour verifier la stabilite.
- Retirer les overrides canary :
Rollback en cas d'echec¶
A chaque etape, si un critere de succes echoue :
- Activer le kill switch si CRITICAL.
- Rollback modele (section 5.1).
- Post-mortem avant nouvelle tentative.
References ADR¶
| ADR | Sujet | Lien avec ce document |
|---|---|---|
| ADR-26 | Grafana point d'entree unique | Dashboard Production Controls |
| ADR-30 | Logs structures = interface stable | Format des log events de controle |
| ADR-32 | Format event=name key=value | Tous les evenements de ce document |
| ADR-39 | Runtime standalone | Kill switch dans le runtime service |
| ADR-41 | Sessions event-sourced | Rollback sans perte d'etat |
| ADR-42 | Promotion atomique par crypto | Canary et staged rollout |
| ADR-54 | Adaptive Event Engine | Moteur d'evenements adaptatif pour les controles de production |