Hub (legacy-dispatch-sync.js):
- publishPreview() + GET /dispatch/legacy-sync/publish-preview: apercu unifie
OPS->F (assignation + fermeture + horaire) + avertissements tech non mappe
= la liste des changements avant du bouton. Lecture seule.
- publishJob() + GET|POST /dispatch/legacy-sync/publish-job: apply par job
(GET=plan dry-run, POST=applique) via ops_reassign.php.
- staleTickets() + GET /dispatch/legacy-sync/stale: tickets ouverts sans
activite >=N j (natif, remplace le courriel stale de F); scope buckets/maxAge en SQL.
- staleNudge() + GET|POST /stale-nudge + digest planifie opt-in
(LEGACY_STALE_NUDGE), anti-spam persiste, nudge via alertWebhook.
Bridge F (ops_reassign.php):
- action schedule: write-back due_date/due_time (horaire OPS->F).
Verifie en prod (lecture seule + dry-run; aucune ecriture F reelle tiree).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>