Files
PythagorasGoal/docs/diary/2026-08-30-usde-quota-tetto-venue.md
T
Adriano Dal Pastro 30286ea033 venue_news: sorvegliare cosa il venue ANNUNCIA — e due correzioni dalla KB
Nasce dall'annuncio sulla fine della Proof of Reserves. La notizia in se' vale
poco: si perde un segnale ad alta frequenza e DEBOLE (una PoR auto-pubblicata
prova che gli attivi esistono in un istante, non che coprano le passivita') e si
guadagna un audit annuale indipendente sotto VARA piu' il 90% degli attivi presso
Coinbase come custode. E non l'abbiamo mai sorvegliata: zero occorrenze nel
codice. Rinunciato di proposito a catturare l'ultimo dato — uno snapshot singolo
auto-riportato non regge lo standard di prova e non permetterebbe di stimare `p`.

CONSEGUENZA VERA: la decisione "100% Deribit fino a $20k" ha fra i suoi riapritori
"`p` che diventa stimabile invece che assunto". Dal 1/9 il segnale pubblico passa
da quotidiano ad ANNUALE: da una serie si stima, da un punto all'anno no. Quel
riapritore diventa praticamente irraggiungibile => la decisione e' ora gated SOLO
dal capitale.

TROVATO CERCANDO: esiste un feed RSS degli exchange-update, e conteneva quattro
annunci materiali che nessuno leggeva. Il caso che decide: le specifiche dei perp
USDC sono cambiate il 18/08, ANNUNCIATE IL 14/08. check_specs() e' nato da quella
svista e gira ogni ora, ma rileva la deriva DOPO; il feed l'avrebbe detta quattro
giorni PRIMA. La prima volta e' andata bene solo perche' i cambi erano RIDUZIONI.

Costruito scripts/live/venue_news.py (in cron_daily accanto a fee_watch):
  - NON interpreta: dice "e' uscito questo, guardalo". Nessun automatismo su un
    testo di marketing (P13). Classifica solo l'urgenza.
  - parole-chiave DERIVATE da deribit._CONTRACT e config/live.json, non
    ridichiarate (P1): chi aggiunge un asset allarga la sorveglianza da solo, ed
    e' il test che lo blinda.
  - primo giro semina senza allertare (P9); feed illeggibile -> exit 2, mai
    silenzio implicito (P5).
Debito #8 si RESTRINGE, non si chiude: il Rulebook non ha un feed.

Confermato due volte lo zero USDC: l'espansione del 31/07 non contiene l'Italia
ne' alcun paese UE, mentre San Marino e Citta' del Vaticano SONO idonei. Non
asserisco una causa (ci sono anche Canada e Giappone).

DUE CORREZIONI dalla KB "Cross collateral specifications":
(a) Il saldo negativo costa una collateral fee dello 0,05% AL GIORNO = 18,25%/anno,
    al secondo — 4,3x la resa USDE. Il 30/08 avevo scritto "lo finanzia a
    interesse" SENZA il numero: giusto e vuoto. Col numero, il criterio del
    cuscino di regolamento diventa aritmetica (-14 punti). E il ribilanciamento
    automatico non salva: scatta a $1M assoluti o al 100% della cross equity,
    irraggiungibili a $2k. Non veniamo ribilanciati: sanguiniamo la fee.
(b) L'haircut USDe ufficiale e' 5%, noi abbiamo 0.10 registrato come "verificato
    sul venue" il 26/08 senza traccia di come. NON riparato (P12/M28): si tiene
    0.10 perche' e' il lato conservativo, non e' sul percorso soldi e non morde
    fino al 90% di quota. Divergenza dichiarata in config.
Di lato: BUIDL haircut 2% (sarebbe stato il miglior collaterale del listino, se
si potesse comprare), stETH 7,5% (terza ragione indipendente per lasciarlo stare).
Nessuna fonte documenta un tetto sulle QUANTITA': il ~31,2% resta misurato e non
spiegato — e ora si sa che non e' una svista di lettura.

Suite: 800 passati (5 nuovi su venue_news).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 07:47:15 +00:00

319 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-08-30 — "porta in USDE tutto il capitale che non viene usato": il venue dice 31%
**Richiesta dell'operatore**, verbatim: *"porta in usde tutto il capitale che non viene usato"*.
Arriva il 30/08, cioè **un giorno prima** della data a cui l'operatore stesso aveva rinviato la
decisione di quota (gate USDE-01, rinvio al 31/08). L'anticipo è esplicito e vale come decisione.
## 1. "Il capitale che non viene usato" non è una quantità piccola: è quasi tutto
Stato letto dal gateway alle 19:50Z: USDC **$1.563,09** (di cui **$11,36** impegnati a margine),
USDE 500,1757 → **$500,18**, totale **$2.063,26**, quota **24,2%**. Posizioni BTC $354,72 + ETH
$213,36 = **$568,08** lordi (0,275x).
Il margine consuma **$11 su $2.063**, e l'USDE è cross-collateral: convertirlo non lo toglie
dall'uso. Anche a piena esposizione del libro (lordo 1,0x) il margine sarebbe ~$41. Presa alla
lettera la richiesta è una quota **~99%** — il 100% che il gate esclude per nome ("mai 100%: R1
emittente non recuperabile"). Le due letture plausibili ("non a margine" e "non esposto dal libro")
convergono entrambe su ~97-99%: non è un'ambiguità che si risolve scegliendo, è una che si porta
all'operatore.
## 2. Il vincolo che `r0830_usde_quota` non aveva guardato: il cuscino di REGOLAMENTO
L'analisi del 30/08 aveva misurato il **margine** e concluso — correttamente — che l'haircut non
morde a nessuna quota fino al 90%, nemmeno a leva 1,50x con USDE a 0,95. Vero, e irrilevante:
il P&L e il funding dei perp **USDC-lineari si regolano in USDC**, non nel collaterale. Lo si vede
nel conto: `equity balance = $7,24` di floating, tutto nel secchio USDC.
A quota ~99% resterebbero **$41 di USDC** contro un libro che, col disaster-SL a 30% sulla massima
esposizione, può perderne **~$619**: il saldo va negativo e Deribit lo finanzia a interesse, che si
mangia la resa che si stava comprando. **Il vincolo non è il margine, ma non è nemmeno assente.**
> 📌 **Corretto e QUANTIFICATO il 31/08** (KB *Cross collateral specifications*): «*a collateral fee
> will be charged […] **default = 0.05% per day***», al secondo, sulla valuta negativa — cioè
> **18,25%/anno, 4,3× la resa USDE** che si starebbe comprando. Il ribilanciamento automatico non
> salva: scatta a **$1M** assoluti o al **100% della cross equity**, soglie irraggiungibili a $2k.
> Qui il 30/08 avevo scritto «lo finanzia a interesse» **senza il numero**: il numero rende il
> criterio del cuscino più giustificato, non meno.
Criterio dichiarato: cuscino USDC ≥ disaster-SL sulla massima esposizione lorda del libro =
`n_asset × frac × disaster_sl_pct` = 2 × 0,5 × 0,30 = **30% dell'equity** — tutto derivato da
`config/live.json` e `src/live/book.py`, mai ridichiarato (P1). Che lascia esattamente **70%**.
Non è un argmax (M8): la quota massima e il criterio coincidono per costruzione, e infatti il 70%
cade **esattamente sul limite, con zero slack**.
Tabella portata all'operatore (APR allora creduta 3,26% [1,13-4,51], n=4 — vedi §5, è sbagliata):
| quota | converti | USDC che resta | resa/anno | evento emittente vs maxDD libro |
|---|---|---|---|---|
| 24,2% (allora) | — | $1.563 | $16 | 3,1× |
| 50% | $531 | $1.032 | $34 | 6,3× |
| **70%** | **$944** | **$619** | **$47** | **8,8×** |
| ~99% | $1.522 | $41 | $66 | 12,3× |
**Scelta dell'operatore: 70%**, il massimo compatibile col cuscino.
## 3. Esecuzione: da 500 a 644 USDE, poi il muro
Nuovo attrezzo **`scripts/live/usde_convert.py`** (dry-run di default). Non passa da
`DeribitTrader`: `execution.ALLOWED` ammette solo i due perp del libro ed è il guardrail
anti-fat-finger del percorso soldi — **non si allarga** per farci entrare uno spot che col libro
non c'entra. Lo script porta le proprie guardie: banda prezzo [0,995 1,005], tetto HARD di quota
0,95, il cuscino di regolamento, dry-run.
Convertiti **+144 USDE** (500,1757 → **644,175691**), quota **24,24% → 31,21%**, tutti i fill a
1,0002-1,0003, **fee 0**. Poi ogni acquisto ha smesso di passare.
## 4. `not_enough_funds_in_currency` è un messaggio FUORVIANTE — la cronaca delle ipotesi sbagliate
Si tiene apposta, perché chi rilegge non deve rifare questo giro. Tre ipotesi, tutte plausibili,
tutte sbagliate:
1. **"È la taglia."** 943,98 rifiutato per `Invalid params` → vero: `min_trade_amount: 1` e
`contract_size: 1`, il passo è **intero** (confermato da `public/get_instrument`; il gateway
non espone quel tool, la risposta è arrivata dall'API pubblica). Quantizzato a intero: 933
rifiutato per **fondi**, con **$1.541 disponibili**. Falso indizio.
2. **"È il rate-limit."** 100 passava e 300 no; poi anche **1** rifiutato otto volte di fila.
Aggiunto backoff sul tempo fino a 90s: rifiutato lo stesso. Falso.
3. **"È il prezzo."** Diagnosi a tre ordini da 1 USDE: SELL @1,0000 OK, BUY **@1,0003 OK**,
BUY @1,0002 e BUY market rifiutati. Vero **in parte**: il book REST pubblico è in **ritardo**
sul matching engine, e un limite a `ask+1 tick` a volte non incrocia davvero. Difetto mio, e
istruttivo: prezzavo l'ordine sull'**indice** invece che sul **book**. Sono due prezzi con due
mestieri — l'indice **marca** il collaterale (`usde.valuta`, mediana multi-exchange: la lezione
Binance 10/10), il book **prezza** lo scambio. Corretto con 5 tick di margine e tetto duro
1,0010: il fill avviene al prezzo del libro, quindi il margine non si paga.
Ma corretto il prezzo, **200 e 800 continuavano a fallire con 4.552 di profondità all'ask**.
## 5. 🚨 Il fatto vero: un TETTO DEL VENUE sull'USDE, a 644,175691 (31,21%)
Esperimento **a saldo neutro**, quattro ordini di fila (20:14Z):
```
BUY 20 @1.0007 -> not_enough_funds_in_currency USDE 644.1757
SELL 20 @0.9996 -> OK USDE 624.1757
BUY 20 @1.0007 -> OK USDE 644.1757
BUY 5 @1.0007 -> not_enough_funds_in_currency USDE 644.1757
```
È un **tetto sul LIVELLO**: non taglia, non prezzo, non liquidità, non cadenza, non fondi
($1.408 disponibili). Lo stesso ordine che viene rifiutato passa subito dopo una vendita di pari
taglia. **La quota del 70% non è raggiungibile**, e nemmeno il 50%.
La formula del tetto **non è leggibile da qui**: `public/get_currencies` non espone un cap
(`in_cross_collateral_pool: true`, nient'altro), e il gateway non espone né `get_order_book`
`available_withdrawal_funds` — è il debito #11, il gateway è l'unico pezzo della catena che
possediamo e si ha solo quel che espone. Registrato come fatto misurato, non spiegato (D5: un buco
quantificato è un risultato, uno taciuto è un debito).
## 6. 🚨 E la resa non è quella che credevamo: **l'USDC paga 3,40%**
`public/get_currencies`, letta oggi:
| valuta | APR pubblicata |
|---|---|
| USDE | **4,1071%** |
| USDC | **3,4000%** |
I nostri reward USDE misurati (+0,052055 · +0,061815 · +0,061821 al giorno su 500 → **~4,5%/anno**)
**confermano** che la APR pubblicata di USDE è reale. Il che rende credibile anche l'altra riga.
Se l'USDC frutta già 3,40%, il guadagno del passaggio a USDE **non è il tasso: è lo spread**,
**0,71 punti**. Sui $644 che teniamo vale **~$4,6/anno**, non $21; sui $144 convertiti oggi,
**~$1,0/anno**. Il gate USDE-01 ha misurato con cura il reward dell'USDE e **non ha mai chiesto
cosa facesse l'USDC fermo**: è il controfattuale mancante — M1 in un'altra veste, si giudica il
**marginale**, non il livello. E cambia il verso della decisione: si prende un rischio emittente
**non recuperabile** (a 31,2% vale 3,9× il maxDD dell'intero libro) per **0,71 punti**.
⚠️ **Quello che NON è dimostrato:** che la APR USDC sia effettivamente accreditata *sul nostro
conto*. Sull'USDE l'abbiamo vista arrivare per delta; sull'USDC il P&L di trading copre $0,13/giorno
di interesse e il gateway non espone il Transaction Log. **Va verificato su un giorno senza trade
prima di trattarlo come misura** — qui è una APR pubblicata dal venue più una conferma indiretta,
non un reward osservato.
## 7. Cosa resta a terra
- **Conto**: USDC $1.419,61 · USDE 644,175691 ($644,18) · totale **$2.063,79** · quota **31,21%**.
Nessun ordine spot appeso (restano i due `tp01-disaster` reduce_only). Posizioni invariate.
Equity vista dal book **$2.063,86** ("mainnet USDC + USDE 644 @ 1.0000"): sizing corretto,
nessun falso "uscita di fondi".
- **`config/live.json`**: aggiunto `quota_target: 0.70` (la decisione dell'operatore, oggi bloccata
dal venue). `quota_max_frac` alzato a 0,85 e **rimesso a 0,50** nella stessa sessione: la soglia
larga presupponeva un 70% che non esiste, e lasciarla avrebbe **disarmato la guardia per uno
scenario che non si è verificato. Con la quota reale al 31%, il 50% morde di nuovo.**
- **Non fatto**: portare la quota al 70%. Il venue non lo consente. Non è una rinuncia
discrezionale, è un rifiuto misurato e riproducibile.
---
# APPENDICE (stessa sera, 23:40-23:55Z) — **l'USDC NON frutta sul nostro conto: §6 era sbagliata**
Richiesta dell'operatore: *"verifica se l'USDC frutta davvero sul nostro conto"*. Verificato.
**La risposta ribalta la §6 di questo stesso diario**, che va letta con questa appendice accanto.
## Perché la domanda sembrava dover aspettare, e invece no
Il gateway non espone il Transaction Log (provati `get_transaction_log`, `get_settlement_history`,
`get_deposits`, `get_transfers`, `get_interest_history`: **tutti 404** — debito #11). L'unica serie
storica del conto è `trades.db.equity`: **oraria ma arrotondata a 2 decimali**, e contiene il P&L
non realizzato, che a posizioni aperte oscilla di ±$2-8/ora. $0,13/giorno di interesse ci sparisce.
Poi la fonte ufficiale Deribit ha spostato il problema dal *rumore* al *calendario*:
> «Every day at 00:00 UTC, Deribit calculates the **minimum equity** of USDC that a user has been
> holding over the previous 24 hours. […] After the month is over, the rewards from each day are
> summed together and **paid out as a single monthly payment early in the following month**.»
> — `insights.deribit.com/education/usdc-rewards-now-paid-on-deribit/`
**I reward USDC si pagano UNA VOLTA AL MESE**, non ogni giorno come quelli USDE. Ecco perché non li
avevamo mai visti: guardavamo a cadenza giornaliera, dove l'USDE si vede e l'USDC per costruzione no.
E un accredito mensile da qualche dollaro **si vede benissimo anche a 2 decimali** — purché il libro
sia FLAT, perché allora `equity == balance == USDC` e ogni scalino è un accredito.
## La misura: due confini di mese, entrambi a libro flat
| finestra | punti orari | equity min | equity max | ore senza alcun movimento | scalini >1 cent | reward atteso se idoneo |
|---|---|---|---|---|---|---|
| **29/06 → 08/07** | 238 | **598,06** | **598,06** | **237 / 237** | **0** | $0,45 (8 gg dal 23/06) |
| **31/07 → 03/08** | 96 | **596,92** | **596,92** | **tutte** | **0** | **$1,72** (luglio intero) |
Il secondo è il caso decisivo: **$1,72 attesi contro una risoluzione di $0,01 — 172×** — e l'equity
non si muove di un centesimo per quattro giorni pieni, coprendo tutta la finestra "early in the
following month". Non è un'assenza sotto la soglia di rilevabilità: è uno zero misurato.
**Il conto NON riceve i reward USDC.** N=2 confini indipendenti, entrambi puliti per costruzione.
## Perché, e perché è coerente col fatto che l'USDE invece paga
Deribit: *«A user's eligibility to receive USDC is based on their location»*. L'ipotesi che spiega
entrambe le osservazioni è **MiCA**: USDC è un *e-money token* regolamentato, e a un residente UE
non se ne può corrispondere rendimento; **USDe non è un EMT**, e infatti i suoi reward arrivano
(li abbiamo visti per delta: +0,052055 · +0,061815 · +0,061821). ⚠️ *Questa è la spiegazione
plausibile, non una fonte normativa verificata* (P13/M27: una norma citata si verifica come un
numero). **Il fatto misurato è lo zero, non il suo motivo.**
## Cosa cambia (e cosa la §6 aveva sbagliato)
- **La premessa originale del gate USDE-01 è RESTAURATA.** Il guadagno di tenere USDE **non è lo
spread 0,71 punti: è il tasso pieno ~4,1%**, perché l'alternativa sul nostro conto rende **0**.
Sui $644 che teniamo: **~$26/anno** (e ~$29 al ritmo misurato di ~4,5%), non i ~$4,6 di §6.
- **Cosa avevo sbagliato, e la lezione.** Ho letto `apr: 3.4` in `public/get_currencies` e l'ho
trattato come una proprietà **del nostro conto**. È una proprietà **del venue**: un listino, non
un accredito. La conferma indiretta che invocavo ("i reward USDE misurati coincidono con la loro
APR pubblicata") provava che il listino è reale **per l'USDE**, e non diceva nulla sull'idoneità
dell'USDC. 📌 **Un tasso pubblicato non è un tasso incassato: si verifica sul CONTO, e la verifica
costava una query sulla serie che avevamo già.** È N10 in una veste nuova — la verifica a €0 va
fatta *prima*, e si fa **sul venue, non sul sito**; qui perfino il venue non bastava, serviva il
conto.
- Resta vero e non toccato: il **tetto del venue al 31,21%**, il **cuscino di regolamento** (30%
dell'equity, che lascia il 70%), e che a 31,2% l'evento emittente vale ~3,9× il maxDD del libro.
La decisione "tenere o no i $644" cambia però di segno rispetto a come l'avevo chiusa: si compra
**$26/anno**, non $4,6.
## Strumento lasciato in piedi
**`scripts/live/balance_watch.py`** + **`scripts/cron_balance.sh`** (orario al minuto **:42**, libero
fra :25/:35/:47; sola lettura). Registra il **balance a 8 decimali** per valuta — la serie che
mancava — con il conteggio dei fill dall'ultimo campione e il nozionale lordo, così una finestra
sporca si riconosce invece di essere mediata dentro. Etichetta PULITA le finestre a 0 fill e libro
flat, dove il Δ USDC **è** l'interesse, e ne stampa l'APR implicita accanto a quella attesa.
Serve a sorvegliare che lo zero resti zero (o che cambi, se l'idoneità cambia): l'inizio di
settembre è il prossimo confine di mese, ed è già strumentato.
---
# APPENDICE 2 (2026-08-31) — la fonte ufficiale: **due correzioni alle mie conclusioni**
L'operatore ha passato l'articolo `support.deribit.com/.../Yield-reward-bearing-coins`. WebFetch lo
prende 403 (Cloudflare); si legge dall'**API Help Center** in JSON:
`support.deribit.com/api/v2/help_center/en-us/articles/31424939199261.json` → HTTP 200.
*Aggiornato dal venue il 2026-08-20.* Contiene tre cose che il progetto non sapeva.
## 1. L'ITALIA è nella lista degli esclusi dai reward USDC — e non è MiCA
> «The following jurisdictions are **not eligible** to receive USDC rewards: Austria, Belarus,
> Belgium, Bulgaria, Canada, […] **Italy**, Japan, […]»
Lo zero misurato è **confermato dalla fonte**. Ma l'ipotesi che avevo scritto — MiCA, USDC è un
e-money token e USDe no — **è sbagliata**: la lista contiene Canada e Giappone, non è il perimetro
MiCA. È policy di giurisdizione di Deribit. *M27: una fonte normativa citata si verifica come un
numero — e io l'avevo dedotta invece di leggerla.*
## 2. La finestra di pagamento è di DUE SETTIMANE, non di tre giorni — il «172×» era sovra-affermato
> «The monthly USDC rewards payment is then made **within the first two weeks** of the following
> month.»
Avevo verificato su 29/06→08/07 e 31/07→03/08: **8 giorni su 14 e 3 su 14**. Rifatto sulle finestre
vere:
| accredito | finestra vera | letture | escursione TOTALE equity | scalini ≥70% dell'atteso | esito |
|---|---|---|---|---|---|
| giugno ($0,45) | 01→16/07 | 374 | **$2,74** | 7 | ❌ **NON conclusivo** |
| luglio ($1,72) | 01→16/08 | 382 | **$0,48** | **0** | ✅ **conclusivo** |
Luglio regge da solo: il credito atteso è **3,6× l'intera escursione dell'equity** su due settimane.
Giugno no — il libro ha iniziato a operare a metà mese e il rumore ha la taglia del segnale.
⇒ La conclusione **non cambia** (una finestra conclusiva + la lista ufficiale), ma l'evidenza è
**una** finestra, non due. *Avevo citato la sotto-finestra piatta e chiamato «zero misurato» ciò che
la finestra completa non copriva: scegliere la sotto-finestra che fa vedere lo zero è la stessa
mossa che il progetto vieta a un backtest.*
## 3. Il tetto NON è un livello: è una FRAZIONE dell'equity, e scala col conto
L'articolo documenta un **Cap ETHENA** che diluisce il **tasso** a livello di exchange —
`User APR = min(min_exchange_USDe_balance, Ethena Cap) / min_exchange_USDe_balance × Ethena APR`
e **nessun limite sulle quantità detenibili da un conto**. Quindi il muro non aveva base
documentale, e andava ri-sondato. Fatto (31/08, giorno UTC nuovo → non è un limite giornaliero):
```
BUY 5 -> not_enough_funds_in_currency USDE 644.175691 (muro ancora li')
SELL 10 -> OK USDE 634.175691
BUY 10 -> not_enough_funds_in_currency USDE 634.175691 <-- ieri 644,18 passava!
BUY 5 -> OK USDE 639.175691
BUY 3 -> OK USDE 642.175691
BUY 1 -> OK USDE 643.175691
BUY 1 -> not_enough_funds_in_currency USDE 643.175691
```
**Ieri si tornava a 644,18 e oggi no**, con l'equity scesa di $8. Il tetto si è mosso con lei:
| | tetto | equity | frazione |
|---|---|---|---|
| 30/08 | [644,18 · 645,18) | $2.063,79 | 31,21% 31,26% |
| 31/08 | [643,18 · 644,18) | $2.055,56 | 31,29% 31,34% |
I bracket distano **0,05pp**, dentro il rumore dell'equity (±$2-8/ora). Candidato pulito **5/16 =
31,25%**, ma con questa risoluzione non si distingue da una regola sul collaterale scontato
dell'haircut (~29%): **non si sceglie quella che conviene, si cita la banda** (M25).
**Il tetto SCALA col conto.** La quota resta ~31% per sempre, il valore in dollari cresce col
capitale, e il 70% non è raggiungibile né ora né mai. Conseguenza che ieri non avevo visto: essendo
pinnati al tetto, **il rischio emittente resta una frazione COSTANTE del conto** — non si diluisce
crescendo, a meno di vendere apposta.
## 4. E l'USDe ha un fee del 5% che non avevamo mai nominato
> «Deribit Fee: A percentage deducted from the reward before distribution (**currently 5%**)»
> · reward su **minima equity 00:00→24:00 UTC**, distribuiti **~12:00 UTC**, «visible inside
> Transaction Log» (che il gateway non espone: da lì il metodo per delta).
Il nostro **misurato** (~4,5%/anno) è già netto del fee: è quello che arriva sul conto, ed è
l'unico numero da citare. La `apr` di `get_currencies` (4,1071%) è un listino, non un incasso —
la stessa confusione che mi era costata la §6.
## 5. Cablato, così il tetto smette di vivere in prosa
Alla domanda dell'operatore «dove è scritto il valore del tetto» la risposta era: **in tre note di
testo e in nessun posto che il codice legga**, tanto che `usde_convert --quota 0.70` dichiarava
«piano valido» per un ordine che il venue avrebbe rifiutato. Ora:
- `config/live.json``usde.venue_cap_frac` **0.312** (bordo BASSO dei bracket: fa fallire il
piano *prima* dell'ordine invece che dopo il rifiuto) + `venue_cap_misurato` con la data;
- `src/live/usde.py` lo porta nei default — unica autorità, come tutto il resto della sezione (P1);
- `usde_convert.piano()` rifiuta il bersaglio sopra il tetto e stampa il massimo raggiungibile.
Verificato: `--quota 0.70` → *«TETTO DEL VENUE: bersaglio $1.438,90 sopra $641,34 (31,2%
dell'equity, misurato 2026-08-31)»*, nessun ordine inviato.
**Stato finale**: USDE **643,175691** (quota **31,29%**, cioè al tetto), USDC $1.412,40,
totale $2.055,57.