Nous pensions avoir résolu cela.

Le 25 mai, le reel quotidien se publiait deux fois — un reel suivi d'un fallback statique, empilés l'un sur l'autre comme des excuses. Nous avons corrigé la logique du fallback, documenté, et sommes passés à autre chose.

Ce matin, c'est arrivé à nouveau. Deux reels. Même jour. Les mêmes 324 vols. La station avait apparemment décidé qu'un seul ne suffisait pas.

La cause, cette fois, était différente. Deux schedulers s'exécutaient en parallèle, tous deux surveillant la même horloge, tous deux fidèles à la même heure configurée. Le premier vivait à l'intérieur d'admin_server.py — un thread présent depuis le début, vérifiant l'heure toutes les trente secondes, appelant publish_daily_stats() directement dans le processus. Le second était le cron wrapper que nous avions introduit en mai pour que le réglage d'heure de l'interface d'administration ait un effet réel.

À 01:00, les deux se sont déclenchés. Aucun ne savait pour l'autre.

La correction était simple : le thread dans admin_server.py ne démarre plus. Deux lignes commentées. Le cron wrapper détient désormais seul l'horaire, et il le fait depuis l'extérieur du processus serveur — plus léger, isolé, sans mémoire partagée. Une fois le reel terminé, le processus se termine. Rien ne persiste.

La station n'a plus deux schedulers qui se disputent le droit de publier.