Skip to content

0043 centralisation de l observabilite dans le filterchainexecuto

ADR-43 — Centralisation de l'observabilité dans le FilterChainExecutor

Statut : Décidé (issue #473, 2026-04-08)

Contexte : Le diagnostic Phase 2.2 (#473) a montré que le BacktestEngine tentait de reconstruire manuellement un funnel à partir d'une map statique (_funnel_map). Cette duplication de logique a généré des hallucinations (ex: after_meta=0 alors que le filtre était absent de la chain).

Décision : La responsabilité du calcul du taux de survie des signaux est déléguée exclusivement au FilterChainExecutor. Aucun composant amont (Orchestrateur) ou aval (Engine) ne doit implémenter sa propre logique de comptage.

Invariants : - Le funnel est généré par introspection dynamique de la liste des filtres actifs au moment de l'exécution - Tout signal entrant dans la chaîne doit être tracé avec un état explicite par étage : PASSED, REJECTED, ou SKIPPED (si non évalué suite à un court-circuit ou absence dans le preset) - L'objet FilterChainResult doit encapsuler nativement les statistiques du funnel avant d'être retourné - Aucun consommateur (BacktestEngine, PortfolioEngine, PaperTradingEngine) ne reconstruit le funnel depuis chain_results

Fichiers concernés : src/commun/filters/chain_executor.py, src/commun/models/filters.py, src/backtest/cvntrade_backtest_engine.py