# 2026-08-26 — `advance()` riparato e rigenerato, quattro debiti chiusi in un giorno Quattro debiti di CLAUDE.md §5 chiusi: **§5.1** (advance + rigenerazione + guardia), **§5.12** (isolamento test esteso), **§5.5** (test di leva cancellato con nota), **§5.9** (test rosso indagato e ancorato). Suite: **751 passati, 0 falliti** — tutta verde per la prima volta dal ~24/08. ## §5.1 — advance() consuma solo barre CHIUSE, e le serie sono RIGENERATE **Il fix** (`src/live/paper_guard.py` + 6 monitor): la riga `new = [i for i in range(len(ts)) if ts[i] > last_ts]` diventa `PG.nuove_chiuse(ts, last_ts, cadenza)` — una barra open-labeled e' chiusa quando `ts + cadenza <= adesso`. Filtro condiviso, importato da tutti e sei i monitor (anche `paper_combo`, che era sano *per caso*: ora e' sano *per costruzione*). ⚠️ **D6 pagata DI NUOVO scrivendo il fix:** la prima stesura di `indice_chiuso` usava `asi8` assumendo nanosecondi — pandas 3 usa `us` di default, e l'intero nella scala sbagliata dava "chiusa" la barra del giorno in corso **senza eccezioni**. Beccata dal test di fumo, riparata con la sottrazione dall'epoca (la forma di `resample_tf`), e blindata da un test che prova `ns/us/s`. *La regola che stavo cablando e' quella che stavo violando.* **La guardia** (era "raccomandata e non cablata"): `monitor_health` ha ora lo stato **PREMATURO** — ultima barra che chiude DOPO l'mtime del file, grazia 5 min. Derivata dalle spec esistenti (P1), con `open_labeled=False` per `collect_chain` che timbra i giri, non barre (P14: senza il flag avrebbe allertato sempre). Controllo positivo sul dato vivo: **ha segnalato esattamente i 5 rotti e taciuto sui 2 sani** prima della rigenerazione; dopo, 7/7 OK. **La rigenerazione** (`scripts/live/paper_regen.py`): stesso `start_ts` pre-registrato, config congelata, replay del codice di produzione riparato — il metodo validato due volte dall'audit del 22/08 (0 barre chiuse cambiate su 1.427/1.488 + 6/6 al bit). Vecchi file archiviati come `*.pre_regen_20260826.*` (evidenza del difetto, nel perimetro di backup). **Nessuna data di gate si sposta.** | monitor | barre | Sharpe rotto → vero | |---|---|---| | `paper_statarb` (gate **27/09**) | 58 → 57 | **+1,95 → −1,61** — il ribaltamento previsto dall'audit | | `paper_dvolspread` (kill 24/10) | 32 → 31 | −14,73 → −4,41 | | `paper_xsr` (gate 23/10) | 32 → 31 | −4,98 → −2,72 | | `paper_prevday` | 1584 → 1584 | +0,39 → +0,40 | `paper_portfolio` **non** rigenerato (gamba GTAA su ADJUSTED_LAST ri-aggiustato: il replay non sarebbe la serie registrata — P12); tolta la sola coda non chiusa, cosi' la guardia non resta accesa per sempre su un difetto gia' riparato (P14). Storia pre-fix dichiarata corrotta. ## §5.12 — un test non puo' piu' scrivere nel libro di bordo vivo `tests/conftest.py`: oltre al watermark, ora deviati **`trades.db`** (wrapper su `connect` — il default e' catturato alla definizione, patchare la costante non serviva a niente) e **`docs/journal/`** (pagine tracciate da git). Per `book_executions.jsonl`, che i test caricano ad-hoc con importlib e conftest non puo' raggiungere prima: **impronta a inizio suite, verifica a fine suite**, col falso positivo possibile (fill reale del cron :47 durante la suite) dichiarato nel messaggio. ## §5.5 — il test di leva e' CANCELLATO, non aggiustato `test_leva_massima_da_config_resta_sotto_o_uguale_a_1x` misurava `frac x n_asset`: con una chiave di scala la grandezza vera diventerebbe `frac x n_asset x scala` e il test avrebbe continuato a passare smettendo di controllare. Al suo posto una nota che rimanda al tetto sul PRODOTTO di GATE SCALA-01, da cablare nel codice che leggera' la chiave, quando esistera'. ## §5.9 — il test rosso non segnalava un guasto: segnalava una banda scritta male `r0826_skh_band_drift.py` — feed tagliato a date crescenti, stesso codice di produzione: | taglio | Sharpe hold-out | |---|---| | 02/07 (audit) | **1,6376** — riproduce l'audit | | 25/07 (banda cablata) | 1,5751 | | 01→15/08 | 1,566 → 1,547 (scivola piano) | | **22/08** | **1,8966** | | oggi | 1,9306 — riproduce il rosso | **Il dato regge** (in-sample 1,424 **identico su ogni taglio**; il taglio all'epoca riproduce l'epoca). Il codice non c'entra. 📌 **La scoperta vera: la SOLA settimana 15-22/08 (rally ETH con SKH01 long) vale +0,35 di Sharpe hold-out** — il numero e' cosi' fragile, e chi cita "hold-out 1,9" oggi citerebbe 1,55 di una settimana fa. Coerente con §2: l'hold-out canonico di SKH01 era gia' il numero da non citare. **La riparazione:** il test ora **taglia il feed al 02/07** e verifica la riproduzione stretta (±0,02) di full/in-sample/hold-out/maxDD. Si rompe se cambiano codice o dato sulla finestra congelata — e per nessun altro motivo. La deriva del vivo non e' affare suo: per quella ci sono i monitor (e da oggi la guardia PREMATURO). Nel farlo, un altro inciampo istruttivo: la prima esecuzione del drift stampava **sette righe identiche** — `run_asset` memoizza in un dict di modulo (`_CACHE`), non in `lru_cache`, e lo svuotamento non lo toccava. Anche il test riparato ora pulisce quel dict, prima E dopo, per non avvelenare gli altri test. ## Conseguenze sui gate (nessuna data si muove) - **STATARB 27/09**: il monitor ora misura la serie vera (**−1,61** a oggi). Coi criteri pre-registrati invariati, a oggi punta al RITIRO — si legge quel giorno, non prima. - **XSR01 23/10 / DVOLSPREAD 24/10**: metrica primaria finalmente su serie reali. Restano i difetti dichiarati (§5.3 pavimento del gate XSR01; veto DVOLSPREAD ora sorvegliato dalla guardia).