pjdZddlZddlZddlZddlZddlZddlmZmZddlm Z e dZ e dz dz dz Z e d z Z e e jd z Ze d z d z d z Ze e jdz ZdZdZej(dZdZdeddfdZdefdZdefdZdeddfdZdededdfdZdeddfdZd dZe dk(reyy)!u5Demone meccanico di trigger per gemello-nave, nessun LLM qui. Legge scripts/slave-mailbox/mailbox.log dall'ultimo offset persistito, filtra solo le righe nel perimetro (vedi FILTERS sotto — deciso in archivio/Adrian/progetti/project_gemello_nave.md) e, se ne trova, invoca gemello-nave a freddo (claude -p, cwd dedicata cosi' il suo CLAUDE.md di ruolo si carica automaticamente) passandole il testo grezzo degli eventi. gemello-nave decide da sola (classificazione, eventuale segnalazione in mailbox verso Adrian) - questo script non giudica mai nulla, solo osserva e invoca. Due modalita': - `--once`: un solo ciclo poll-and-dispatch, poi esce. Pensato per il crontab utente (nessun sudo richiesto) - stesso pattern di check_job_health.py, schedulato ogni 1-2 min via `crontab -e`. Scelta finale (11/09/2026): l'alternativa systemd (Type=simple, loop persistente interno, Restart=on-failure) richiede `sudo systemctl enable`, bloccato dal classificatore Auto Mode - crontab utente la aggira senza bisogno di permessi elevati, stesso identico effetto pratico (poll a intervallo fisso) con un meccanismo diverso. - senza flag: loop persistente interno (poll ogni POLL_SECONDS) - tenuto per compatibilita'/uso manuale, non piu' il meccanismo di produzione. Zero costo LLM quando non c'e' nulla di nuovo nel perimetro. N)datetimetimezone)Pathz/mnt/ssd/data/Dropbox/adrianscriptsz slave-mailboxz mailbox.logz gemello-naveztrigger.offsetarchivio_secretszcredentials.mdz watch.logZ)zcheck_job_health:zlogbook:z gmail-check:z gate-watch:z4^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2} zDSei gemello-nave, invocata a freddo dal demone di trigger meccanico.msgreturnctjtjj d|}t t d5}|j|dzdddy#1swYyxYw)N a )rnowrutc isoformatopenLOGwrite)r linefs gemello-nave/trigger/watch.pylogr8s[ll8<<(224 5Qse zpoll_once..~s:QqDy:sr)MAILBOXexistsstatst_sizer,r2rseekreaddecoder _TIMESTAMP_REmatchanyFILTERSappendjoinrK) r4sizeoffsetr new_byteskept keep_currentr3rs @r poll_oncereis >>  <<> ! !D ]F f}T v~ gt  vFFH  DL   ;FFH   t $:'::L  KK    $I  5)!s &"D''D0cdt}dtjvr t|yt dt dt t|tjt &#t$r}t d|Yd}~yd}~wwxYw#t$r}t d|Yd}~Zd}~wwxYw)Nz--oncez%errore nel ciclo di poll (ignorato): z"avvio loop persistente, poll ogni z s, filtri z?errore nel ciclo di poll (ignorato, riprovo al prossimo giro): ) r$sysargvre Exceptionr POLL_SECONDSr]timesleep)r4es rmainrns  E388 ? e   ,\N*WINO  Y e  <   ? 7u= > > ? Y QRSQVW X X Ys/ A* B* B 3BB  B/B**B/__main__)r N)!__doc__r@rerDrgrkrrpathlibrROOTrSrF__file__parentr(rrrjr]compilerZr>r1rr$r'r,r2rKrern__name__r+r%rrxs3*  ' *+  _ ,} <^# 8n##&66 Z*,/??  8nk)  K  RS OSTP#PS''''3's't',*S*T*>!& zFr%