32 lines
1.3 KiB
Markdown
32 lines
1.3 KiB
Markdown
# 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/<id>/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.
|