Documento Ufficiale di Esclusione Cause (“False Friends”)

Bug ID: BUG-FLAB-2025-11-12 - “Grafici corrotti – linee piatte/diagonali nel Forecast Lab” Data: 11 Novembre 2025 Stato: In Analisi (Fase Finale)

1. Scopo del Documento

Durante l’investigazione del bug dei grafici corrotti, sono state formulate e testate numerose ipotesi. Molte di queste si sono rivelate “falsi amici”: piste plausibili che, dopo un’analisi approfondita, sono state escluse. Questo documento le elenca e le archivia ufficialmente per evitare che future sessioni di debugging percorrano nuovamente queste strade, ottimizzando i tempi di risoluzione.

2. Riepilogo del Bug

  • Sintomo: Il grafico di backtest nel Forecast Lab visualizza una linea retta diagonale invece della serie storica reale del ticker.
  • Contesto: Il bug è emerso a seguito di un importante refactoring delle dipendenze del progetto.

3. Cause Escluse e Prove a Sostegno

Di seguito sono elencate tutte le cause ipotizzate e successivamente scartate, con le prove definitive che ne hanno invalidato la fondatezza.

Causa IpotizzataDescrizione dell’IpotesiProva Definitiva di EsclusioneStato
1. Corruzione dell’Indice dei Dati (RangeIndex)Si ipotizzava che, a causa di un aggiornamento di pandas, il DataFrame passasse una serie con un indice numerico (RangeIndex) invece di un DatetimeIndex, causando un plot y=x.Questa causa era reale per un primo bug, ma la sua correzione non ha risolto il sintomo finale. Abbiamo implementato un fix difensivo in main_window.py che garantisce la presenza di un DatetimeIndex. I log PLOT-DATA hanno confermato che la serie che arriva al plotting ha un indice temporale corretto.RISOLTO & ESCLUSO come causa del problema attuale.
2. Flusso dei Segnali Qt InterrottoSi ipotizzava che il segnale backtest_requested, emesso al click del pulsante, non fosse correttamente connesso al suo slot, interrompendo il flusso di esecuzione.L’aggiunta di log CRITICAL ha dimostrato che la connessione del segnale viene stabilita (UI-CONNECT) e che lo slot (_on_run_backtest_clicked) viene effettivamente chiamato (UI-CLICK).ESCLUSO
3. Errore API di PySide6Durante il debugging, un AttributeError e un TypeError hanno bloccato l’esecuzione dello slot, suggerendo un’incompatibilità API con PySide6.Questi errori erano reali ma erano stati introdotti dal nostro stesso codice di diagnostica. Una volta corrette le chiamate API (currentThreadId() currentThread()), il flusso di esecuzione è proseguito, dimostrando che non erano la causa radice del bug originale.ESCLUSO (era un “bug nel debug”)
4. Esecuzione di Codice Obsoleto (__pycache__)Si ipotizzava che Python stesse eseguendo versioni compilate e obsolete (.pyc) dei file, ignorando le nostre modifiche.La pulizia forzata delle cache e l’aggiunta di log con il percorso assoluto (__file__) hanno confermato che l’interprete sta caricando ed eseguendo i file corretti dalla nostra directory di lavoro.ESCLUSO
5. Esecuzione del Worker ErratoSi ipotizzava che il segnale fosse connesso a un worker diverso da ForecastBacktestWorker.I log BACKTEST-WORKER-FIRED hanno confermato che il worker corretto viene istanziato ed eseguito.ESCLUSO
6. Race Condition nella Visibilità della UISi ipotizzava che i dati venissero inviati al widget del grafico prima che questo fosse visibile (isVisible=False), causando il fallimento del rendering.Questa causa era parzialmente reale. Abbiamo implementato una soluzione robusta con un segnale ready per garantire che il plotting avvenga solo dopo l’inizializzazione del QWebEngineView. Tuttavia, anche dopo la risoluzione, il sintomo visivo persiste.RISOLTO & ESCLUSO come causa del contenuto errato del grafico.
7. Corruzione dei Dati (Valori)Si ipotizzava che, anche con un indice corretto, i valori della serie storica fossero corrotti (es. costanti, NaN, o una sequenza di interi).I log PLOT-DATA e PLOT-FIG mostrano in modo inconfutabile che i valori passati al plotting sono prezzi reali e non lineari (es. [9.85, 9.69, 9.63, ...]).ESCLUSO
8. Fallimento Silenzioso di runJavaScriptSi ipotizzava che la chiamata Python per eseguire il codice JavaScript fallisse silenziosamente, impedendo ai dati di raggiungere il frontend.L’aggiunta di una callback (_on_js_done) ha prodotto il log JS-DONE: OK, confermando che la chiamata viene eseguita con successo.ESCLUSO
9. Dimensione Eccessiva del JSONSi ipotizzava che il payload JSON fosse troppo grande per essere gestito da Qt WebEngine.Il log JS-SEND ha mostrato che la dimensione del JSON è di circa 90 KB, ben al di sotto dei limiti noti.ESCLUSO

4. Conclusione e Direzione Attuale dell’Indagine

Avendo escluso sistematicamente tutte le possibili cause legate al flusso di esecuzione Python, alla corruzione dei dati e alla comunicazione tra Python e JavaScript, l’indagine si concentra ora sull’ultimo anello della catena:

L’esecuzione del codice JavaScript window.renderPlotly all’interno del QWebEngineView.

Il problema risiede nel modo in cui la libreria Plotly.js interpreta i dati (che abbiamo dimostrato essere corretti) all’interno dell’ambiente di rendering fornito da Qt. Le prossime azioni di debugging saranno focalizzate esclusivamente sul frontend (JavaScript) per analizzare le dimensioni del div e il layout del grafico al momento del rendering.