fix(live): 4 hardening da code-review — REAL_DIVERGENCE, outage su feed vuoto, bars.py condiviso, DSL cancel retry

Review multi-agente 7-angoli su 8c4e1cd..HEAD + check trades live:

1. Alert Telegram REAL_DIVERGENCE quando |slippage sim/reale| >= 100bps a
   open/close. Causa scatenante: spike print testnet 10:37 (candela 10:00
   H=65618, O/C ~62400) -> 3 fade BTC short su close fantasma 65266.5, reale
   fillato a 62395 (-440bps), sim +2.26 mai esistiti — passato in silenzio.
2. FEED_OUTAGE anche su feed degradato SENZA eccezione (HTTP 200 + candles
   vuote: i worker saltavano il tick in silenzio, streak a 0). Helper unico
   _outage_tick; chiavi payload uniformate (minuti su start e RIPRESO).
3. src/live/bars.py: detection forming-bar unificata (bar_ms_of /
   last_bar_is_forming / last_settled_idx) — era copiata in 4 punti
   (strategy_worker, basket, pairs, _check_stale_feed hardcoded 1h).
   E' l'invariante di sicurezza EXIT-16: ora una sola implementazione testata.
4. DSL cancel hardening in _real_close: retry su errore transitorio + alert
   REAL_DSL_CANCEL_FAIL se lo stop resta forse orfano sul book (prima l'id
   veniva dimenticato in silenzio); order_not_found = probabile trigger in
   outage -> solo log (il close a valle esce gia' verified=False).

Refutato il finding top dei finder ("stop_market senza trigger"): cerbero-mcp
traduce price->trigger_price+mark, e in produzione 2 DSL armati + 1 ciclo
completo pulito (MR07_BTC).

Test: 83/83 (9 nuovi: bars helper + DSL/divergence con executor finto).
Smoke testnet 4 scenari verdi, conto flat, zero falsi allarmi.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-06-07 14:59:58 +00:00
parent 7bf8b197e0
commit f5173fba06
9 changed files with 294 additions and 48 deletions
+28
View File
@@ -66,6 +66,34 @@ zero ordini orfani sul book), conto flat a fine smoke.
"flat/risk-off by-design" da "wiring rotto". I multi-asset sono esclusi dalla
tabella IN CORSO (assume entry/bars single-leg).
## Code review multi-agente del giorno stesso (v1.1.7)
Review a 7 angoli su `8c4e1cd..HEAD` + check trades live. Il candidato top dei finder
("stop_market senza trigger") è REFUTATO: cerbero-mcp traduce `price→trigger_price +
trigger=mark_price` e in produzione 2 DSL erano armati + 1 ciclo completo pulito.
Quattro fix applicati:
1. **Alert `REAL_DIVERGENCE`** (|slippage sim/reale| ≥ 100bps a open/close). Scoperta
dal check trades: alle 10:37 uno **spike print testnet** (candela 10:00 H=65618 con
O/C~62400) ha fatto shortare alle 3 fade BTC un close fantasma a 65266.5 — il reale
ha fillato correttamente a ~62395 (440bps) ma il sim ha bookato +2.26 mai esistiti
(MR07 reale 0.13). Prima passava in silenzio.
2. **`FEED_OUTAGE` anche su feed degradato senza eccezione** (HTTP 200 con candles
vuote → i worker saltavano il tick in silenzio e lo streak restava 0). Helper unico
`_outage_tick` (fix anche dell'incoerenza chiavi minuti/durata_min).
3. **`src/live/bars.py`**: detection forming-bar UNIFICATA (era copiata in 4 punti,
con `_check_stale_feed` che hardcodava 1h). È l'invariante di sicurezza di EXIT-16:
ora vive in un posto solo, testato (`test_bars.py`).
4. **DSL cancel hardening**: retry su errore transitorio + alert Telegram
`REAL_DSL_CANCEL_FAIL` se lo stop resta forse ORFANO sul book (prima l'id veniva
dimenticato in silenzio → lo stop stantio poteva colpire la posizione successiva);
`order_not_found` = probabile trigger durante outage → solo log (il close a valle
esce già verified=False). Test con executor finto (`test_real_close_dsl.py`).
Finding noti NON ancora fixati (in coda): ROT02/TSM01 valutano la candela 1d in
formazione al primo poll dopo mezzanotte (stessa classe del fix TR01/Pairs, pre-esistente);
engine dei gate copiato fra i 3 script `*_port06_impact.py`; epoche hourly_report hardcoded.
## Resta in roadmap (settimana 2, OGNUNO dietro gate PORT06/OOS)
trend_max=3.0 sulle 6 fade → pos pairs 0.15-0.25 per-famiglia → DIP01 EXIT-16