sei sorveglianti senza registro dei giri: fuori da monitor_health #16

Closed
opened 2026-09-21 08:26:14 +00:00 by Adriano · 2 comments
Owner

COSA: sei sorveglianti non lasciano traccia dei giri, quindi monitor_health non puo' vederli morire. E' il difetto che ha tenuto morto cc01_regime_watch 14 notti (#10, riparato con #12 aggiungendo data/cc01_regime/runs.jsonl).
FILE: scripts/live/edge_watch.py, fee_watch.py, scale_watch.py, vrp_f_watch.py, venue_news.py (cron_daily 00:30), venue_watch.py (cron_book :47); src/live/monitor_health.py MONITORS.
Peso: edge_watch regge il kill del libro; fee_watch la decisione §3 «allerta da solo»; scale_watch il criterio A2 di SCALA-01; vrp_f_watch i criteri §5.18; venue_watch il tripwire di venue orario; venue_news il debito 8.
PROVA:

  • VERIFICATO: oggi nessuno e' morto. logs/cron_*.log: zero traceback dal 17/09 in 9 log; ultimi traceback di cron_daily = cc01 (03-16/09) e rebuild_history (07-15/07). data/fee_watch/state.json e data/vrp_f_watch/state.json scritti 2026-09-21 00:39, data/venue_watch/state.json 07:47.
  • VERIFICATO: edge_watch non scrive nessun file; in --quiet tace se non scatta. Un suo guasto si vedrebbe solo come traceback nel log.
    Origine: docs/revisioni/2026-09-21.md punto 1 e proposta 2.
COSA: sei sorveglianti non lasciano traccia dei giri, quindi `monitor_health` non puo' vederli morire. E' il difetto che ha tenuto morto `cc01_regime_watch` 14 notti (#10, riparato con #12 aggiungendo `data/cc01_regime/runs.jsonl`). FILE: scripts/live/edge_watch.py, fee_watch.py, scale_watch.py, vrp_f_watch.py, venue_news.py (cron_daily 00:30), venue_watch.py (cron_book :47); src/live/monitor_health.py `MONITORS`. Peso: `edge_watch` regge il kill del libro; `fee_watch` la decisione §3 «allerta da solo»; `scale_watch` il criterio A2 di SCALA-01; `vrp_f_watch` i criteri §5.18; `venue_watch` il tripwire di venue orario; `venue_news` il debito 8. PROVA: - VERIFICATO: oggi nessuno e' morto. `logs/cron_*.log`: zero traceback dal 17/09 in 9 log; ultimi traceback di cron_daily = cc01 (03-16/09) e rebuild_history (07-15/07). `data/fee_watch/state.json` e `data/vrp_f_watch/state.json` scritti 2026-09-21 00:39, `data/venue_watch/state.json` 07:47. - VERIFICATO: `edge_watch` non scrive nessun file; in `--quiet` tace se non scatta. Un suo guasto si vedrebbe solo come traceback nel log. Origine: `docs/revisioni/2026-09-21.md` punto 1 e proposta 2.
Adriano added the sviluppo label 2026-09-21 08:26:14 +00:00
Author
Owner

ANALISI (passo 1, Opus) — goldrake, sessione autorizzata da Adriano 2026-09-21 08:21Z; presa scritta qui perche' issue prendi rifiuta il repo. Ramo lavoro/goldrake, clone ~/lavoro/PythagorasGoal.
FILE:

  1. src/live/giri.py (nuovo): registra_giro(path: Path, **campi) -> bool appende {"ts": <ms epoch int>, **campi} come riga jsonl, crea la cartella; su OSError scrive una riga su stderr e ritorna False. Non solleva mai: un registro che fallisce non deve cambiare l'esito del sorvegliante.
  2. Ogni sorvegliante: costante di modulo RUNS = ROOT/"data"/<dir>/"runs.jsonl" e UNA chiamata dopo una misura completata. Niente riga se la misura non c'e' (P5: «non vedo» non e' un giro).
    • edge_watch.py main(): dopo run() → dir edge_watch, campi sharpe, n_alert.
    • fee_watch.py main(): dopo save_state → dir fee_watch, campo level.
    • scale_watch.py main(): dopo run_once → dir scale_watch, campo stato.
    • vrp_f_watch.py main(): dopo _save_state, solo se R non e' vuoto → dir vrp_f_watch, campi pairs, ready.
    • venue_news.py main(): dopo la scrittura delle voci (feed letto) → dir venue_news, campi voci, nuove. Feed illeggibile (return 2): nessuna riga.
    • venue_watch.py main(): dopo run_once e check_specs → dir venue_watch, campo livelli.
  3. src/live/monitor_health.py MONITORS: sei MonitorSpec, open_labeled=False; giornalieri cadence 24.0, max_age_h 30.0; venue_watch cadence 1.0, max_age_h 3.0; gate = la decisione che reggono (kill del libro; §3 fee; SCALA-01 A2; §5.18; tripwire venue; debito 8).
  4. .gitignore: le cartelle nuove sotto data/ se non gia' coperte.
    TEST:
  • src/live/giri: scrive ts in ms; OSError → False senza eccezione.
  • incrocio P1 per i sei: percorso MonitorSpec == RUNS del modulo (come tests/test_cc01_regime_watch.py per cc01).
  • per ogni sorvegliante: misura finta via monkeypatch + RUNS in tmp_path → una riga; ramo di non-misura (feed None, R vuoto, eccezione) → nessuna riga.
    Primo giro dopo il deploy: cron_daily lancia i cinque giornalieri PRIMA di monitor_health → stato NUOVO, che non allerta (alerts_from). venue_watch accumula dal :47.
    NON TOCCARE: logica di misura, soglie, notifiche dei sorveglianti; scripts/cron_*.sh; config/live.json; src/live/book.py; cc01_regime_watch.
    PORTING: tutti i file toccati sono identici in TradingBook (cmp 2026-09-21): stessa patch la'.
ANALISI (passo 1, Opus) — goldrake, sessione autorizzata da Adriano 2026-09-21 08:21Z; presa scritta qui perche' `issue prendi` rifiuta il repo. Ramo lavoro/goldrake, clone ~/lavoro/PythagorasGoal. FILE: 1. src/live/giri.py (nuovo): `registra_giro(path: Path, **campi) -> bool` appende `{"ts": <ms epoch int>, **campi}` come riga jsonl, crea la cartella; su OSError scrive una riga su stderr e ritorna False. Non solleva mai: un registro che fallisce non deve cambiare l'esito del sorvegliante. 2. Ogni sorvegliante: costante di modulo `RUNS = ROOT/"data"/<dir>/"runs.jsonl"` e UNA chiamata dopo una misura completata. Niente riga se la misura non c'e' (P5: «non vedo» non e' un giro). - edge_watch.py main(): dopo `run()` → dir `edge_watch`, campi sharpe, n_alert. - fee_watch.py main(): dopo `save_state` → dir `fee_watch`, campo level. - scale_watch.py main(): dopo `run_once` → dir `scale_watch`, campo stato. - vrp_f_watch.py main(): dopo `_save_state`, solo se `R` non e' vuoto → dir `vrp_f_watch`, campi pairs, ready. - venue_news.py main(): dopo la scrittura delle voci (feed letto) → dir `venue_news`, campi voci, nuove. Feed illeggibile (return 2): nessuna riga. - venue_watch.py main(): dopo `run_once` e `check_specs` → dir `venue_watch`, campo livelli. 3. src/live/monitor_health.py `MONITORS`: sei MonitorSpec, `open_labeled=False`; giornalieri cadence 24.0, max_age_h 30.0; venue_watch cadence 1.0, max_age_h 3.0; `gate` = la decisione che reggono (kill del libro; §3 fee; SCALA-01 A2; §5.18; tripwire venue; debito 8). 4. .gitignore: le cartelle nuove sotto data/ se non gia' coperte. TEST: - src/live/giri: scrive ts in ms; OSError → False senza eccezione. - incrocio P1 per i sei: percorso MonitorSpec == `RUNS` del modulo (come tests/test_cc01_regime_watch.py per cc01). - per ogni sorvegliante: misura finta via monkeypatch + RUNS in tmp_path → una riga; ramo di non-misura (feed None, R vuoto, eccezione) → nessuna riga. Primo giro dopo il deploy: cron_daily lancia i cinque giornalieri PRIMA di monitor_health → stato NUOVO, che non allerta (`alerts_from`). venue_watch accumula dal :47. NON TOCCARE: logica di misura, soglie, notifiche dei sorveglianti; scripts/cron_*.sh; config/live.json; src/live/book.py; cc01_regime_watch. PORTING: tutti i file toccati sono identici in TradingBook (cmp 2026-09-21): stessa patch la'.
Author
Owner

Soluzione

ESITO: fatto
FILE: src/live/giri.py (registra_giro, mai un'eccezione); edge_watch, fee_watch, scale_watch, vrp_f_watch, venue_news, venue_watch scrivono data/

/runs.jsonl dopo una misura completata; src/live/monitor_health.py sei MonitorSpec (30h giornalieri, 3h venue_watch); .gitignore; tests/test_giri.py, tests/test_watch_runs.py. Commit 1a7f670, portato in TradingBook 03808ca.
PROVA: suite 1098 passed; produzione dal 2026-09-21 08:48:42Z; check_all in produzione: i sei ASSENTE come atteso fino al primo giro. venue_watch scrive dal giro delle 09:47; i cinque giornalieri il 2026-09-22 00:3x, prima di monitor_health (stato NUOVO, non allerta).
PROSSIMO: 2026-09-22 dopo le 00:41Z controllare che monitor_health mostri i sei (NUOVO/OK), non ASSENTE.

**Soluzione** ESITO: fatto FILE: src/live/giri.py (registra_giro, mai un'eccezione); edge_watch, fee_watch, scale_watch, vrp_f_watch, venue_news, venue_watch scrivono data/<dir>/runs.jsonl dopo una misura completata; src/live/monitor_health.py sei MonitorSpec (30h giornalieri, 3h venue_watch); .gitignore; tests/test_giri.py, tests/test_watch_runs.py. Commit 1a7f670, portato in TradingBook 03808ca. PROVA: suite 1098 passed; produzione dal 2026-09-21 08:48:42Z; check_all in produzione: i sei ASSENTE come atteso fino al primo giro. venue_watch scrive dal giro delle 09:47; i cinque giornalieri il 2026-09-22 00:3x, prima di monitor_health (stato NUOVO, non allerta). PROSSIMO: 2026-09-22 dopo le 00:41Z controllare che monitor_health mostri i sei (NUOVO/OK), non ASSENTE.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/PythagorasGoal#16