diff --git a/docs/diary/2026-06-12-resting-reconcile-feedgap.md b/docs/diary/2026-06-12-resting-reconcile-feedgap.md index 11f5408..9d91a22 100644 --- a/docs/diary/2026-06-12-resting-reconcile-feedgap.md +++ b/docs/diary/2026-06-12-resting-reconcile-feedgap.md @@ -72,3 +72,37 @@ hourly_report girano da host → già attivi). cerbero-mcp rebuildato (endpoint) invariante "il conto cambia solo per nostri ordini" è affidabile. Il reconciler orario è l'unico rilevatore; valutare cadenza più fitta in presenza di posizioni reali aperte. + +## Addendum (pomeriggio, v1.1.28): orfani single-leg + circuit-breaker venue-lock + +I due punti promossi dall'analisi sviluppi, entrambi figli dell'incidente di oggi: + +1. **Orfani anche per i close single-leg.** `REAL_CLOSE_PARTIAL` ora registra la + quota residua in `StrategyWorker.orphan_legs` (stessa semantica dei pairs, + persistita in status.json, letta da `books.real_books`) → il reconciler vede + il drift come SPIEGATO invece che anomalo (il caso MR07 0.102 ETH delle 09:47 + restava invisibile ai libri). Inoltre `_close_position` ora persiste lo stato + a fine booking (prima solo al save del tick: un crash li' in mezzo perdeva + capital e orfano). NB: nessun save a meta' chiusura — con `real_in_position` + ancora true l'orfano conterebbe doppio nei libri. +2. **Circuit-breaker venue-lock in `ExecutionClient`.** Dopo `lock_trip=3` reject + 'locked' consecutivi (es. `locked_by_admin` di oggi) le APERTURE sono sospese + senza toccare l'API (Fill failed → path REAL_OPEN_FAIL/sim_fallback esistente; + per i pairs entrambe le gambe rifiutate localmente → niente leg parziali da + unwindare, niente fee sprecate). Le CHIUSURE si tentano SEMPRE (path gia' + sicuro: partial/orphan/netting) e un loro reject 'locked' rinfresca il + cooldown. Riarmo: dopo `lock_cooldown_s=900` la prossima apertura fa da probe. + Alert `VENUE_LOCK` al trip + RIENTRATO al primo ordine accettato. + +Test: `test_single_leg_orphan.py`, `test_venue_lock_breaker.py` (126 passed). + +## Chiusura incidente (13:05): testnet sbloccato, conto riallineato + +Sequenza eseguita a venue sbloccato: stop runner → `reset_flatten` (chiusi i due +artefatti del rollback: ETH long 0.141 @1664.25, SOL long 0.7 @66.651, conto FLAT) +→ svuotati gli `orphan_legs` di ETH_SOL (le quote orfane non esistono piu' sul +conto post-flatten; edit a container fermo, altrimenti il worker li riscrive +dalla memoria) → restart. **Reconciler: OK — conto allineato ai libri** (posizioni +e resting), runner healthy, log puliti. Il ledger NON e' stato toccato: i booking +dell'incidente erano gia' dichiarati (`sim_fallback`/real) e l'equity (€2020.82) +resta la verita' contabile del paper.