fix(exec): code-review serale — guard anti-posizione-nuda sul netting + verità per-frazione
7 finder paralleli sul diff della giornata (8adf388..HEAD), fix dei confermati: CRITICI (money-path): - close_amount: GUARD stato-stantio sul fallback netting — il residuo non-reduce-only e' consentito solo fino al gap (conto reale - libri degli altri worker - orfani) nella direzione della chiusura (src/live/books.py = fonte unica, usata anche dal reconciler). Senza guard, un close su stato stantio (DSL scattato in outage, flatten manuale) APRIVA una posizione nuda a taglia piena bookata come 'chiusura verificata'. Fail-safe se il gap non e' calcolabile. Check polvere PRIMA di _quantize_step (che clampa al lotto minimo: un residuo 1e-17 diventava un ordine nudo da un lotto). - _real_close: market_amt = filled_amount anche a merged verified=False (i contratti chiusi dal reduce-only non si buttano se il leg netting fallisce); REAL_CLOSE_PARTIAL non piu' gateato su verified (era soppresso proprio nel caso parziale reale). - pairs: verita' per-FRAZIONE di gamba (gross proporzionale al fillato, orfano = solo il residuo — prima falsava reconciler e real_capital della parte gia' chiusa); REAL_OPEN_PAIR booka filled_amount; docstring applied corretta. - open_pair unwind: chiude il FILLATO, non il richiesto (senza il cap silenzioso del reduce-only avrebbe mangiato quota altrui). - place_tp_limit: quantize CONSERVATIVO (sell=floor/buy=ceil) — il rounding al tick piu' vicino poteva mettere il resting oltre il TP sim -> tocco genuino classificato phantom sistematicamente. ROBUSTEZZA/OSSERVABILITA': - runner: WORKER_ERROR_STREAK a 5 e poi ogni 50 poll + recovery RIPRESO + flag real_in_position nell'alert (prima: one-shot a n==5, poi silenzio). - _tp_phantom: TTL 120s sul verdetto (era ~50 HTTP/h per worker a barra fantasma); merge notes con entrambi gli order_id (audit-trail). - reset_flatten: _quantize_step Decimal (round float produceva amount che Deribit rifiuta); hourly_report: book XS01 con gambe SHORT visibili (abs). - validate_xsec_worker: POS/LEV importati (non hardcoded); xs01_tranche: regression-lock ESEGUITO vs xsec_sim; reconcile su src/live/books; drift_monitor: rolling vettoriale + exit code 1 su warn. Test: +4 guard/dust, fixture filled_amount -> 114 passed. Deferiti (TODO): resting esposti al netting, lifecycle orphan_legs, finestra trade-history TP_PHANTOM, validazione feed a monte, dedup minori. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -65,6 +65,33 @@
|
||||
- [ ] **epoche hardcoded in `hourly_report.lossguard_section`** (LOSSGUARD_SINCE, TRENDSWAP_SINCE):
|
||||
ogni nuova epoca-filtro richiede di editare la funzione. Derivarle da deploy history/config.
|
||||
|
||||
## Code-review 2026-06-11 sera (8a2b065..) — finding DEFERITI (i confermati critici sono fixati in v1.1.26)
|
||||
|
||||
- [ ] **RESTING reduce-only esposti al netting** (TP limit + disaster-SL): se un worker opposto
|
||||
apre DOPO il piazzamento, il resting può fillare parziale o essere respinto — il fallback
|
||||
netting copre solo i close sincroni. È il pezzo "position manager / sotto-conti" già noto;
|
||||
lo scenario peggiore è il disaster-SL cappato proprio nel crash per cui esiste.
|
||||
- [ ] **Lifecycle `orphan_legs`**: append-only — un orfano risolto a mano (o da reset_flatten)
|
||||
resta nello status e MASCHERA per compensazione un drift vero futuro (falso negativo del
|
||||
reconciler). Serve un comando di risoluzione (`--resolve-orphan`) e/o reset_flatten che
|
||||
azzeri anche lo stato reale nei status.json. Idem: il PnL della chiusura manuale di un
|
||||
orfano non viene mai bookato in real_capital (diagnostica shadow divergente).
|
||||
- [ ] **TP_PHANTOM residuo**: `resting_fills` guarda solo le ultime 100 righe di trade-history
|
||||
per strumento — su conto molto attivo un fill TP reale può scivolare fuori finestra →
|
||||
falso phantom persistente (sim resta in posizione, reale flat). Mitigato dal quantize
|
||||
conservativo (v1.1.26); fix vero = endpoint order-state in cerbero-mcp.
|
||||
- [ ] **Validazione feed a monte** (altitudine): TP_PHANTOM copre solo i tocchi TP dei single-leg;
|
||||
le ENTRY spike-driven, lo SL close-confirm su close spike e lo z dei pairs restano esposti
|
||||
ai wick fantasma del feed testnet. Un validatore barre nel data layer coprirebbe tutti i
|
||||
consumer con un meccanismo solo (su mainnet il fenomeno non esiste: priorità bassa finché
|
||||
si resta su testnet, gli eventi TP_PHANTOM/NET_CLOSE ne misurano la frequenza).
|
||||
- [ ] **Contratto dello schema status.json**: reconcile (`src/live/books.py`), hourly_report e i
|
||||
worker condividono lo schema per convenzione implicita — books.py è ora la fonte unica per
|
||||
i campi `real_*`, ma un helper `worker.real_book()` usato da _save e dai reader chiuderebbe
|
||||
la classe di bug. Pulizia: `_tp_hit` helper per i 4 siti di tocco TP duplicati; port_metrics
|
||||
ri-biforcato in xs01_tranche_gate/pairs30m_gate (importare da _port06_gate_common);
|
||||
splits3/metriche duplicate nei games engine (estrarre in scripts/games/engine.py).
|
||||
|
||||
## Ricerca dispersion/correlation (2026-06-08, 165 agenti) — follow-up opzionale
|
||||
|
||||
- [x] ~~Gate PORT06 di `index_comp_disp` W=168~~ — FATTO (2026-06-08): PROMOSSO MARGINALE.
|
||||
|
||||
Reference in New Issue
Block a user