# Metodo: gate e harness > Estratto **verbatim** da `CLAUDE.md` il 2026-08-25 durante la compattazione. > I gate codificati in `altlib.py` che ogni candidato deve attraversare. > Il testo non e' stato riscritto: e' la memoria originale, spostata. --- - **MARGINAL SCORER (implementato 2026-06-20)** — la lezione "Sharpe marginale, non assoluto" è ora codice in `scripts/research/alt/altlib.py`: `study_marginal(name, target_fn)` valuta un candidato direzionale BTC/ETH **sia** in assoluto **sia** rispetto al baseline `tp01_baseline_daily()` (corr, uplift del blend OOS, beta+alpha residua) e ritorna `earns_slot = (abs!=FAIL) AND (marginal==ADDS)`. **Regola: una nuova strategia direzionale si giudica su `earns_slot`, non sullo Sharpe assoluto** (gli overlay-su-TSMOM ereditano lo Sharpe di trend e prendono PASS fasulli — es. CMB04 PASS assoluto → NEUTRAL marginale). Demo `marginal_demo.py`, test `tests/test_marginal_scorer.py`. ⚠️ **INDURITO 2026-06-21 (onda ortho):** la versione fisso-HOLDOUT + jackknife-mese era ingannabile — 17/18 book relative-value "ADDS" su una sola finestra 2025 (ETH-bleed dove TP01 è debole). Tre gate nuovi in `marginal_vs_tp01`: **(1) persistenza multi-cut** (uplift positivo a più date di taglio, non solo 2025); **(2) edge in-sample** (`has_insample_edge`: lo Sharpe standalone PRE-holdout dev'essere ≥0.5 — un low-corr a Sharpe ~0.3 "aggiunge" solo matematica di diversificazione, riportata via `null_pctl_*` vs un asset-rumore a corr-zero); **(3) hedge vs alpha** (`is_hedge`: un low-corr che paga SOLO quando TP01 è debole — `corr(Sharpe-TP01, uplift annuo)` molto negativa — è un hedge, non alpha). Verdetti nuovi: HEDGE, NOISE. Sull'onda ortho lo scorer indurito collassa 17/18 → **1** (`dvol_spread`, unico con edge in-sample reale; comunque forward-monitor per multiple-testing/storia DVOL corta). Lezione: un nuovo sleeve si giudica su edge-in-sample + persistenza multi-cut + non-hedge, non sull'uplift di una finestra fortunata. - **HARNESS REALISM (codificato 2026-06-21, onda intraday)** — due gate nuovi in `altlib.py`, test `tests/test_harness_realism.py`: - **`day_boundary_robust(target_fn, tf)`** — un effetto ora/sessione/giorno il cui uplift marginale **si inverte** spostando il confine del giorno UTC di poche ore è un **artefatto di etichettatura calendario** (ha ucciso `open_drive`: +0.23 a 00:00 → −0.33 a +8h → ARTIFACT-RISK). Un segnale di prezzo è INVARIANT (spread 0); un effetto calendario vero è ROBUST (resta positivo; es. `prevday_range_breakout`). **Regola: ogni segnale calendar/session/hour passa questo test prima di crederci.** - **`eval_weights_smallcap(df, target, capital=600, min_order=5)`** — a ~$600 un ribilanciamento di nozionale < min_order **non si esegue**; la fee proporzionale che `eval_weights` applica a migliaia di micro-trade sub-dollaro (tipici di un overlay vol-target) è **finzione**. Salta i sub-min_order e riporta lo **Sharpe haircut** reale vs modellato. **Vale per OGNI sleeve a questo capitale, TP01 incluso** — lo Sharpe netto onesto a $600 è quello small-cap, non quello modellato. - **SELECTION-ON-HOLDOUT gate (codificato 2026-06-29, filone B intraday ERM)** — terzo gate in `altlib.py`, test `tests/test_harness_realism.py`. Il lead ERM faceva `earns_slot=True` MA lo script di scoperta sceglieva la cella per **`min_hold` massimo** su 60+ celle = **selezione-sull'hold-out**: scegliendola in-sample-only ne esce un'altra (trend-beta corr→TP01 0.53, NEUTRAL) e il deflated-Sharpe crolla (DSR 0.0-0.24 su 122 trial). `study_marginal` da solo non lo vede (giudica UNO stream, non *come* è scelto). Tre funzioni: **`deflated_sharpe()`** (Bailey & Lopez de Prado, PASS ≥0.95), **`select_cell_insample()`** (cella scelta col solo Sharpe pre-HOLDOUT), e il gate combinato **`study_family_honest(name, factory, grid, tfs)`** → `earns_slot_honest = earns_slot[cella in-sample] AND deflated-Sharpe≥0.95`. **Regola: una strategia direzionale grid-searched si giudica con `study_family_honest`, non chiamando `study_marginal` sulla cella a max hold-out.** Chiude il punto cieco gemello di CC01 ("Sharpe implausibile"). Diario `2026-06-29-intraday-regime.md` (analisi `scripts/research/intraday_regime_analysis.py`).