Passer au contenu
megapromotingDiscutons

Expertise · Contenu automatisé

Un flux qui cherche tout seul les sujets du jour, écrit l’article, le traduit en dix-neuf langues et le publie — mais seulement après être passé par une porte de vérification qui, lorsqu’elle ne peut pas vérifier, ne publie rien.

Le moteur est écrit, complet, et se trouve dans le dépôt même de ce site : huit étapes, 1.706 lignes, un minuteur système qui démarre chaque jour à 00:30 UTC. La partie qui compte n’est pas la génération, mais la porte : cinq vérifications locales, dix expressions interdites et une vérification supplémentaire qui recherche des noms de clients sans accord, des chiffres inventés et des prix que nous n’avons pas. Si la porte ne peut pas s’exécuter, rien n’est publié.

Déjà construit„delivered”, pentru că lucrarea există ca fișiere pe care le puteți deschide, nu ca descriere: `scripts/content-engine/` din depozitul megapromoting.com, 17 fișiere, 1.706 linii de TypeScript, unitate systemd cu cronometru, opt etape legate cap la cap și jurnale ale rulărilor. Cu o rezervă pe care o spunem noi, nu o aflați voi: **singura rulare completă din jurnale nu a publicat niciun articol.** Poarta le-a oprit pe toate trei — două pentru că verificarea nu a putut rula deloc, a treia pentru un câmp lipsă din antet. `publish` a rămas gol, IndexNow a primit zero adrese. Rularea a fost locală, pe stația de lucru, și a durat două ore și jumătate, adică peste limita de 60 de minute pusă în unitatea systemd — deci pe server ar fi fost oprită. Nu putem confirma din exterior că motorul rulează azi pe server, și nu o pretindem.

L’automatisation qui écrit et publie seule est l’endroit où l’on promet le plus facilement ce qui n’est pas possible. Un modèle écrit mille mots convaincants sur n’importe quoi, y compris sur des choses qui ne se sont pas produites, et il les écrit avec la même fluidité. Si rien ne se trouve entre le modèle et le bouton de publication, vous avez construit une machine à mettre des erreurs sur internet, en vingt langues, chaque nuit. Tout le travail est dans ce qui se trouve entre les deux.

Notre flux comporte huit étapes. Il collecte des sujets à partir de sources ouvertes, leur attribue une note de 0 à 100 selon leur pertinence, écarte tout ce qui est en dessous de 50, choisit les premiers N avec une règle de diversité pour éviter dix articles sur la même chose, rédige l’article en roumain, le traduit en dix-neuf langues, le fait passer par la porte, et seulement ensuite publie. Chaque étape écrit son coût et son résultat dans un journal, afin qu’une exécution puisse être reconstituée après.

La gate a deux couches. La première est locale et ne coûte rien : l’en-tête doit exister et avoir un titre, une description et des mots-clés ; le texte doit dépasser 1.200 mots ; il doit comporter au moins trois sous-titres, au moins trois liens internes et une section de questions avec au minimum trois paires ; et il ne doit contenir aucune des dix expressions marketing que nous avons mises sur liste noire. La deuxième couche est un modèle qui cherche autre chose : un nom de client sans preuve de consentement, des statistiques inventées, des affirmations erronées sur ce que nous pouvons faire, et des prix que nous n’avons pas — la liste des vrais est écrite dans la vérification, et tout le reste est signalé.

Il existe une approbation humaine dans la chaîne, et nous le disons comme un argument, non comme une excuse. Les articles qui échouent aux vérifications dures sont jetés, pas publiés. Ceux qui passent la vérification dure, mais reçoivent des signalements de la deuxième vérification, sont conservés marqués, pour qu’un humain regarde. Et si la vérification ne peut pas s’exécuter — parce que le service de modèles ne répond pas, par exemple — l’article est traité comme ayant échoué. Fail-closed, pas fail-open. Cela s’est aussi produit lors de l’unique exécution complète dans les journaux, et c’est pourquoi rien n’a été publié.

Ce que cela comprend

Le travail, par composantes

Rassemble les sujets à partir de sources ouvertes, en parallèle, sans tomber si l’une se tait

Huit collecteurs démarrent en même temps : Hacker News, Reddit, Product Hunt, GitHub trending sur trois coupes, un ensemble de quatorze flux RSS et Indie Hackers. Chacun a sa propre prise d’erreur, donc une source en panne renvoie une liste vide et n’arrête pas l’exécution. Les résultats sont unifiés, les doublons sont supprimés par identifiant, puis un plafond de huit sujets par source est appliqué, triés selon la vitesse de circulation — afin qu’une source bruyante n’inonde pas l’étape suivante.

Note et jette, avant de dépenser pour écrire

Chaque sujet reçoit une note de 0 à 100 pour son adéquation avec ce que nous faisons, plus l’angle proposé, l’industrie cible et le service cible. Tout ce qui est en dessous de 50 est jeté. L’étape s’exécute sur un modèle bon marché, avec quatre fils en parallèle, justement parce que c’est l’étape qui décide sur quoi dépenser ensuite. De l’élection finale, on retire encore une couche : le premier passage prend un sujet par industrie, afin de ne pas obtenir dix variations sur le même fil.

Écris l’article avec une structure imposée, pas libre

Le générateur reçoit une structure stricte : 1.500–2.200 mots en roumain, en-tête YAML avec un titre d’au plus 60 caractères et une description de 155, un H1 et quatre à six H2, entre trois et cinq liens internes choisis dans une liste d’adresses qui existent sur le site, une citation mise en évidence, une section de questions compatible avec le schéma FAQPage et un appel final à l’action. Il fonctionne avec trois fils en parallèle, avec un budget de cinq minutes par article et un plafond de 5.000 jetons en sortie.

Traduit en dix-neuf langues, avec un glossaire qui ne se traduit pas

La source est le roumain ; les cibles sont dix-neuf, de l’anglais, du russe et de l’ukrainien jusqu’à l’arabe, à l’hébreu, à l’hindi, au japonais et au chinois simplifié — y compris deux écritures de droite à gauche. Les règles sont explicites dans le prompt : l’en-tête conserve sa structure, les adresses des liens internes ne sont ni réécrites ni localisées, les nombres, les unités et les dates se conservent, et les termes de marque du glossaire restent intacts. La traduction passe avec seulement deux fils en parallèle, délibérément — le gate des modèles limite le débit sous une charge plus élevée.

Le gate dur : cinq conditions et dix expressions interdites

Localement, sans aucun appel payant : l’en-tête doit exister et avoir un titre, une description et des mots-clés ; le texte doit dépasser 1.200 mots, comptés après suppression des blocs de code et des étiquettes ; au minimum trois sous-titres de niveau deux ; au minimum trois liens internes vers des sections qui existent sur le site ; une section de questions avec au moins trois paires. Plus la liste noire : « game-changing », « cutting-edge », « world-class », « revolutionize », « synergy » et cinq autres. Une seule occurrence fait échouer l’article.

Le deuxième gate cherche précisément ce qu’un compteur ne peut pas voir

Un deuxième modèle, avec une température basse et une réponse en JSON, reçoit l’article et cherche cinq choses : un nom de client sans preuve qu’il a donné son consentement, des statistiques hallucinées du type d’une disponibilité en pourcentage sans mesure, des affirmations inexactes sur ce que nous pouvons faire, un langage de brochure, et des affirmations sur des outils tiers qui laisseraient penser que nous les possédons, alors que nous les intégrons seulement. Il a aussi la liste des prix que nous avons réellement — tout prix en dehors de la liste est signalé.

Quand la vérification ne peut pas s’exécuter, l’article est traité comme ayant échoué

La deuxième vérification a un budget de 90 secondes, explicitement pour ne pas bloquer l’exécution. Si elle expire ou si le service de modèles ne répond pas, l’erreur est capturée et transformée en verdict négatif, pas ignorée. La conséquence est importante et c’est celle que nous aimons le plus : un article n’arrive pas en public parce que le gardien était absent. Cela s’est déjà produit, lors de l’unique exécution complète dans les journaux — deux articles entièrement rédigés n’ont pas été publiés parce que la vérification n’a pas pu être faite.

La publication n’a qu’une seule condition et trois étapes

La publication n’est même pas appelée si zéro article ont franchi la gate. Quand elle est appelée : elle ajoute seulement le répertoire de contenu, s’arrête s’il n’y a rien à committer, fait un commit avec la date, le nombre d’articles et le nombre de langues, et tente le push. Si le push échoue, le commit reste local et l’exécution continue — le travail n’est pas perdu et il n’est pas prétendu que cela a été publié. La notification des moteurs de recherche n’est faite que si le push a réussi.

Chaque exécution laisse son compte

À la fin, un rapport est écrit par jour : combien de sujets ont été collectés, combien ont passé la note, combien ont été choisis, combien ont été écrits, combien de traductions sont sorties, combien ont franchi la gate, ce qui a été committé et ce qui a été poussé, ce que les moteurs de recherche ont répondu, combien de temps cela a pris, et le coût ventilé par modèle, avec le nombre d’appels et les jetons d’entrée et de sortie. Le rapport est un fichier, pas un tableau de bord — il peut être lu, archivé et comparé.

À quoi cela ressemble

Le parcours, étape par étape.

01

Nous définissons ce qu’il a le droit d’écrire et ce qu’il n’a pas le droit d’écrire

Avant tout code : la liste des sujets que nous couvrons, la liste de ceux que nous ne touchons pas, le ton, et la liste noire d’expressions. C’est aussi ici qu’est écrite la liste des affirmations que le moteur n’a pas le droit de faire à votre sujet — clients, chiffres, prix, comparaisons. Ce que nous livrons : les règles écrites, sous la forme qui entre directement dans la vérification, et non comme un document séparé qui prend la poussière.

02

Nous lançons seulement la collecte et la notation, sans rien écrire

L’exécution se fait en mode sec : les sujets sont collectés, notés, les premiers sont choisis, le rapport est écrit, puis on sort avant la génération. C’est bon marché — lors d’une telle exécution dans nos journaux, il y a eu 24 appels, tous sur le petit modèle, avec un coût mesuré d’environ un centime au total. On voit exactement ce que le moteur aurait choisi, jour après jour, sans qu’il existe le moindre texte. Nous livrons : les rapports d’exécution à vide et l’accord sur ce qui est choisi.

03

Nous écrivons et vérifions, mais nous ne publions pas

La génération et la gate sont lancées, avec la publication arrêtée. Ici, les seuils sont calibrés : si tous les articles échouent sur la longueur, c’est autre chose à ajuster que s’ils échouent sur les liens internes. Ici, on voit aussi ce que signale la deuxième vérification, qui est la partie la plus instructive. Nous livrons : les articles générés, les verdicts complets avec le motif de chaque rejet, et les seuils ajustés.

04

Nous ouvrons la publication, la gate en place

Le chronomètre système et la publication sont lancés. L’heure est choisie hors pic, avec un délai aléatoire pour que les exécutions ne se marchent pas dessus ; chez nous, 00:30 UTC avec jusqu’à 30 minutes de délai, et avec reprise si le serveur était arrêté à cette heure-là. La limite de temps par exécution est fixée. Nous livrons : l’unité de service et le chronomètre, les journaux, et la procédure d’arrêt.

05

Nous ajoutons les langues, une par une

La traduction est l’étape la plus coûteuse et la plus facile à laisser déraper. Les langues sont ajoutées par bandes de priorité, pas toutes à la fois, et l’on vérifie ce qui sort pour chacune — surtout les écritures non latines, où la règle est que les termes de marque restent dans l’alphabet latin. Nous livrons : le glossaire, les langues activées, et le coût mesuré par langue à partir du journal d’exécution.

Opt etape1adunare din optculegători paraleli,fiecare cu prindereproprie de eroare2notare 0–100, aruncăsub 503alegere cudiversitate peindustrie4scriere în română,1.500–2.200 decuvinte5traducere în 19 limbicu glosar neatins6poarta dură, cincicondiții și zeceexpresii interzise7poarta a doua, carecaută clienți, cifreși premii inventate8publicare, doar dacăa trecut măcar unulCând poarta nu poate rula, nu se publică.
Opt etape

Les données

Ce que nous touchons, où elles sont et combien de temps elles restent

Les questions que pose toute personne ayant un délégué à la protection des données — posées ici avant qu'il ne les pose.

Ce qui entre
Titres, adresses et courts extraits de sources publiques — API ouvertes et flux RSS. Aucune donnée personnelle n’est collectée, aucun compte privé n’est lu et aucun accès derrière authentification n’est effectué. Chaque sujet conserve la source, le canal et le moment de la découverte, afin de pouvoir suivre d’où est parti un article.
Où se trouvent les textes
Sous forme de fichiers MDX dans le dépôt de code du site, sous `content/daily/{langue}/{date}/{slug}.mdx`. Pas dans une base de données séparée. La conséquence est que l’historique complet est l’historique git : on voit qui a écrit quoi, quand, et l’on peut revenir en arrière avec une commande. Chaque article a son propre en-tête, à partir duquel la page publique compose ses données structurées.
Où se trouvent les clés
Dans un fichier d’environnement lu par l’unité systemd au démarrage, en dehors du dépôt de code. Le chargeur d’environnement n’écrase pas une variable déjà définie dans le processus, donc la configuration d’exécution peut être remplacée sans toucher au fichier. Les appels aux modèles passent par notre gate interne, adressée localement sur le serveur.
Les journaux et leur durée de conservation
Un fichier JSON par jour dans le répertoire de journaux du moteur, plus la sortie standard et la sortie d’erreur écrites séparément dans `/var/log`, via l’unité systemd. Le journal quotidien contient les verdicts de la gate par article, avec le motif exact du rejet et le nombre de mots comptés. Il ne contient pas le texte des articles — ceux-ci sont dans le dépôt.
Ce que cela ne touche pas
Cela ne touche pas vos comptes de réseaux sociaux, n’envoie pas d’emails, n’écrit pas dans le CRM. La publication signifie un commit dans le dépôt du site et une notification à deux moteurs de recherche. Si vous voulez une publication sur d’autres canaux, cela se discute séparément, avec la même règle : gate avant, pas après.

Un cas

La nuit où le moteur a écrit trois articles et n’en a publié aucun

La situation

Une exécution complète, avec toutes les étapes lancées : collecte à partir de sources ouvertes, notation, sélection, rédaction en roumain, traduction, gate, publication. La cible était délibérément petite, trois articles, afin de voir la chaîne complète sans trop coûter.

Ce que nous avons construit

La collecte a apporté 24 sujets uniques après la suppression des doublons et le plafonnement par source. La notation en a gardé 18 et en a écarté 6 sous le seuil de 50. La règle de diversité en a choisi 3, issus d’industries différentes. Le générateur a écrit 3 articles en roumain. Le traducteur a produit 57 fichiers. Ensuite, la gate est intervenue.

Ce qui en est sorti

Aucun article n’est passé. Deux ont échoué parce que la deuxième vérification n’a pas pu être effectuée du tout — le service de modèles n’a pas répondu dans le budget de 90 secondes, et l’erreur a été traitée comme un verdict négatif, non ignorée. Le troisième a échoué sur une seule condition : il lui manquait le champ de mots-clés dans l’en-tête, bien qu’il comptât 2.478 mots, soit deux fois le seuil minimum. Comme aucun article n’est passé, la publication n’a même pas été appelée : le commit est resté vide, le push n’a pas été effectué, les moteurs de recherche ont reçu zéro adresse. Les 57 traductions sont restées sur disque, inutilisées.

Ce que le cas ne dit pas

L’exécution s’est faite sur le poste de travail, pas sur le serveur — cela se voit dans les chemins du journal — et a duré deux heures et demie, au-delà de la limite de 60 minutes fixée dans l’unité systemd. Elle démontre donc deux choses à la fois : que la gate tient, et que le lot quotidien est trop grand pour la limite de temps configurée. Les deux sont réelles, et toutes deux méritent d’être dites.

Questions

Ce que les gens nous demandent avant d'appeler

Publie-t-on sans qu’un humain voie le texte ?

Oui, si vous le choisissez — et non, sinon. Le moteur peut fonctionner entièrement automatiquement, et dans ce mode l’article qui passe les deux couches de la gate est publié sans que personne ne l’ait lu. Mais la gate n’est pas décorative : elle rejette l’article pour absence d’un champ d’en-tête, pour 1.199 mots au lieu de 1.200, ou pour une seule expression de la liste noire. Et si vous préférez que chaque article passe sous une paire d’yeux, la publication automatique est arrêtée et tout reste jusqu’à l’étape de vérification, avec les signalements visibles. Notre recommandation au début est la deuxième variante, jusqu’à ce que les signalements deviennent ennuyeux.

Que se passe-t-il lorsque le modèle se trompe sur un fait ?

Cela dépend du type de fait, et il faut dire honnêtement que tout ne se repère pas. Sont repérés : le nom de client posé sans preuve d’accord, la statistique inventée du type d’un pourcentage de disponibilité sans mesure, l’affirmation qui laisserait entendre que nous détenons un outil que nous n’intégrons que, le prix qui ne figure pas dans la liste des vrais. Ne sont pas repérés : une date de calendrier erronée tirée d’une nouvelle externe, ou une affirmation technique sur un produit tiers qui semble plausible. Pour ceux-là, il n’y a pas d’autre gardien qu’un humain, et c’est pourquoi chaque article conserve dans l’en-tête les sources dont il est parti — la vérification reste possible après publication, et la correction est un commit.

Comment arrêter le flux ?

Trois façons, dans l’ordre de rapidité. L’arrêt du chronomètre système — rien ne démarre plus demain. Le vidage de la variable qui contient la clé de publication — le moteur écrit et vérifie, mais la notification aux moteurs de recherche est sautée avec un avertissement dans le journal. Et l’exécution en mode à blanc, qui s’arrête après la sélection des sujets et ne génère rien. En plus, une exécution individuelle a une limite de temps dans l’unité de service, avec un signal doux d’abord, puis un arrêt forcé après.

Le moteur fonctionne-t-il maintenant, sur le serveur ?

Nous ne pouvons pas le confirmer de l’extérieur et nous ne le prétendrons pas. Ce que nous pouvons montrer, c’est le code, l’unité de service, le chronomètre, la procédure d’installation et les journaux des exécutions que nous avons. La seule exécution complète dans les journaux a eu lieu sur une station de travail, pas sur un serveur — cela se voit dans les chemins des fichiers — et a duré deux heures et demie, soit au-delà de la limite de 60 minutes de l’unité systemd. Si ce qui vous intéresse est l’état actuel de notre installation, demandez-nous et nous vérifions ensemble. Nous préférons cette question à un « oui » qui se révèle faux.

Combien d’articles a-t-il publié jusqu’à présent ?

D’après les journaux que nous avons : zéro. L’exécution complète a réuni 24 sujets, en a conservé 18 après notation, en a choisi 3, a écrit 3 articles et 57 traductions — et la gate les a tous arrêtés. Deux parce que la deuxième vérification n’a pas pu s’exécuter du tout, un pour un champ manquant dans l’en-tête, bien qu’il comptait 2.478 mots, donc il avait largement dépassé le seuil de longueur. La publication n’a pas été appelée, les moteurs de recherche n’ont reçu aucune adresse. Nous pourrions ne pas vous le dire. Nous le disons parce que c’est exactement la démonstration dont le service a besoin : la gate arrête bien.

Ce n’est pas du « contenu IA » qui nuit au positionnement dans la recherche ?

La bonne question n’est pas qui a écrit, mais si le texte répond à quelque chose que quelqu’un recherche vraiment et s’il est vérifiable. C’est pourquoi les seuils de la gate sont fixés sur des éléments corrélés à l’utilité, pas au style : longueur minimale, structure par sous-titres, liens internes vers des pages existantes, section de questions. Et c’est pourquoi la liste noire contient exactement les expressions qui signalent un texte écrit pour remplir de l’espace. Ce que nous ne vous promettons pas, c’est une position précise dans les résultats — cela dépend de beaucoup de choses qui ne dépendent pas de nous.

Combien coûte une exécution ?

Le coût se mesure, il ne s’estime pas : chaque appel au modèle comptabilise ses jetons d’entrée et de sortie, et le rapport quotidien donne le total ventilé par modèle, avec le nombre d’appels. Lors de l’exécution à blanc dans nos journaux : 24 appels sur le modèle peu coûteux. Lors de l’exécution complète avec trois articles et 57 traductions : 32 appels, dont 3 sur le modèle coûteux — qui ont représenté la plus grande part du coût. Le modèle utilisé à chaque étape est une variable d’environnement, donc on peut faire passer une étape sur un modèle moins cher sans toucher au code. Le montant en argent dépend des modèles choisis et de leurs tarifs au moment de l’exécution.

Dans quelles langues écrit-il et que se passe-t-il avec les termes de marque ?

La source est le roumain, les cibles sont dix-neuf — anglais, russe, ukrainien, polonais, allemand, italien, français, espagnol, néerlandais, arabe, turc, hébreu, hindi, japonais, coréen, indonésien, chinois simplifié, portugais brésilien et tchèque. Chaque langue a, dans la configuration, le motif de sa présence. Les termes de marque et les termes techniques sont dans un glossaire et restent non traduits, y compris en arabe, en hébreu et dans les écritures asiatiques, où la règle est explicite : ils sont conservés en alphabet latin. Les adresses des liens internes ne sont jamais localisées.

Qu’est-ce qui n’est pas prêt dans ce que vous m’avez décrit ?

Trois choses, dites maintenant pour que vous ne les découvriez pas vous-mêmes. La documentation propre a parfois pris de l’avance sur le code — le commentaire en tête de l’étape de notation mentionne un modèle qui n’est plus celui appelé, et le registre des sources décrit un ensemble de flux RSS plus grand que celui de la liste. Deuxièmement : deux des sources inscrites dans le registre sont marquées actives, mais leur collecteur n’est pas appelé dans la fonction qui rassemble tout, donc elles ne contribuent à rien aujourd’hui. Troisièmement : l’exécution complète des journaux a dépassé la limite de temps de l’unité de service, ce qui signifie que sur le serveur, avec les paramètres actuels, elle aurait été interrompue à mi-chemin — la limite doit être relevée ou le lot quotidien réduit avant le lancement automatique.

Sur quoi reposent les affirmations ci-dessus (26 sources)

26 d'entre elles sont du code et des fichiers de nos dépôts. Nous n'en publions ni le nom ni la ligne : réunies sur une seule page, elles décriraient trop précisément comment sont construits des systèmes qui ne sont pas seulement les nôtres. Nous les parcourons avec vous, dans le dépôt, sur demande — la vérification reste possible, elle se fait simplement lors d'un échange.

Qu'est-ce que vous voudriez voir mieux fonctionner ?

Racontez-nous votre processus. Ensemble, nous décidons ce qui vaut la peine d'être construit, ce que nous pouvons connecter et comment nous vérifions le résultat.

Discutons