tetto di leva letto con tre formule (usde cuscino, journal leva, journal movimenti): a scala 1,25 cuscino scoperto #28
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Revisione 2026-09-27 (goldrake): rilievo Opus 5.5, verifica avversariale fable. Sola lettura, nessun codice toccato.
Rilievo B5 [bug]
FILE: pg:src/live/usde.py:115-121 (usato da scripts/live/cuscino_watch.py:216 e scripts/live/usde_convert.py:147)
COSA: il cuscino di regolamento ignora la chiave di scala
book_scale_k: frazione = N_ASSET x WEIGHT x sl, mentre l'esposizione massima del libro e' N x frac x SCALA (book.book_net_target moltiplica perscala).SCENARIO: GATE SCALA-01 autorizza 1,25 (gradino ammesso da SCALA_LADDER e da LEVA_LORDA_MAX 1,25) -> esposizione max 1,25E, disaster-SL 0,375E; il cuscino resta 0,30E e il bersaglio quota 0,64 lascia USDC 0,36E < 0,375E: il cuscino e' scoperto per costruzione mentre cuscino_watch dice OK e usde_convert approva gli acquisti. Oggi latente (chiave assente in config/live.json).
PROVA: VERIFICATO: lettura — usde.frazione_cuscino non legge
book_scale_k; book.py:226-227return scala * max(-cap, min(cap, raw)); grep "scala|book_scale_k" in usde.py/cuscino_watch.py/usde_convert.py -> nessun risultato.PROPOSTA: frazione = N_ASSET x min(WEIGHT, frac) x book._scala(real_equity=1.0, cfg=cfg) x sl (la scala dichiarata, validata dallo stesso lettore); test che incrocia con scale_watch D3.
Verifica fable B5 VERDETTO: CONFERMATO
GRAVITA': medio (latente:
book_scale_kassente inconfig/live.json)PERCHE':
src/live/usde.py:115-121frazione_cuscino = N_ASSET x B.WEIGHT x sl, nessuna lettura dibook_scale_k;src/live/book.py:226-227return scala * max(-cap, min(cap, raw))-> esposizione max per asset = scala x equity x min(frac, WEIGHT);_scala(110-127) ammette 1,25 con frac 0,5 (leva 1,25 = LEVA_LORDA_MAX). A scala 1,25 il cuscino richiesto e' 0,375E e la formula dice 0,30E; bersaglio quota 0,64 -> USDC 0,36E < 0,375E. Nessuna nota in CLAUDE.md/config che dichiari il cuscino a scala 1,00 come scelta. Il giornale (journal.py:198-203) invece include la scala nel tetto di leva: due lettori, due formule (viola P1 che usde.py dichiara).CORREZIONE: proposta ok nella sostanza, con un'avvertenza:
book._scala(real_equity=1.0, cfg=cfg)SOLLEVAScalaNonAutorizzatasu config fuori scaletta/tetto -> infrazione_cuscinova catturata e resa come frazione al tetto di codice (LEVA_LORDA_MAX x sl) concomeche lo dichiara, altrimenti cuscino_watch muore e il cuscino resta senza sorveglianza proprio quando la config e' sbagliata (P5).Rilievo A8 [pulizia]
FILE: PG:src/live/usde.py:112,115-121
COSA: il cuscino di regolamento usa
B.WEIGHT(peso 50/50 degli asset) e N_ASSET=2 cablato, nonmax_notional_per_asset_fracne'book_scale_k: coincide oggi (0,5 = 0,5, k assente) ma e' la grandezza sbagliata — la massima esposizione lorda e' n_assetcap = nfracscalaequity.SCENARIO: book_scale_k = 1,25 (gradino ammesso da SCALA_LADDER) -> esposizione lorda max 1,25x, cuscino richiesto 37,5%, ma cuscino_watch continua a puntare a quota USDE 0,64 (cuscino 30%): il saldo USDC va negativo gia' dentro il disaster-SL.
PROVA: VERIFICATO: lettura usde.py:115-121 e book.py:106-133 (_scala valida frac*scala ma usde non lo usa); config _nota_usde dice "n_asset x frac x disaster_sl_pct".
PROPOSTA: frazione_cuscino = len(ASSETS) * max_notional_per_asset_frac * scala_configurata * disaster_sl_pct.
Verifica fable A8 VERDETTO: CONFERMATO
GRAVITA': basso
PERCHE': usde.py:112
N_ASSET = 2, :119frac = float(B.WEIGHT)— nonmax_notional_per_asset_fracne' la scala; il commento :107 e config_nota_usdedichiarano "n_asset x frac x disaster_sl_pct". Coincide oggi (WEIGHT 0,5 = frac 0,5, scala 1,0); diverge al primo gradino di book_scale_k o cambio di frac.CORREZIONE: ok (usare len(ASSETS), max_notional_per_asset_frac e la scala configurata).
Rilievo C16 [pulizia] (latente)
FILE: PG:src/live/journal.py:553-558 (regola
leva) vs journal.py:198-203 (movimenti_capitale)COSA: due tetti di leva nello stesso modulo: la regola
levausamax_notional_per_asset_frac × n_assete ignorabook_scale_kebook.LEVA_LORDA_MAX; il classificatore dei movimenti li include. Con scala 1,25 (tetto di codice) la pagina stampa un «margine» negativo con un libro dentro i limiti.PROVA: VERIFICATO (lettura); oggi scala 1,00 (cron_book.log «scala libro 1.00x (tetto 1.25x)»), quindi non morde.
PROPOSTA: una funzione
leva_tetto(cfg)usata da entrambe.COPERTURA: src/live/tradesdb.py, scripts/live/trades_db.py, src/live/analista.py, scripts/live/analista.py, src/live/revisione.py, scripts/live/revisione.py, scripts/live/telegram_daily.py, scripts/cron_daily.sh, scripts/cron_review.sh, src/live/dashboard.py (tutti per intero); src/live/journal.py; CLAUDE.md §5.12-16 e grep mirati; test eseguiti, non letti per intero.
Verifica fable C16 VERDETTO: CONFERMATO
GRAVITA': basso (latente: scala 1,00)
PERCHE':
journal.py:553-558regolaleva:tetto = cap_frac x n_asset(1,00), senzabook_scale_ke senzamin(..., LEVA_LORDA_MAX);journal.py:198-203movimenti_capitaleusamin(frac x n x scala, LEVA_LORDA_MAX). A scala 1,25 la pagina stamperebbe margine negativo con libro entro il tetto. Stessa famiglia di B5 (tre lettori del tetto di leva: usde.py, journal leva, journal movimenti).CORREZIONE: ok (
leva_tetto(cfg)unica, inbook, usata da journal x2 e da usde.frazione_cuscino — chiude B5 e C16 insieme).ANALISI (passo 1, Opus, 27/09/2026)
ANALISI U7 — gitea:Adriano/PythagorasGoal#28 (B5, A8, C16) + #35 A7
CARTELLA: /home/adriano/lavoro/PG-u7 RAMO: lavoro/goldrake-u7 (da main
841d4c7)PERCHE': il tetto di leva lorda e' letto con tre formule diverse (usde.frazione_cuscino, journal regola
leva, journal movimenti_capitale). A scala 1,25 il cuscino USDC risulta 0,30E mentre servirebbe 0,375E. Serve una sola funzione in book.MODIFICHE
_scala:def leva_tetto(cfg: dict | None = None) -> tuple[float, str]:
Leva lorda massima che il libro puo' prendere = len(ASSETS) x min(WEIGHT, frac) x scala, al piu' LEVA_LORDA_MAX.
comelo dice.come= testo leggibile, es. "2 asset x frac 0.5 x scala 1.0 = 1.00x"._scala.leva(~576-580) — tetto, come = _book.leva_tetto(cfg).config/live.jsonebook.leva_tetto): margine {tetto - lv:.2f}x."build_book_order(..., min_usd=5.0): leggeremin_order_usddalla config gia' letta in book_report (default 5.0 se assente, come fa book_execute.py:62). Oggi config = 5, quindi nessun cambio di comportamento.TEST (nuovo tests/test_leva_tetto.py)
comecontiene "tetto di codice".Suite:
cd /home/adriano/lavoro/PG-u7 && /opt/docker/PythagorasGoal/.venv/bin/python -m pytest -q -p no:cacheprovider. Baseline main: 1166 passed, 3 skipped.NON TOCCARE: la logica di _scala e di book_net_target; cuscino_watch/usde_convert (leggono gia' frazione_cuscino); config/live.json.
COMMIT: "book: leva_tetto unica per cuscino USDE e giornale (#28)" e "book: min_order_usd da config nel report (#35 A7)".
ESITO: fatto sul ramo, non in produzione
RIF: gitea:Adriano/PythagorasGoal#28
FILE: commit
52a905dsu lavoro/goldrake (pushato, HEADd34b0a8)PROVA: /home/adriano/lavoro/PythagorasGoal pytest -q → 1220 passed, 3 skipped
MANCA: merge su main con ok di Adriano; poi issue chiudi --soluzione
Soluzione
src/live/book.py leva_tetto(cfg) = len(ASSETS) x min(WEIGHT,frac) x scala (<= LEVA_LORDA_MAX; su ScalaNonAutorizzata torna il tetto di codice senza sollevare). Usata da usde.frazione_cuscino e dal giornale (movimenti_capitale e regola leva). Commit
52a905d.Su main
d34b0a8dal 27/09/2026 17:31Z, produzione aggiornata. Test 1220 passed.