monitor_health gira solo alle 00:30: i sorveglianti orari (limite 3h) si scoprono fermi fino a 24h dopo #30
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 B6 [bug]
FILE: pg:src/live/monitor_health.py:86-130 + scripts/cron_daily.sh:53
COSA: i sorveglianti ORARI (cuscino_watch, venue_watch, collect_chain) hanno max_age 3h "= due giri persi", ma monitor_health gira UNA volta al giorno (cron_daily 00:30): la latenza reale di scoperta e' fino a ~24h.
SCENARIO: cuscino_watch smette di scrivere alle 01:00 (es. eccezione non gestita a cuscino_watch.py:216 se config/live.json e' illeggibile, o import rotto dopo un commit) -> nessun allarme cuscino e nessuna riconversione automatica fino alle 00:30 del giorno dopo; monitor_health lo dichiara FERMO dopo 23h, non dopo 3h.
PROVA: VERIFICATO:
grep -rn monitor_health scripts/*.sh-> solo cron_daily.sh:53; crontab30 0 * * *per cron_daily.PROPOSTA: lanciare
monitor_health.py --quietanche orario (es. in coda a cron_cuscino.sh o a un minuto libero), con marcatore "gia' detto" per non ripetere ogni ora; oppure dividere i monitor orari in un secondo giro orario.Verifica fable B6 VERDETTO: CONFERMATO
GRAVITA': medio
PERCHE':
src/live/monitor_health.py:105-107,128-130max_age 3h per cuscino_watch/venue_watch/collect_chain;grep -rn monitor_health scripts/*.sh-> soloscripts/cron_daily.sh:53; crontab30 0 * * *. Latenza reale di scoperta fino a ~24h.scripts/live/monitor_health.py:50notifica senza marcatore «gia' detto».CORREZIONE: ok, con un vincolo: se si lancia orario (in coda a
cron_book.shocron_cuscino.sh) SERVE il marcatore per monitor (oggi assente), altrimenti un monitor fermo produce 24 Telegram al giorno e si impara a ignorarlo (P14). In alternativa, un secondo giro--solo-orariche guarda i tre monitor da 3h.ANALISI (passo 1, Opus, 27/09/2026)
ANALISI U8 — gitea:Adriano/PythagorasGoal#30 (B6) + #36 (A11, B13)
CARTELLA: /home/adriano/lavoro/PG-u8 RAMO: lavoro/goldrake-u8 (da main
841d4c7)#30
PERCHE': monitor_health gira solo alle 00:30 (cron_daily.sh). I sorveglianti orari hanno max_age 3h (cuscino_watch, venue_watch, collect_chain), quindi un sorvegliante fermo si scopre fino a 24h dopo.
--solo-orari: controlla solo i monitor con max_age <= 6h (derivato dalla tabella in src/live/monitor_health.py, non da una lista di nomi cablata).--solo-orarinotifica solo gli alert NUOVI rispetto al marcatore data/live/monitor_health_detto.json: {"detti": [], "ts": ...}.valida(... flag=("--quiet","--solo-orari")).uv run python scripts/live/monitor_health.py --quiet --solo-orari || true. Niente nuova riga di crontab.#36
PERCHE': book_execute (:47) e cuscino_watch (:53, puo' mandare ordini spot USDE) sono separati solo dal tempo; giri fino a 659 s sono stati misurati.
4. scripts/cron_book.sh — solo la riga di book_execute diventa:
flock -n -E 75 logs/.conto.lock uv run python scripts/live/book_execute.py --execute; rc=$?
[ $rc -eq 75 ] && echo " book: SALTATO — conto occupato da un altro giro (logs/.conto.lock)"
flock -n -E 75 logs/.conto.lock .... Se 75, riga " cuscino: SALTATO — conto occupato (logs/.conto.lock)". Mai-w: il giro scivolerebbe (verifica fable B13).--eseguisi lancia conflock logs/.conto.lock uv run python scripts/live/usde_convert.py --esegui .... Controlla se CLAUDE.md del repo ha una riga d'uso di usde_convert --esegui: se si', aggiorna anche quella (una riga).Controlla se cuscino_watch lancia usde_convert come subprocess: se si', il lock e' gia' tenuto dal padre, quindi usde_convert NON deve prenderlo di nuovo (deadlock con -n: il figlio lo troverebbe occupato). Documentalo in un commento.
TEST
bash -n scripts/cron_book.sh scripts/cron_cuscino.sh. Prova il flock a mano con un lock tenuto daflock logs/.conto.lock sleep 5 &e un comando finto (NON book_execute), per vedere il rc 75. Riportalo in PROVA.Suite:
cd /home/adriano/lavoro/PG-u8 && /opt/docker/PythagorasGoal/.venv/bin/python -m pytest -q -p no:cacheprovider. Baseline 1166 passed, 3 skipped.NON TOCCARE: la crontab, cron_daily.sh (il giro giornaliero resta), book_execute.py, cuscino_watch.py (salvo lettura).
COMMIT: "monitor_health: giro orario dei sorveglianti da 3h con marcatore gia' detto (#30)" e "cron_book/cron_cuscino: flock -n sul conto, un giro occupato si salta e si scrive (#36)".
ESITO: fatto sul ramo, non in produzione
RIF: gitea:Adriano/PythagorasGoal#30
FILE: commit
d59aea7su 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
monitor_health.py --solo-orari in coda a cron_cuscino.sh (ogni ora): monitor con max_age<=6h, avviso solo sul nuovo, marcatore data/live/monitor_health_detto.json scritto solo su invio riuscito. Giro giornaliero invariato. Commit
d59aea7.Su main
d34b0a8dal 27/09/2026 17:31Z, produzione aggiornata. Test 1220 passed.