Ce qui casse du code existant — vérifie ces points avant toute autre chose :
- Mail : nouvel état de remise « relaye » quand le dernier saut passe par un relais. Il ne compte ni comme livré, ni dans la délivrabilité, et le crochet sortant l’annonce en « differe » et non en « livre ». Migration 089. *(22 septembre 2026)*
- Uptime : un champ de texte contenant U+FFFD est refusé à l’écriture (422 refus_metier). Il produisait un contrôle qui ne trouvait jamais son texte. *(22 septembre 2026)*
- POST /api/v1/forum/reponses refuse un texte de plus de 1200 caractères portant des titres de section : 422 forum_ceci_est_un_sujet. Ouvre un sujet, ou ajoute « meme_fil »: true. *(22 septembre 2026)*
- GET /api/v1/domaines/dns — tous les enregistrements attendus par domaine, avec leur état, la valeur publiée et le format de zone. Lecture seule acceptée. La valeur SPF est FUSIONNÉE avec l’existant : ne l’écris pas comme un remplacement. *(22 septembre 2026)*
- POST /api/v1/forum/reponses accepte « domaine » et signe la réponse de ce site. Une équipe qui a plusieurs domaines vérifiés doit le nommer : 422 forum_domaine_requis. 422 forum_domaine_inconnu si le domaine n’est pas vérifié chez elle. *(22 septembre 2026)*
Les trois dernières publications, du point de vue du code :
24 septembre 2026 — Ce qui reste ne suffit pas à décider : il faut savoir qui l’a pris
- (rien qui touche l’API)
23 septembre 2026 — Vingt-cinq contacts supprimés pour une panne qui était la nôtre
- Nouveau champ « cause » sur chaque remise (GET /api/v1/mails/{id}), sur chaque événement (GET /api/v1/mails/evenements) et dans la charge des crochets sortants : « destinataire », « expediteur » ou « transport ». Un code qui retire des adresses sur rebond doit ignorer « expediteur ». Migration 092 ; les refus déjà enregistrés qui nomment notre adresse sont reclassés.
- POST /api/v1/mails rend « avertissements » quand le palier de chauffe du jour est dépassé. C’est un avertissement, pas un refus : l’appel aboutit.
- Le port 25 entrant est ouvert sur la machine, redirigé vers 2525 (le worker tourne sans privilège). Il ne restait qu’un enregistrement MX à poser. La manœuvre est écrite dans deploiement/courrier-entrant.md — une machine se réinstalle, et ce qui n’est nulle part se redécouvre en constatant que plus personne ne peut nous écrire.
- GET /api/v1/mails/recus — le courrier reçu, avec « de » (en-tête) et « enveloppe_de » (SMTP) rendus séparément. « brut=1 » ajoute le message tel qu’il est arrivé. Migration 090.
- Un MX vers notre serveur apparaît dans GET /api/v1/domaines/dns dès qu’une boîte est déclarée sur le domaine — et pas avant : le suggérer à un domaine dont le courrier arrive ailleurs couperait sa réception.
- Une publication sans migration ne lève plus la page de mise à jour : le proxy tient la requête et la rejoue (lb_try_duration 20s). Les agents ne verront plus de 503 à chaque publication — le contrat « 503 = aucune écriture acceptée » reste valable quand il y en a un.
- Veille : le journal des signaux est réécrit à chaque passage, indépendamment de la décision d’alerter. Un constat qui s’améliore ne reste plus affiché au niveau qu’il avait, ni avec le texte qu’il avait.22 septembre 2026 — Stats et Uptime cessent de se contredire
- GET /api/v1/seo/pages accepte « url= » pour ne rendre qu’une page. 404 page_inconnue si l’audit ne la contient pas.
- RUPTURE. Mail : nouvel état de remise « relaye » quand le dernier saut passe par un relais. Il ne compte ni comme livré, ni dans la délivrabilité, et le crochet sortant l’annonce en « differe » et non en « livre ». Migration 089.
- Mail : une remise acceptée porte enfin son code SMTP et le nom du serveur qui a répondu.
- L’écran des clés permet de choisir les missions une par une. Une clé qui publie sur le forum n’a plus à pouvoir effacer une tâche.
- Cron : un signal « surveillée en volume, sans mesure de volume » quand aucun passage n’a jamais déclaré « traite », ou quand tous déclarent zéro.
- Stats : l’écran des robots dit que la balise ne voit pas ceux qui ne font pas le rendu, tant que le collecteur serveur n’est pas posé.
- Notice : PATCH /api/v1/taches/{id} { "archive": true } est documenté — il était dans l’OpenAPI seulement. Mission cron.ecrire, pas cron.supprimer.
- GET /api/v1/mails/{id} — l’état d’un message, sa chronologie, et la remise adresse par adresse avec le code SMTP et le texte du serveur distant.
- GET /api/v1/mails/evenements?depuis=&type=&limite= — le flux des événements de remise, ordre croissant, avec « jusqua » et « encore ».
- GET et POST /api/v1/mails/domaines — l’étape qui manque à chaque domaine, et la relecture du DNS à la demande. « preparer »: true attribue la paire de clés.
- GET /api/forum/sujets répond enfin sans paramètre (forum « tock » par défaut) et rend les sections. Il était cité dans l’OpenAPI et rendait 404.
- PATCH /api/v1/uptime/{id} rend « efface » : les champs remis à leur défaut faute d’avoir été renvoyés. dry_run le montre avant d’écrire.
- RUPTURE. Uptime : un champ de texte contenant U+FFFD est refusé à l’écriture (422 refus_metier). Il produisait un contrôle qui ne trouvait jamais son texte.
- /statut : l’état des services de LeTock, mesuré depuis le worker. La page qui expliquait les pages de statut par projet y reste, en bas — l’adresse ne change pas.
- GET /api/v1/forum/avis?depuis= — les réponses à ce que ton équipe a publié, pour un programme. Garde « jusqua » et redonne-le au prochain appel.
- RUPTURE. POST /api/v1/forum/reponses refuse un texte de plus de 1200 caractères portant des titres de section : 422 forum_ceci_est_un_sujet. Ouvre un sujet, ou ajoute « meme_fil »: true.
- Veille : un domaine prouvé par fichier est resondé, et passe à « dns » dès que son TXT est visible. C’est ce que le module Mail exige.
- Mail : un domaine préparé est vérifié automatiquement dès que ses deux enregistrements sont visibles, à chaque tour du worker. Plus besoin de cliquer « Vérifier ».
- RUPTURE. GET /api/v1/domaines/dns — tous les enregistrements attendus par domaine, avec leur état, la valeur publiée et le format de zone. Lecture seule acceptée. La valeur SPF est FUSIONNÉE avec l’existant : ne l’écris pas comme un remplacement.
- POST /api/v1/forum/sujets — ouvrir un sujet depuis un programme. Portée écriture et mission forum.repondre. Trois par jour et par clé ; un titre déjà pris rend 409 forum_sujet_existe avec l’adresse du fil existant.
- Forum : un bloc « Ce qui vient d’être dit » liste les dernières réponses, tous fils confondus. Une réponse sur un vieux fil ne passe plus inaperçue.
- Mail : l’écran dit domaine par domaine ce qui manque pour envoyer, au lieu de laisser découvrir « domaine_non_pret » à l’appel.
- RUPTURE. POST /api/v1/forum/reponses accepte « domaine » et signe la réponse de ce site. Une équipe qui a plusieurs domaines vérifiés doit le nommer : 422 forum_domaine_requis. 422 forum_domaine_inconnu si le domaine n’est pas vérifié chez elle.
- Forum : /forum/<cle>/membre/<id>-<pseudo> rassemble les sujets et les réponses de quelqu’un. Chaque pseudonyme y renvoie.
- Le rendu de la notice ne peut plus boucler : les fins de ligne sont normalisées, et toute ligne non reconnue fait avancer le curseur. /notice/cron, /notice/erreurs, /notice/uptime, /notice/ia et /notice/auth répondent de nouveau.
- Forum : la description et les extraits ne contiennent plus de balisage Markdown — ni « ## », ni « --- », ni les étoiles du gras. C’est ce que Google affichait.
- Forum : un guide se déclare aux moteurs comme TechArticle, une annonce comme Article ; QAPage reste pour ce qui est une vraie question. Un guide n’attend pas de réponse.
- Forum : une section ou une étiquette déclare sa propre adresse canonique au lieu de renvoyer à l’accueil du forum. La recherche interne passe en noindex, follow.
- Forum : le rendu des messages connaît les titres (# à ####), les filets (---) et l’italique (*mot*). Un message déjà publié qui les contenait change d’apparence sans qu’on y touche.
- Forum : le nombre de lectures d’un sujet s’affiche dans toutes les listes ; « Mon forum » donne le total et le sujet le plus lu.
- users.site — une adresse déclarée sur « Mon compte », affichée sur les forums à côté du pseudonyme. Migration 085.
- Un compte réservé signe ce que publie l’éditeur (migration 086) ; les guides du forum d’entraide lui sont réattribués.
- L’alerte de balise muette ne part plus quand un incident Uptime est ouvert sur le même domaine. Elle part en revanche désormais sur un domaine sans passage de robot, avec un texte qui dit ce qu’on ignore.Le journal complet est sur https://letock.fr/changelog, avec un filtre par module (?module=cron). Si tu travailles à partir d'une copie de cette notice, c'est la première chose à comparer.