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
+9 -3
View File
@@ -41,13 +41,19 @@ def test_advance_processes_forward_then_idempotent(tmp_path, monkeypatch):
ts, *_ = ps._signal(j)
st = _fresh_state(j, back=60)
st = ps.advance(st, j)
assert st["n_bars"] == 60 # ha processato le 60 barre forward
assert st["last_ts"] == int(ts[-1])
# ⚠️ 2026-08-26: l'attesa "== 60" codificava il DIFETTO §5.1 — l'ultima barra del
# pannello e' il giorno IN CORSO e advance() ora la salta finche' non e' chiusa.
# L'attesa giusta si DERIVA dal filtro di produzione, non si ridichiara (P1).
from src.live.paper_guard import MS_1D, nuove_chiuse
attese = len(nuove_chiuse(ts, int(ts[-61]), MS_1D))
assert attese in (59, 60) # 60 solo se il pannello finisce su barra chiusa
assert st["n_bars"] == attese
assert st["last_ts"] == int(ts[attese - 61]) # la punta CHIUSA, non la punta del pannello
assert st["cap_modeled"] != ps.MODELED_CAPITAL # l'equity si è mossa
# idempotente: ri-avanzare alla punta non aggiunge barre né muove l'equity
eq_before = st["cap_modeled"]
st2 = ps.advance(dict(st), j)
assert st2["n_bars"] == 60
assert st2["n_bars"] == attese
assert st2["cap_modeled"] == eq_before