venue_watch BLIND esce col titolo 🚨 'prelievo di prova' invece che come guasto delle referenze #31

Closed
opened 2026-09-27 13:12:13 +00:00 by Adriano · 3 comments
Owner

Revisione 2026-09-27 (goldrake): rilievo Opus 5.5, verifica avversariale fable. Sola lettura, nessun codice toccato.

Rilievo B7 [bug]

FILE: pg:scripts/live/venue_watch.py:27-36 + src/live/venue_watch.py:343-348
COSA: un BLIND di consenso (>=12h senza referenze concordi) esce con severity None e prende il titolo 🚨 «possibile stress su Deribit. PRIMO PASSO: prelievo di prova», e si RIPETE ogni ora (BLIND non ha marcatore).
SCENARIO: Kraken e Coinbase via ccxt irraggiungibili dalla VPS per 13h (o spread fra referenze > 100 bps) -> dalla 12a ora un 🚨 orario che chiede un prelievo di prova per un guasto delle referenze, non di Deribit. E' esattamente il difetto che il docstring di _titolo dice di aver chiuso il 19/08 (P9).
PROVA: VERIFICATO: lettura — _titolo ritorna ⚠️ solo se severity=="warn"; run_once imposta severity solo per ALERT/MAINT/RIENTRATO; step() ritorna BLIND a ogni ora >= BLIND_ALERT_HOURS. grep -c "consenso NON misurabile" logs/cron_book.log -> 0 (mai accaduto: latente).
PROPOSTA: severity "warn" per BLIND con titolo proprio («referenze non concordi, nessuna azione su Deribit»), e un marcatore blind_detto per dirlo una volta per episodio.

Verifica fable B7 VERDETTO: CONFERMATO-RIDIMENSIONATO

GRAVITA': medio (latente: 0 occorrenze nel log)
PERCHE': src/live/venue_watch.py:343-346 BLIND entra in report["alerts"] con severity che resta None (severity si imposta solo a 348, 359, 366, 369); scripts/live/venue_watch.py:35-36 _titolo -> «🚨 ... PRIMO PASSO: prelievo di prova» per severity != "warn". Confermato il titolo sbagliato. RIDIMENSIONATO sulla ripetizione: venue_watch.py:324 dichiara «Restano fuori BLIND (si ripete ogni ora da solo)» — e' una scelta documentata nel codice, non un difetto; il difetto e' che il 🚨 con prelievo esce per un guasto delle referenze.
CORREZIONE: severity "warn" o meglio un terzo livello ("blind") con titolo proprio; il marcatore per episodio e' opzionale, e se si aggiunge va dichiarato nel docstring di run_once che oggi dice il contrario.

Revisione 2026-09-27 (goldrake): rilievo Opus 5.5, verifica avversariale fable. Sola lettura, nessun codice toccato. ### Rilievo B7 [bug] FILE: pg:scripts/live/venue_watch.py:27-36 + src/live/venue_watch.py:343-348 COSA: un BLIND di consenso (>=12h senza referenze concordi) esce con severity None e prende il titolo 🚨 «possibile stress su Deribit. PRIMO PASSO: prelievo di prova», e si RIPETE ogni ora (BLIND non ha marcatore). SCENARIO: Kraken e Coinbase via ccxt irraggiungibili dalla VPS per 13h (o spread fra referenze > 100 bps) -> dalla 12a ora un 🚨 orario che chiede un prelievo di prova per un guasto delle referenze, non di Deribit. E' esattamente il difetto che il docstring di _titolo dice di aver chiuso il 19/08 (P9). PROVA: VERIFICATO: lettura — _titolo ritorna ⚠️ solo se severity=="warn"; run_once imposta severity solo per ALERT/MAINT/RIENTRATO; step() ritorna BLIND a ogni ora >= BLIND_ALERT_HOURS. `grep -c "consenso NON misurabile" logs/cron_book.log` -> 0 (mai accaduto: latente). PROPOSTA: severity "warn" per BLIND con titolo proprio («referenze non concordi, nessuna azione su Deribit»), e un marcatore blind_detto per dirlo una volta per episodio. ### Verifica fable B7 VERDETTO: CONFERMATO-RIDIMENSIONATO GRAVITA': medio (latente: 0 occorrenze nel log) PERCHE': `src/live/venue_watch.py:343-346` BLIND entra in `report["alerts"]` con `severity` che resta None (severity si imposta solo a 348, 359, 366, 369); `scripts/live/venue_watch.py:35-36` `_titolo` -> «🚨 ... PRIMO PASSO: prelievo di prova» per severity != "warn". Confermato il titolo sbagliato. RIDIMENSIONATO sulla ripetizione: `venue_watch.py:324` dichiara «Restano fuori BLIND (si ripete ogni ora da solo)» — e' una scelta documentata nel codice, non un difetto; il difetto e' che il 🚨 con prelievo esce per un guasto delle referenze. CORREZIONE: severity "warn" o meglio un terzo livello ("blind") con titolo proprio; il marcatore per episodio e' opzionale, e se si aggiunge va dichiarato nel docstring di run_once che oggi dice il contrario.
Adriano added the bug label 2026-09-27 13:12:13 +00:00
Author
Owner

ANALISI (passo 1, Opus) — unita' U3, ramo lavoro/goldrake-u3, repo gitea:Adriano/PythagorasGoal
RIF: #26 (B1), #29 (B2, B8), #31 (B7), #35 (solo B3, B4)
FILE: scripts/live/usde_convert.py, scripts/live/usde_watch.py, scripts/live/fee_watch.py, src/live/venue_watch.py, scripts/live/venue_watch.py, tests/

  1. #26 — usde_convert: ordini limit GTC mai cancellati. Il gateway cerbero-mcp NON accetta time_in_force (PlaceOrderReq senza il campo, extra ignorati: gitea:Adriano/Cerbero-mcp#1), quindi la correzione e' tutta in PG:
    a) funzione cancella_residui(c) -> list[str]: legge gli ordini aperti sullo spot U.SPOT (USDE_USDC) e cancella SOLO quelli con label che inizia per "usde-quota-". Per sapere come chiedere gli ordini aperti di uno spot leggi (SOLA LETTURA) /opt/docker/cerbero-mcp/src/cerbero_mcp/exchanges/deribit/tools.py e client.py (get_open_orders: parametri accettati; cancel_order: {"order_id"}). Se la lettura fallisce -> solleva (non si ordina al buio).
    b) in main() con --esegui: chiamare cancella_residui PRIMA del ciclo (stampare quanti) e, nel ciclo, dopo ogni ordine con filled < amt cancellare quell'order_id (c._post("/mcp-deribit/tools/cancel_order", {"order_id": ...})), registrarlo nel record (cancellato: true/errore). Se la cancel fallisce: stampa, registra e FERMA il ciclo (break) — mai un secondo ordine con un residuo vivo.
    c) il record finale e l'exit code non cambiano significato.
  2. #29 — usde_watch.py (B2) e fee_watch.py (B8): lo stato si salva prima dell'invio e il ritorno di notify() non si legge. Leggi src/live/notifier.py per sapere cosa ritorna notify (bool? solleva?). Schema di cuscino_watch.py (leggilo: e' il modello): il record porta allertati = condizioni il cui invio e' riuscito; nuove = att_now - {c in att_prev se c in prev.get("allertati", att_prev)} — compatibilita': un record vecchio senza allertati vale come tutto allertato. fee_watch: save_state solo se l'invio (quando serviva) e' riuscito.
  3. #31 — venue_watch BLIND: severity resta None e il titolo diventa 🚨 "PRIMO PASSO: prelievo di prova". Dare a BLIND una severity propria "blind" con titolo "⚠️ venue_watch CIECO — referenze non leggibili, nessun giudizio sul venue" in scripts/live/venue_watch.py::_titolo. La ripetizione oraria di BLIND e' voluta (commento esistente): non toccarla.
  4. #35 B3/B4 — usde_watch: togliere DECISIONE_QUOTA_DAL / quota_da_decidere e la notify "la decisione di QUOTA e' dovuta" (la quota e' derivata dal cuscino dal 10/09, config usde._nota_cuscino); testo IDONEO: usare c["quota_max_frac"] invece di "50%" cablato; la riga "margine" non deve dire "conto SEGREGATO": il modello e' Cross X:SM dal 31/08 — riscrivere la riga come "margine: ~$X USDC + USDE scontato (cross X:SM)" usando i numeri che la funzione ha gia', senza inventarne.

TEST (tests/test_usde_u3.py ecc., client finto, nessuna rete, time.sleep patchato):

  • ordine con filled 0 -> cancel chiamata con quell'order_id, ciclo fermo; cancel che solleva -> break, registrato.
  • residuo "usde-quota-0.64" aperto all'avvio -> cancellato; ordine con altra label -> NON toccato.
  • usde_watch: notify fallito -> al giro dopo la stessa condizione si rinvia; notify riuscito -> non si ripete.
  • fee_watch: invio fallito -> stato non salvato.
  • venue_watch BLIND -> titolo senza "prelievo".
  • usde_watch non emette piu' QUOTA_DA_DECIDERE.
    Suite completa: cd <worktree> && /opt/docker/PythagorasGoal/.venv/bin/python -m pytest -q -p no:cacheprovider (baseline 1098 passed, 3 skipped).

NON TOCCARE: src/live/usde.py (formula del cuscino: e' #28, altra unita'), cuscino_watch.py (salvo leggerlo), config/live.json, /opt/docker/cerbero-mcp (sola lettura), /opt/docker/PythagorasGoal. Nessuna rete, nessun ordine, nessun Telegram (notify va mockato nei test).

ANALISI (passo 1, Opus) — unita' U3, ramo lavoro/goldrake-u3, repo gitea:Adriano/PythagorasGoal RIF: #26 (B1), #29 (B2, B8), #31 (B7), #35 (solo B3, B4) FILE: scripts/live/usde_convert.py, scripts/live/usde_watch.py, scripts/live/fee_watch.py, src/live/venue_watch.py, scripts/live/venue_watch.py, tests/ 1. #26 — usde_convert: ordini limit GTC mai cancellati. Il gateway cerbero-mcp NON accetta time_in_force (PlaceOrderReq senza il campo, extra ignorati: gitea:Adriano/Cerbero-mcp#1), quindi la correzione e' tutta in PG: a) funzione `cancella_residui(c) -> list[str]`: legge gli ordini aperti sullo spot U.SPOT (USDE_USDC) e cancella SOLO quelli con label che inizia per "usde-quota-". Per sapere come chiedere gli ordini aperti di uno spot leggi (SOLA LETTURA) /opt/docker/cerbero-mcp/src/cerbero_mcp/exchanges/deribit/tools.py e client.py (get_open_orders: parametri accettati; cancel_order: {"order_id"}). Se la lettura fallisce -> solleva (non si ordina al buio). b) in main() con --esegui: chiamare cancella_residui PRIMA del ciclo (stampare quanti) e, nel ciclo, dopo ogni ordine con filled < amt cancellare quell'order_id (`c._post("/mcp-deribit/tools/cancel_order", {"order_id": ...})`), registrarlo nel record (`cancellato: true/errore`). Se la cancel fallisce: stampa, registra e FERMA il ciclo (break) — mai un secondo ordine con un residuo vivo. c) il record finale e l'exit code non cambiano significato. 2. #29 — usde_watch.py (B2) e fee_watch.py (B8): lo stato si salva prima dell'invio e il ritorno di notify() non si legge. Leggi src/live/notifier.py per sapere cosa ritorna notify (bool? solleva?). Schema di cuscino_watch.py (leggilo: e' il modello): il record porta `allertati` = condizioni il cui invio e' riuscito; `nuove = att_now - {c in att_prev se c in prev.get("allertati", att_prev)}` — compatibilita': un record vecchio senza `allertati` vale come tutto allertato. fee_watch: save_state solo se l'invio (quando serviva) e' riuscito. 3. #31 — venue_watch BLIND: severity resta None e il titolo diventa 🚨 "PRIMO PASSO: prelievo di prova". Dare a BLIND una severity propria "blind" con titolo "⚠️ venue_watch CIECO — referenze non leggibili, nessun giudizio sul venue" in scripts/live/venue_watch.py::_titolo. La ripetizione oraria di BLIND e' voluta (commento esistente): non toccarla. 4. #35 B3/B4 — usde_watch: togliere DECISIONE_QUOTA_DAL / quota_da_decidere e la notify "la decisione di QUOTA e' dovuta" (la quota e' derivata dal cuscino dal 10/09, config usde._nota_cuscino); testo IDONEO: usare c["quota_max_frac"] invece di "50%" cablato; la riga "margine" non deve dire "conto SEGREGATO": il modello e' Cross X:SM dal 31/08 — riscrivere la riga come "margine: ~$X USDC + USDE scontato (cross X:SM)" usando i numeri che la funzione ha gia', senza inventarne. TEST (tests/test_usde_u3.py ecc., client finto, nessuna rete, time.sleep patchato): - ordine con filled 0 -> cancel chiamata con quell'order_id, ciclo fermo; cancel che solleva -> break, registrato. - residuo "usde-quota-0.64" aperto all'avvio -> cancellato; ordine con altra label -> NON toccato. - usde_watch: notify fallito -> al giro dopo la stessa condizione si rinvia; notify riuscito -> non si ripete. - fee_watch: invio fallito -> stato non salvato. - venue_watch BLIND -> titolo senza "prelievo". - usde_watch non emette piu' QUOTA_DA_DECIDERE. Suite completa: `cd <worktree> && /opt/docker/PythagorasGoal/.venv/bin/python -m pytest -q -p no:cacheprovider` (baseline 1098 passed, 3 skipped). NON TOCCARE: src/live/usde.py (formula del cuscino: e' #28, altra unita'), cuscino_watch.py (salvo leggerlo), config/live.json, /opt/docker/cerbero-mcp (sola lettura), /opt/docker/PythagorasGoal. Nessuna rete, nessun ordine, nessun Telegram (notify va mockato nei test).
Author
Owner

ESITO: fatto sul ramo, non in produzione
RIF: gitea:Adriano/PythagorasGoal#31
COSA: correzione su lavoro/goldrake (pushato), analisi Opus, codice Sonnet, controllo finale Opus
FILE: commit 5acc31e
PROVA: /home/adriano/lavoro/PythagorasGoal pytest -q → 1166 passed, 3 skipped
MANCA: merge su main — richiede ok esplicito di Adriano (libro vivo). Chiusura con --soluzione dopo il merge.
PROSSIMO: ok di Adriano → merge lavoro/goldrake su main → git pull in /opt/docker/PythagorasGoal

ESITO: fatto sul ramo, non in produzione RIF: gitea:Adriano/PythagorasGoal#31 COSA: correzione su lavoro/goldrake (pushato), analisi Opus, codice Sonnet, controllo finale Opus FILE: commit 5acc31e PROVA: /home/adriano/lavoro/PythagorasGoal pytest -q → 1166 passed, 3 skipped MANCA: merge su main — richiede ok esplicito di Adriano (libro vivo). Chiusura con --soluzione dopo il merge. PROSSIMO: ok di Adriano → merge lavoro/goldrake su main → git pull in /opt/docker/PythagorasGoal
Adriano added the attesa:adriano label 2026-09-27 14:17:41 +00:00
Author
Owner

Soluzione

venue_watch: severity 'blind' propria, titolo CIECO senza invito al prelievo.
COMMIT: 5acc31e, su main dal 27/09/2026 (merge con ok di Adriano). Produzione aggiornata.

**Soluzione** venue_watch: severity 'blind' propria, titolo CIECO senza invito al prelievo. COMMIT: 5acc31e, su main dal 27/09/2026 (merge con ok di Adriano). Produzione aggiornata.
Adriano removed the attesa:adriano label 2026-09-27 14:27:59 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/PythagorasGoal#31