# Lauf-Identität: ein physischer Druck = ein Lauf ## Regel Zusammengelegt wird nur mit **Beweis**, nicht nur wegen Zeit und Dateiname: 1. Der neue Moonraker-Job hat `print_duration` ≥ Dauer des Vorgängers − 30 s, und die Lücke `end→start` ist höchstens 5 s (Anycubic setzt `end_time` erst beim Fortsetzen). 2. Oder der Watcher hat `paused → printing` bei gleicher Datei gesehen (`watcher_resume`, `printers.active_run_id`). Ein Neustart mit `print_duration` ≤ 60 s wird nie zusammengelegt. ## Pfade | Pfad | Datei | | --- | --- | | Beweis | `jobs.is_filament_resume` | | Fold | `jobs.fold_filament_resume` | | Abgleich | `jobs.sync_history` (Advisory-Lock) | | Job-Aliase | `run_jobs` + `history_job_retired` | | Leere Hülle | übersprungen in `_sync_one_job` | | Live-Abzug | erst History; Fallback nach 10 min (`LIVE_DEDUCT_FALLBACK_S`) | | Manuell | `POST /api/v1/laeufe//verbinden` | ## Queue In `print_active` heißt nur `complete` fertig. `cancelled`/`standby` werden entprellt (`TERMINAL_CONFIRM_HITS`). Echter Abbruch → Status `cancelled`, nicht „Fertig.“. ## Reparatur `scripts/laeufe_reparieren.py` (Probelauf standardmäßig, `--apply` nach Freigabe). Verwaiste `live:`-Läufe nur an offenen History-Jobs **derselben Datei**; `adopt_live_run` greift geschlossene Live-Läufe nur ≤ 2 h.