#!/usr/bin/env python3 """servizio-madre-watch — supervisione meccanica del sistema, nessun LLM persistente. Sostituisce la vecchia sentinella persistente `sentinella-madre` (04/09/2026), che aveva tre compiti: relay mailbox->SendMessage, keep-alive esperti+gemello-ufficio, supervisione/rilancio sentinelle. Deciso con Mauro (04/09/2026, "non serve reattivita' immediata"): - relay mailbox: eliminato, le entry arrivano comunque al prossimo avvio sessione (hook session-start-reminder.sh). - keep-alive esperti (expert-domotica/data/flussi): eliminato, si lasciano scadere e si rilanciano a freddo on-demand quando servono davvero, invece di tenerli caldi per sempre. - check gemello-ufficio (scheduler.pid Ufficio): mantenuto, ha valore funzionale reale (non solo anti-timeout) - un demone Windows che nessun ping SendMessage tiene vivo da solo. Fatto con una slave one-shot per tick (PROTOCOLLO.md), non una sessione persistente. - supervisione/rilancio sentinelle: rimane meccanica (slave_sentinel_ensure.sh, invariato). **Monitoraggio Gmail non e' piu' compito suo (11/09/2026)**: `sentinella-gmail-personale` (Claude persistente, keep-alive/riavvio gestiti qui) e' stata abbandonata per davvero, non solo sospesa - sostituita da `servizio-gmail-check` (meccanico puro, zero LLM, systemd proprio, dentro `gemello-nave/gmail-check/`). Le funzioni di gestione di quella sentinella (riavvio preventivo per eta', ensure dedicato) sono state rimosse da qui insieme al loro codice morto (la chiamata era gia' commentata dall'8/09 per consumo token, mai piu' riattivata prima dell'abbandono definitivo). Vedi memory/MEMORY.md, thread token consumo istanze secondarie, per la diagnosi completa. Girato come servizio systemd (vedi servizio-madre-watch.service), Restart=on-failure. """ import subprocess import time from datetime import datetime, timezone from pathlib import Path ROOT = Path("/mnt/ssd/data/Dropbox/adrian") LOG = Path(__file__).parent / "watch.log" AVVIA_SLAVE = ROOT / "scripts" / "avvia_slave.sh" TICK_SECONDS = 3600 # non serve reattivita' immediata (deciso da Mauro, 04/09/2026) GEMELLO_TASK = ( "Applica il protocollo descritto in gemello-nave/madre-watch/PROTOCOLLO.md " "(check periodico gemello-ufficio), poi termina." ) def log(msg: str) -> None: line = f"{datetime.now(timezone.utc).isoformat()} {msg}" print(line, flush=True) with open(LOG, "a") as f: f.write(line + "\n") def check_gemello_ufficio() -> None: log("lancio slave check gemello-ufficio") result = subprocess.run( ["bash", str(AVVIA_SLAVE), GEMELLO_TASK], cwd=str(ROOT), capture_output=True, text=True, ) if result.returncode != 0: log(f"slave check gemello-ufficio terminata con errore (exit {result.returncode}): {result.stderr[:500]}") else: log("slave check gemello-ufficio completata") def main() -> None: log(f"avvio, tick ogni {TICK_SECONDS}s") while True: check_gemello_ufficio() time.sleep(TICK_SECONDS) if __name__ == "__main__": main()