monitor: advance() consuma solo barre CHIUSE — serie rigenerate, guardia PREMATURO, 4 debiti chiusi

S5.1 RIPARATO E RIGENERATO. Filtro condiviso src/live/paper_guard.py (barra
open-labeled chiusa = ts + cadenza <= adesso) importato da tutti e 6 i monitor;
serie rigenerate dallo stesso start_ts con scripts/live/paper_regen.py (evidenza
in *.pre_regen_20260826.*): statarb +1,95 -> -1,61 (il ribaltamento del gate
27/09 previsto dall'audit), dvolspread -14,73 -> -4,41, xsr -4,98 -> -2,72,
prevday invariato. Nessuna data di gate si sposta. Guardia cablata in
monitor_health: stato PREMATURO (ultima barra che chiude dopo l'mtime, grazia
5 min, open_labeled=False per collect_chain) — sul dato vivo segnala i 5 rotti
e tace sui 2 sani; dopo la rigenerazione 7/7 OK. paper_portfolio non rigenerato
(GTAA su ADJUSTED_LAST: replay != serie registrata, P12), tolta la coda non
chiusa. D6 pagata di nuovo nel fix: asi8 in pandas 3 e' in us, non ns —
blindata con test su tre risoluzioni.

S5.12 ESTESO: conftest devia anche trades.db (wrapper su connect: il default
e' catturato alla definizione) e docs/journal/; book_executions.jsonl
sorvegliato con impronta inizio/fine suite.

S5.5 FATTO: test_leva_massima cancellato con nota (misurava frac*n_asset:
con una chiave di scala avrebbe continuato a passare smettendo di controllare).

S5.9 INDAGATO E RIPARATO (r0826_skh_band_drift): il dato regge (taglio 02/07
riproduce l'audit 1,6376, in-sample identico su ogni taglio); la deriva era la
finestra hold-out — e la sola settimana 15-22/08 vale +0,35 di Sharpe hold-out.
Il test ora taglia il feed al 02/07 e verifica la riproduzione stretta.

Suite: 751 passati, 0 falliti.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B9UyJLHzR7EJzxR3iQ3RN1
This commit is contained in:
Adriano Dal Pastro
2026-08-26 10:12:23 +00:00
parent a51844875b
commit d597fc64e8
20 changed files with 872 additions and 54 deletions
+18 -13
View File
@@ -79,17 +79,22 @@ def test_skh01_e_piu_sensibile_alla_fee_di_tp01():
# ===========================================================================
# guardia di decisione: la leva su cui poggia "liquidation fee irrilevante"
# guardia di decisione RIMOSSA (2026-08-26) — e il perche' va letto, non saltato
# ===========================================================================
def test_leva_massima_da_config_resta_sotto_o_uguale_a_1x():
"""La conclusione 'liquidation fee 1% irrilevante' vale perche' il cap di live.json
limita il nozionale lordo a <= 1x l'equity (2 asset x equity/2), con disaster-SL a -30%.
Se il cap sale, quella conclusione NON vale piu': questo test deve rompersi."""
cfg = json.loads((ROOT / "config" / "live.json").read_text())
frac = cfg.get("max_notional_per_asset_frac")
assert frac is not None, "cap dinamico rimosso: rivedere l'analisi liquidation fee"
leva_max = frac * len(FS.ASSETS)
assert leva_max <= 1.0, (
f"leva massima {leva_max:.2f}x > 1x: la liquidation fee 1% torna rilevante, "
"rivedere r0726_fee_sensitivity e il diario 2026-07-26-fee-deribit.md")
assert cfg.get("disaster_sl_pct", 0) > 0, "disaster-SL disattivato: idem"
# Qui viveva `test_leva_massima_da_config_resta_sotto_o_uguale_a_1x`: verificava che
# `max_notional_per_asset_frac x n_asset <= 1.0`, a presidio della conclusione
# "liquidation fee 1% irrilevante" (r0726_fee_sensitivity).
#
# E' stato CANCELLATO, non aggiustato, per la ragione registrata in CLAUDE.md §5.5:
# misurava `frac x n_asset`, ma se il progetto introducesse la chiave di scala di
# SPEC-scale-key la grandezza vera diventerebbe `frac x n_asset x scala` — e questo
# test avrebbe CONTINUATO A PASSARE smettendo di controllare (P1: un sorvegliante che
# non deriva il bersaglio dal codice sorvegliato passa sempre). Una guardia che passa
# a bersaglio cambiato e' peggio di nessuna guardia: certifica una proprieta' che non
# vale piu'.
#
# La guardia GIUSTA e' gia' scritta nella spec: GATE SCALA-01 impone il tetto sul
# PRODOTTO `n_asset · frac · scala · disaster_sl_pct <= 0,50` — va cablata QUANDO (se)
# la chiave di scala entrera' in config, dentro il codice che la legge, non qui.
# Fino ad allora: la leva resta 1,0x per costruzione (nessuna chiave di scala esiste,
# verificato in §3 di CLAUDE.md) e il disaster-SL e' presidiato dai test del book.