Ce qui a changé dans SEO & LLM.
20 septembre 2026
L’exploitation savait ce qui existe, pas ce qui se passe
CronUptimeVeilleSEO & LLMIAMailErreursForum
- Huit modules, huit courbes, sur le même écran.L’écran d’exploitation comptait ce qui EXISTE — des comptes, des équipes, des tâches — et signalait ce qui va mal. Il ne disait rien de ce qui se PASSE : combien de crons sont partis, quand la veille a trouvé quelque chose, si les agents tournent encore. Il fallait ouvrir huit écrans, chacun ne montrant que son module. Trente jours d’activité par module tiennent maintenant sur une grille, avec ce qui a raté en pointillé par-dessus le volume.
- Une carte dit à quelle heure la plateforme travaille.Sept lignes, vingt-quatre colonnes, l’activité d’un mois repliée sur une semaine type. C’est la réponse à la question qu’on se pose avant de déplacer une sauvegarde ou de redémarrer un service : où est le creux. En heure de Paris et non en UTC, changement d’heure compris — une carte décalée d’une heure reste plausible, et c’est pour ça qu’elle est dangereuse.
- Le tableau de bord cachait 87 % du trafic.Mesure sur letock.fr : 12 859 pages vues en trente jours, dont 11 166 par des robots et des assistants IA. Le tableau en affichait 1 693 — les humains — et rien ne disait que le reste existait. Ce n’était pas un oubli : l’agrégat horaire exclut volontairement les automates, sinon la détection d’effondrement de volume se tromperait à chaque passage d’aspirateur. Il manquait la seconde moitié. Une tuile « Robots et IA » la donne, avec la part qui lit pour des modèles de langage — et elle ne s’additionne pas aux visiteurs : ce sont deux populations, et les mêler redonnerait le chiffre unique que ce module passe son temps à dire de ne pas regarder.
- On voit enfin les alertes qui n’atteignent personne.La table des alertes enregistre depuis toujours le nombre de destinataires, et zéro en est la valeur intéressante : une alerte décidée, écrite, et arrivée nulle part. Le module croit avoir prévenu. Aucun écran ne montrait ce chiffre ; il est désormais en avertissement dès qu’il dépasse zéro.
19 septembre 2026
Le produit avait deux themes sombres, et personne ne pouvait le voir
CronStatsErreursUptimeSEO & LLMMailVeilleForumIA
- Il y avait deux themes sombres, et ils n’avaient pas la meme couleur de marque.Le sombre applique a qui a son systeme en sombre etait ORANGE. Celui applique a qui clique « Sombre » dans la barre de gauche etait ROSE. Treize jetons sur treize differaient. Quelqu’un dont le systeme etait deja en sombre et qui cliquait « Sombre » pour confirmer ce qu’il avait voyait la couleur du produit changer. Il n’y en a plus qu’un, et un test refuse desormais que les deux listes divergent d’une virgule.
- La coloration du code etait illisible en sombre.Le theme sombre choisi ne redefinissait pas les quatre couleurs de coloration syntaxique : un bloc de code gardait les teintes calculees pour du papier blanc. Mesure : un mot-cle a 2,42 contre 1 sur le fond — la norme en exige 4,5. Sur un produit qui s’adresse a des developpeurs, c’etait la surface la plus consultee qui cassait.
- Un gris employe cent vingt-trois fois passait sous le seuil de lisibilite.Les en-tetes de tous les tableaux, les legendes, les horodatages, les notes sous les chiffres : 2,91 contre 1 la ou la norme en exige 4,5. Le fichier d’erreur du produit portait meme un commentaire qui diagnostiquait le probleme — et le contournait a un seul endroit. Le jeton est corrige a la source, donc les cent vingt-trois usages avec.
- On peut enfin sauter la navigation au clavier.Il n’y avait aucun lien d’evitement. Avec une barre de gauche de neuf modules et six liens de compte, c’etait une quinzaine de tabulations avant le titre de la page, sur chacun des trente-six ecrans. Et dix-huit zones qui defilent — tous les tableaux de donnees — ne pouvaient pas recevoir le focus : des colonnes entieres etaient inatteignables sans souris. Quatre manquements de niveau A fermes.
- Un bouton fait 44 pixels. Partout.Il n’en declarait aucune hauteur : il heritait l’interligne de la prose qui l’entourait, et la feuille en declarait dix-huit. Le meme bouton mesurait 47,25 px sur l’accueil, 48,75 dans la notice, 48,80 sur le verificateur. Dans le formulaire de connexion, le champ e-mail faisait quatre pixels de moins que le bouton juste en dessous. Mesure apres correction : 44,00 partout, champs compris.
- Les pages anglaises qui n’existaient pas ne se font plus passer pour telles.Huit adresses sur onze repondaient en `/en/...` avec le texte francais, sous une declaration de langue anglaise. Un lecteur d’ecran prononcait du francais avec la phonetique anglaise, et cliquer « English » depuis les mentions legales rendait la meme page en francais. Elles redirigent maintenant vers l’originale, et le selecteur n’offre plus une langue que la page n’a pas.
- La notice se lit chapitre par chapitre.Elle tenait sur une seule adresse de 481 kilo-octets et 2 798 balises : chercher « les quotas » telechargeait aussi les sept autres chapitres. Huit pages desormais, chacune avec son adresse partageable, et un sommaire en index. Le fichier `/notice.md` continue de servir l’integrale aux assistants, ce pour quoi il existe.
- Une recherche, pour tous les modules a la fois.Passer de « l’incident uptime du domaine X » aux « erreurs du meme domaine » demandait quatre interactions et deux chargements. Un champ dans la barre de gauche cherche maintenant dans les projets, les domaines, les taches, les controles et les erreurs d’un coup. Sans JavaScript : c’est une adresse, donc ca se partage et ca se met en signet.
- Les taches et les erreurs se traitent par lots.Mettre vingt taches en pause avant une migration demandait vingt navigations ; fermer trente empreintes apres un deploiement rate, trente. Des cases a cocher et deux boutons, sans une ligne de JavaScript. Les colonnes de la liste des taches se trient aussi, et l’en-tete du tableau suit le defilement.
- Le clic produit enfin quelque chose a l’ecran.Aucune page n’avait d’etat de chargement : entre le clic et l’affichage, rien ne bougeait. Et le marqueur d’attente, ecrit precisement pour ca, n’etait monte que sur l’application — pas sur le verificateur de domaine, qui est l’attente la plus longue du site public. Les deux sont corriges.
- La page « introuvable » a retrouve sa navigation.Elle n’avait ni barre du haut, ni pied, ni logo : quelqu’un arrive par un lien mort voyait deux phrases et deux boutons sur une page nue. Idem pour la page d’erreur. Un favicon a aussi ete ajoute — `/favicon.ico` repondait 404.
- Les polices sont servies par nous.Elles venaient de Google, par une feuille bloquante sur un domaine tiers, sans preconnexion — un aller-retour DNS et TLS de plus avant de pouvoir peindre le texte, et l’adresse IP de chaque visiteur transmise a Google. Elles sont auto-hebergees : la politique de securite du contenu y a perdu deux domaines tiers.
- Le systeme de design s’applique enfin, au lieu d’etre ecrit quelque part.Quatre-vingts jetons etaient declares ; la feuille de style ne les employait presque pas — cinquante-neuf usages pour huit cent quatre-vingt-quinze valeurs ecrites a la main. Mille quatre cents declarations sont passees sur l’echelle : espacements, tailles de texte, interlignes, rayons, durees. Onze creux de carte differents sont devenus trois, seize facons d’ecrire un titre de section sont devenues sept, dix-huit interlignes sont devenus huit — et chacun dit desormais son role : un chiffre, un titre, un controle, de la prose, de la lecture longue, du code. Rien de tout ca ne se voit page par page ; ce qui se voit, c’est que deux ecrans voisins ne se ressemblent plus par hasard.
- Chaque deplacement a ete mesure avant d’etre garde.Une migration de mille quatre cents declarations ne se relit pas. On a donc releve quarante-deux proprietes calculees de chaque element — douze pages, trois largeurs, deux themes, trente-trois mille sept cent quatre-vingt-douze empreintes — avant et apres chaque passe. Les deux passes purement mecaniques sont ressorties identiques au caractere pres ; les autres ont deplace sept mille neuf cent soixante elements, aucun de plus de deux pixels. Trois ecarts qu’on s’appretait a effacer se sont reveles etre des choix : l’interligne de la notice, celui du code et celui des grands nombres. Ils ont chacun leur jeton maintenant, au lieu d’etre rabattus sur la moyenne.
- La barre de gauche passait sous un tableau.Trouve en posant l’echelle de profondeur : la navigation etait a cinq, et l’en-tete de tableau collant qu’on venait d’ajouter a dix. Les deux ne se croisaient pas encore — l’en-tete colle a l’interieur de son conteneur — mais une couche de contenu declaree au-dessus de la navigation est un piege pose pour la modification suivante.
- Le produit s’appelle « LeTock » partout, y compris dans l’objet de tes courriels.Il s’appelait « LeTock » sur la page de tarifs et « Tock » dans le tableau de bord — cent quarante-six endroits ne savaient pas comment on se nomme. Un point concret pour toi : les onze courriels d’alerte partent desormais sous « LeTock — … » et non plus « Tock — … ». Si tu as une regle de boite aux lettres ecrite sur l’ancien objet, elle ne trie plus rien. En revanche rien n’a bouge du cote machine : les en-tetes signes et l’agent gardent leur nom, aucun code de verification n’est a toucher.
- L’analyseur de cron mene a la tache.C’est la page la plus visitee du site, et son seul appel a l’action allait vers la connexion — qui ne savait rien de l’expression qu’on venait d’analyser. Il fallait la retaper apres inscription. Le bouton « Surveiller cette tache » traverse maintenant la connexion et prerremplit le formulaire.
Ce que ça change pour ton code
- `pg` etait importe par le code de production sans etre declare dans `package.json` : il n’arrivait que comme dependance transitive d’un paquet de developpement. Le site tenait parce que le script de deploiement COPIE `node_modules` ; l’image Docker du worker, elle, fait `npm ci --omit=dev` et ne pouvait donc pas ouvrir une connexion a la base. Declare, et un test verifie desormais que tout import de production l’est.
- Les pages de vitrine sans etat repondent `Cache-Control: public, s-maxage=300` quand la requete n’apporte aucun cookie. Rien n’etait mis en cache auparavant — ni par le CDN, ni par le navigateur, y compris les mentions legales.
- Nouvelle adresse `/recherche?q=`, nouvelles adresses `/notice/<chapitre>` (huit), nouvelle page `/statut`. Les chapitres de la notice sont au plan du site.
- La specification OpenAPI s’intitulait « Tock » ; le produit s’appelle « LeTock ». Vingt occurrences corrigees, dont neuf dans les mentions legales.
- Le produit s’appelle « LeTock » a l’ecran ; rien n’a change sur le fil. Les en-tetes signes restent `Tock-*` et l’agent reste `Tock/1.0` : aucun code de verification n’est a toucher. Le prefixe que la plateforme se reserve se deduit desormais de l’en-tete reellement pose, au lieu d’etre ecrit a la main.
- En-tete `cross-origin-opener-policy: same-origin` ajoute. `cross-origin-resource-policy` a ete ecarte volontairement : il aurait empeche le chargement de `/t.js` et `/forum.js` depuis les sites clients.
14 septembre 2026
Auth, le tableau de bord, des quotas qui s’appliquent, et une notice pour les IA
AuthSignauxStatsCronMailUptimeVeilleSEO & LLMErreursIA
- Les quotas s’appliquent : ce qui était annoncé sur la page Tarifs et ce que le produit laissait faire étaient deux choses différentes — un forfait Équipe à qui l'on promettait cent tâches en obtenait cinq. Chaque forfait a maintenant ses quotas, appliqués au geste près, et un test fait échouer la suite si un forfait cesse d'être rentable quand un abonné le consomme à fond.
- Ce que tu consommes se voit : huit jauges sur ta page Mon compte, remises à zéro le 1er. Avant, le premier signe qu'un plafond existait était un refus.
- Une notice pour les assistants de code : toute la plateforme en un fichier, à l'adresse /notice.md — les modules, chaque route, les quotas, les pièges, et ce que Tock ne fait pas. Elle est fabriquée à l'instant où on la demande, donc elle ne peut pas être en retard sur le produit, et elle commence par dire à l'assistant qui la lit d'aller la rechercher à chaque session plutôt que de se fier à une copie.
- Donne les commandes à ton IA : sur le tableau de bord, tu coches ce que tu autorises — regarder, créer des tâches, envoyer des e-mails — et tu repars avec la clé **et** le texte à coller dans ta conversation : ce qui est permis, ce qui ne l'est pas, et quoi faire d'un refus. Approuver une validation humaine n'est jamais proposé à un agent : une validation qu'il peut s'accorder lui-même n'en est plus une.
- Auth : Tock devient fournisseur d'identité pour tes applications. Un vrai serveur OpenID Connect — code d'autorisation avec PKCE exigé, rotation des jetons, signature RS256 que tes applications vérifient sans nous appeler, donc notre panne ne devient pas la tienne. Tes utilisateurs se connectent sans mot de passe, sur un écran qui porte ton nom et pas le nôtre. Le flux implicite et le flux par mot de passe sont refusés : ils ont été retirés des recommandations, les proposer serait offrir une porte qu'on sait mauvaise.
- Tes utilisateurs ne sont pas nos comptes : ils vivent dans une table à part, cloisonnés par projet. Deux tables plutôt qu'un drapeau — un drapeau finit toujours par être oublié dans une clause de filtrage, et ce jour-là l'utilisateur d'un client entre dans le compte d'un autre.
- Un tableau de bord : ce qui demande attention sur tous tes projets d'un coup d'œil, cumulé ou projet par projet. C'est là que tu arrives en te connectant. Dix requêtes que tu aies un projet ou dix — mesuré, pas supposé.
- Stats s’explore : cliquer un pays, une source, une page filtre tout l'écran. Treize dimensions, combinables, avec exclusion, et tout dans l'adresse — donc partageable. Les dix répartitions étaient des listes mortes ; ce sont des portes.
- Stats compte enfin l’argent : la valeur envoyée avec un événement n'était jamais sommée. Revenu par source, par page, par campagne, panier moyen, revenu par visiteur. Des objectifs déclarables avec leur taux de conversion, attribués au premier contact du visiteur — sinon tout revient à l'accès direct.
- Entonnoirs, parcours, retours : où les gens tombent, par quel chemin ils passent, qui revient. Les retours disent d'abord ce qu'on ne peut pas mesurer : l'empreinte d'un visiteur est jetée chaque nuit, donc personne — nous compris — ne relie une visite de mardi à une visite de mercredi.
- Signaux : le module qui manquait, et qui est la thèse du produit. Chaque module dépose ce qu'il constate dans un journal commun ; quand deux modules différents constatent quelque chose sur le même domaine à moins de trois jours d'écart, l'écran le dit — « tes ventes ont chuté mardi, ton certificat avait expiré lundi ». Aucun outil isolé ne peut produire cette phrase.
- Une faille d’authentification, corrigée : sans application GitHub configurée, la session réelle était ignorée et tout visiteur devenait le compte de démonstration. En production, une variable d'environnement oubliée ouvrait la plateforme. Le repli de démonstration ne s'active plus hors développement, et la connexion par e-mail n'est plus court-circuitée.
- Un double envoi d’e-mails, fermé : la file d'envoi était lue sans être réservée. Deux workers remettaient deux fois le même message au destinataire final — une faute irréversible. La réservation est désormais atomique, et cinq autres veilles qui avaient le même défaut avec elle.
- La clé API ne passe plus par l’URL : elle entrait dans l'historique du navigateur, dans les journaux du proxy et dans l'en-tête de la navigation suivante. Elle transite par un cookie de deux minutes, effaçable d'un bouton.
- La validation humaine ne s’approuve plus au clavier : « Approuver » était le premier bouton du formulaire, donc la touche Entrée dans le champ de note approuvait l'action d'un agent. Le défaut clavier est maintenant de ne rien décider.
- Les mesures sont enfin purgées : deux tables annonçaient en commentaire une purge qui n'existait nulle part — les deux plus alimentées du produit. Et quatorze purges tournaient chaque minute sur un index inutilisable, donc en balayage complet. Une migration d'index, et la rétention promise est tenue.
- Une seule façon de naviguer dans un module : les sections vivaient tantôt dans la barre de gauche, tantôt en onglets dans la page, sans règle. La barre est le seul endroit où l'on navigue dans un module — et elle dit désormais, module par module, ce qui demande à être regardé.
- Un seul vocabulaire visuel : quatre classes d'en-tête de page, deux rangées de chiffres, trois sortes de carte, six conventions de bouton et trois collisions de styles — dont une qui faisait perdre leur couleur à tous les messages d'erreur du produit. Tout ça vient d'un même socle de composants.
- Le thème se choisit : l'échappatoire existait dans la feuille de style depuis le début, et rien ne la posait jamais. Clair, sombre, ou comme le système — sans JavaScript, donc sans scintillement.
- Se déconnecter : il n'existait aucun moyen de sortir de son compte. Sur un poste partagé, c'était un problème.
Ce que ça change pour ton coderupture
- Les clés d'API portent des **missions** : ce qu'elles ont le droit de faire, geste par geste, coché sur le tableau de bord. Un appel hors de cette liste répond 403 « mission_non_autorisee ».
- Rupture. Une route d'écriture qui n'est nommée dans aucune mission tombe dans « divers.ecrire », décoché par défaut : **ce qui est ajouté à l'API après la création d'une clé lui est fermé** tant que personne ne l'ouvre.
- Rupture. Les quotas des forfaits sont appliqués pour de bon, et non plus par des constantes qui ne connaissaient aucun forfait. Un dépassement mensuel répond 429 « quota_atteint » ; les compteurs repartent le 1er.
- Rupture. L'intervalle minimum entre deux exécutions d'une tâche passe de 5 à 15 minutes sur le forfait gratuit, et dépend désormais du forfait. Une tâche existante n'est pas touchée ; une modification qui repasse sous l'intervalle est refusée.
- Nouvelle adresse `/notice.md` : toute la plateforme en un fichier, fabriqué à la demande depuis le code. Et `/notice`, la même chose lisible dans un navigateur.
- `/llms.txt` annonçait un intervalle minimum de 5 minutes écrit en dur, qui était déjà faux. Les quotas qu’il cite viennent maintenant des forfaits.