#!/usr/bin/env python3 """check_job_health.py — controllo di salute indipendente dei job gate-ufficio. Diverso da `logbook/collect_logs.py` (Nave di sistema: cron/log locali di Nave, backup HDD, mirror pCloud) — questo appartiene al dominio delle "schedulazioni ufficio" (`schedule.json` -> servizio-schedulazioni -> gate-ufficio -> job_runner.py), stesso repository di quel circuito. Spostato qui il 03/09/2026 dopo essere stato scritto per errore dentro collect_logs.py, mescolando due sistemi di schedulazione concettualmente distinti (vedi memory/MEMORY.md). Legge solo i log dei job già sincronizzati da Ufficio via Dropbox in `../ufficio/logs/` — nessun accesso diretto a Ufficio, nessuna credenziale lato Nave. Indipendente da qualunque sessione Adrian viva. """ from __future__ import annotations import datetime as dt import json import re import subprocess from collections import deque from pathlib import Path from croniter import croniter HERE = Path(__file__).resolve().parent ROOT = HERE.parents[2] LOGS_DIR = HERE.parent / "ufficio" / "logs" SCHEDULE_PATH = HERE / "schedule.json" REPORT_PATH = HERE / "logs" / "job_health_latest.txt" NOTIFIED_ISSUES_PATH = HERE / "logs" / "job_health_notified_issues.json" MAILBOX_WRITE = ROOT / "scripts" / "slave_mailbox_write.sh" JOB_FILENAME_RE = re.compile(r"^(?P.+)_(?P\d{8})_(?P