Vai al contenuto
megapromotingParliamone

Competenza · Contenuto automatico

Un flusso che cerca da solo gli argomenti del giorno, scrive l’articolo, lo traduce in diciannove lingue e lo pubblica — ma solo dopo aver superato una porta di verifica che, quando non può verificare, non pubblica nulla.

Il motore è scritto, completo, e si trova proprio nel repository di questo sito: otto fasi, 1.706 righe, un cronometro di sistema che si avvia ogni giorno alle 00:30 UTC. La parte che conta non è la generazione, ma il gate: cinque verifiche locali, dieci espressioni vietate e una verifica supplementare che cerca nomi di clienti senza consenso, cifre inventate e premi che non abbiamo. Se il gate non può essere eseguito, non si pubblica.

Già costruito„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’automazione che scrive e pubblica da sola è il luogo in cui è più facile promettere ciò che non si può. Un modello scrive mille parole convincenti su qualsiasi cosa, comprese cose che non sono accadute, e le scrive con la stessa fluidità. Se tra il modello e il pulsante di pubblicazione non c’è nulla, avete costruito una macchina per mettere errori su Internet, in venti lingue, ogni notte. Tutto il lavoro sta in ciò che c’è in mezzo.

Il nostro flusso ha otto fasi. Raccoglie argomenti da fonti aperte, assegna loro un punteggio da 0 a 100 in base alla pertinenza, scarta tutto ciò che è sotto 50, sceglie i primi N con una regola di diversità per evitare dieci articoli sulla stessa cosa, scrive l’articolo in romeno, lo traduce in diciannove lingue, lo fa passare attraverso la porta, e solo allora pubblica. Ogni fase scrive il proprio costo e il proprio risultato in un log, così una esecuzione può essere ricostruita dopo.

La porta ha due livelli. Il primo è locale e non costa nulla: l’intestazione deve esistere e avere titolo, descrizione e parole chiave; il testo deve superare 1.200 parole; deve avere almeno tre sottotitoli, almeno tre collegamenti interni e una sezione di domande con minimo tre coppie; e non deve contenere nessuna delle dieci espressioni di marketing che abbiamo messo nella lista nera. Il secondo livello è un modello che cerca altro: nome del cliente senza prova di consenso, statistiche inventate, affermazioni errate su ciò che possiamo fare noi e premi che non abbiamo — l’elenco di quelli reali è scritto nella verifica, e qualsiasi altra cosa viene segnalata.

Esiste approvazione umana in catena, e lo diciamo come argomento, non come scusa. Gli articoli che non superano le verifiche rigide vengono scartati, non pubblicati. Quelli che superano le verifiche rigide, ma ricevono segnalazioni dalla seconda verifica, vengono conservati marcati, così che una persona possa controllarli. E se la verifica non può eseguire — per esempio perché il servizio dei modelli non risponde — l’articolo viene trattato come respinto. Fail-closed, non fail-open. È successo anche questo nell’unica esecuzione completa nei log, ed è per questo che non è stato pubblicato nulla.

Cosa comprende

Il lavoro, per componenti

Raccogli gli argomenti da fonti aperte, in parallelo, senza bloccarsi se una tace

Otto raccoglitori partono insieme: Hacker News, Reddit, Product Hunt, GitHub trending su tre tagli, un insieme di quattordici feed RSS e Indie Hackers. Ognuno ha la propria gestione degli errori, quindi una fonte inattiva restituisce un elenco vuoto e non ferma l’esecuzione. I risultati vengono unificati, i duplicati vengono eliminati in base all’identificatore, poi si applica un limite di otto argomenti per fonte, ordinati in base alla velocità di circolazione — così una fonte rumorosa non inonda la fase successiva.

Annota e scarta, prima di spendere in scrittura

Ogni argomento riceve un punteggio da 0 a 100 per quanto è adatto a ciò che facciamo, più l’angolo proposto, il settore target e il servizio target. Tutto ciò che è sotto 50 viene scartato. La fase gira su un modello economico, con quattro thread in parallelo, proprio perché è la fase che decide su cosa si spenderà dopo. Dalla scelta finale si ricava un altro livello: il primo passaggio prende un argomento per settore, così da non avere dieci variazioni sullo stesso filone.

Scrivi l’articolo con una struttura imposta, non libera

Il generatore riceve una struttura rigorosa: 1.500–2.200 parole in romeno, intestazione YAML con titolo di massimo 60 caratteri e descrizione di 155, un H1 e da quattro a sei H2, tra tre e cinque collegamenti interni scelti da un elenco di indirizzi che esiste sul sito, una citazione evidenziata, una sezione di domande compatibile con lo schema FAQPage e un invito finale. Gira con tre thread in parallelo, con budget di cinque minuti per articolo e limite di 5.000 token in uscita.

Traduce in diciannove lingue, con un glossario che non si traduce

La sorgente è il romeno; le lingue di destinazione sono diciannove, dall'inglese, russo e ucraino fino ad arabo, ebraico, hindi, giapponese e cinese semplificato — incluse due scritture da destra a sinistra. Le regole sono esplicite nel prompt: l'intestazione mantiene la propria struttura, gli indirizzi dei collegamenti interni non si riscrivono e non si localizzano, numeri, unità e date si conservano, e i termini di marca del glossario restano intatti. La traduzione procede con solo due thread in parallelo, deliberatamente — il gate dei modelli limita la portata sotto carico maggiore.

La porta rigida: cinque condizioni e dieci espressioni vietate

In locale, senza alcuna chiamata a pagamento: l’intestazione deve esistere e avere titolo, descrizione e parole chiave; il testo deve superare 1.200 parole, conteggiate dopo la rimozione dei blocchi di codice e dei tag; minimo tre sottotitoli di livello due; minimo tre collegamenti interni verso sezioni che esistono sul sito; una sezione di domande con almeno tre coppie. Più la lista nera: „game-changing”, „cutting-edge”, „world-class”, „revolutionize”, „synergy” e altre cinque. Una sola occorrenza boccia l’articolo.

La seconda porta cerca esattamente ciò che un contatore non può vedere

Un secondo modello, con temperatura bassa e risposta in JSON, riceve l’articolo e cerca cinque cose: nome del cliente senza prova che abbia dato il consenso, statistiche allucinate del tipo di una disponibilità percentuale senza misurazione, affermazioni imprecise su ciò che possiamo fare noi, linguaggio da brochure e affermazioni su strumenti di terze parti che farebbero pensare che li possediamo, quando noi li integriamo soltanto. Ha anche l’elenco dei premi che abbiamo davvero — qualsiasi premio fuori elenco viene segnalato.

Quando la verifica non può eseguire, l’articolo viene trattato come respinto

La seconda verifica ha un budget di 90 secondi, esplicitamente per non bloccare l’esecuzione. Se scade o se il servizio dei modelli non risponde, l’errore viene intercettato e trasformato in un verdetto negativo, non ignorato. La conseguenza è importante ed è quella che ci piace di più: un articolo non arriva alla pubblicazione perché il guardiano è mancato. È già successo, nell’unica esecuzione completa nei log — due articoli scritti integralmente non sono stati pubblicati perché la verifica non ha potuto essere eseguita.

La pubblicazione ha una sola condizione e tre passi

La pubblicazione non viene nemmeno richiamata se zero articoli hanno superato il gate. Quando viene richiamata: aggiunge solo la directory dei contenuti, si interrompe se non ha nulla da commettere, esegue un commit con la data, il numero di articoli e il numero di lingue, e prova il push. Se il push fallisce, il commit resta locale e l’esecuzione continua — il lavoro non si perde e non si afferma che sia stato pubblicato. La notifica ai motori di ricerca viene fatta solo se il push è riuscito.

Ogni esecuzione lascia il proprio rendiconto

Alla fine viene scritto un rapporto per giorno: quanti argomenti sono stati raccolti, quanti hanno superato la nota, quanti sono stati selezionati, quanti sono stati scritti, quante traduzioni sono risultate, quanti hanno superato il gate, cosa è stato commesso e cosa è stato pushato, cosa hanno risposto i motori di ricerca, quanto è durato, e il costo suddiviso per modello, con il numero di chiamate e i token di input e output. Il rapporto è un file, non un pannello — si può leggere, archiviare e confrontare.

Come si presenta

Il percorso, passo dopo passo.

01

Stabiliamo che cosa può scrivere e che cosa no

Prima di qualsiasi codice: l’elenco degli argomenti che copriamo, l’elenco di quelli che non tocchiamo, il tono, e la lista nera delle espressioni. Qui si scrive anche l’elenco delle affermazioni che il motore non ha il diritto di fare su di voi — clienti, cifre, premi, confronti. Forniamo: le regole scritte, nella forma in cui entrano direttamente nella verifica, non come documento separato che viene dimenticato.

02

Avviamo solo la raccolta e la valutazione, senza scrivere nulla

Si esegue in modalità a secco: si raccolgono gli argomenti, si valutano, si scelgono i primi, si scrive il report e si esce prima della generazione. È economico — in un'esecuzione di questo tipo dai nostri log ci sono state 24 chiamate, tutte sul modello piccolo, con un costo misurato di circa un centesimo in totale. Si vede esattamente cosa avrebbe scelto il motore, giorno dopo giorno, senza che esista alcun testo. Consegniamo: i report di esecuzione a secco e l'accordo su ciò che sceglie.

03

Scriviamo e verifichiamo, ma non pubblichiamo

Si avviano la generazione e il gate, con la pubblicazione disattivata. Qui si calibrano le soglie: se tutti gli articoli falliscono per lunghezza, è un altro parametro da regolare rispetto a quando falliscono per i collegamenti interni. Qui si vede anche che cosa segnala la seconda verifica, che è la parte più istruttiva. Forniamo: gli articoli generati, i verdetti completi con il motivo di ogni rifiuto, e le soglie regolate.

04

Apriamo la pubblicazione, con il gate in loco

Si avvia il cronometro di sistema e la pubblicazione. L’ora viene scelta fuori dal picco, con un ritardo casuale in modo che le esecuzioni non si sovrappongano; da noi, 00:30 UTC con fino a 30 minuti di ritardo, e con ripristino se il server è stato spento in quell’ora. Si imposta il limite di tempo per esecuzione. Forniamo: l’unità di servizio e il cronometro, i log, e la procedura di arresto.

05

Aggiungiamo le lingue, una per una

La traduzione è la fase con il consumo più alto e la più facile da perdere di controllo. Le lingue vengono aggiunte su corsie di priorità, non tutte insieme, e si verifica che cosa esce in ciascuna — soprattutto negli scritti non latini, dove la regola è che i termini di marca restino nell’alfabeto latino. Forniamo: il glossario, le lingue attivate, e il costo misurato per lingua dal log di esecuzione.

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

I dati

Cosa tocchiamo, dove risiedono e quanto rimangono

Le domande che pone chiunque abbia un responsabile della protezione dei dati — poste qui prima che le ponga lui.

Cosa entra
Titoli, indirizzi e brevi frammenti da fonti pubbliche — API aperte e feed RSS. Non si raccolgono dati personali, non si leggono account privati e non si entra dopo autenticazione. Ogni argomento conserva la fonte, il canale e il momento della scoperta, così si può seguire da dove è partito un articolo.
Dove stanno i testi
Come file MDX nel repository di codice del sito, sotto `content/daily/{limba}/{data}/{slug}.mdx`. Non in un database separato. La conseguenza è che la cronologia completa è la cronologia git: si vede chi ha scritto cosa, quando, e si può tornare indietro con un comando. Ogni articolo ha il proprio header, dal quale la pagina pubblica compone i dati strutturati.
Dove si trovano le chiavi
In un file di ambiente letto dall'unità systemd all'avvio, fuori dal repository di codice. Il caricatore dell'ambiente non sovrascrive una variabile già definita nel processo, quindi la configurazione di esecuzione può essere sostituita senza toccare il file. Le chiamate ai modelli passano attraverso il nostro gate interno, indirizzato localmente sul server.
I log e per quanto tempo vengono conservati
Un file JSON al giorno nella directory dei log del motore, più l'output standard e quello di errore scritti separatamente in `/var/log`, tramite l'unità systemd. Il log giornaliero contiene i verdetti del gate per articolo, con il motivo esatto del rifiuto e il numero di parole contate. Non contiene il testo degli articoli — quelli sono nel repository.
Cosa non tocca
Non tocca i vostri account dei social network, non invia email, non scrive nel CRM. La pubblicazione significa un commit nel repository del sito e una notifica a due motori di ricerca. Se volete la pubblicazione su altri canali, si discute separatamente, con la stessa regola: gate prima, non dopo.

Un caso

La notte in cui il motore ha scritto tre articoli e non ne ha pubblicato nessuno

La situazione

Una esecuzione completa, con tutte le fasi avviate: raccolta da fonti aperte, valutazione, selezione, scrittura in romeno, traduzione, gate, pubblicazione. L'obiettivo era volutamente piccolo, tre articoli, per vedere l'intera catena senza costare troppo.

Cosa abbiamo costruito

La raccolta ha portato 24 argomenti unici dopo l'eliminazione dei duplicati e il tetto per sorgente. La valutazione ne ha mantenuti 18 e ne ha scartati 6 sotto la soglia di 50. La regola di diversità ne ha scelti 3, da settori diversi. Il generatore ha scritto 3 articoli in romeno. Il traduttore ha prodotto 57 file. Poi è entrato il gate.

Cosa è emerso

Nessun articolo è passato. Due sono stati bocciati perché la seconda verifica non si è potuta fare affatto — il servizio di modelli non ha risposto nel budget di 90 secondi, e l'errore è stato trattato come verdetto negativo, non ignorato. Il terzo è stato bocciato per una sola condizione: gli mancava il campo delle parole chiave nell'intestazione, anche se aveva 2.478 parole, cioè il doppio della soglia minima. Poiché nessun articolo è passato, la pubblicazione non è stata nemmeno chiamata: il commit è rimasto vuoto, il push non è stato fatto, i motori di ricerca hanno ricevuto zero indirizzi. Le 57 traduzioni sono rimaste su disco, inutilizzate.

Cosa non dice il caso

L'esecuzione è stata sulla workstation, non sul server — si vede dai percorsi nel log — ed è durata due ore e mezza, oltre il limite di 60 minuti impostato nell'unità systemd. Quindi dimostra due cose allo stesso tempo: che il gate regge, e che il lotto giornaliero è troppo grande per il limite di tempo configurato. Entrambe sono reali ed entrambe meritano di essere dette.

Domande

Cosa ci chiedono le persone prima di chiamare

Si pubblica senza che una persona veda il testo?

Sì, se scegliete così — e no, se non lo scegliete. Il motore può funzionare in modo completamente automatico, e in questa modalità l'articolo che supera entrambi gli strati del gate diventa pubblico senza che qualcuno lo abbia letto. Ma il gate non è decorativo: boccia l'articolo per l'assenza di un campo dell'intestazione, per 1.199 parole invece di 1.200, o per una sola espressione della lista nera. E se preferite che ogni articolo passi attraverso un paio di occhi, la pubblicazione automatica si ferma e tutto resta fino alla fase di verifica, con le segnalazioni in vista. La nostra raccomandazione all'inizio è la seconda variante, finché le segnalazioni diventano noiose.

Cosa succede quando il modello sbaglia un fatto?

Dipende da che tipo di fatto, ed è giusto dire onestamente che non tutti vengono intercettati. Vengono intercettati: il nome del cliente inserito senza prova di consenso, la statistica inventata del tipo di una percentuale di disponibilità senza misurazione, l'affermazione che lascerebbe intendere che possediamo uno strumento che integriamo soltanto, il premio che non è nell'elenco di quelli reali. Non vengono intercettati: una data calendariale sbagliata in una notizia esterna, o un'affermazione tecnica su un prodotto terzo che suona plausibile. Per quelli non c'è altro guardiano che un essere umano, e per questo ogni articolo mantiene nell'intestazione le fonti da cui è partito — la verifica resta possibile dopo la pubblicazione, e la correzione è un commit.

Come si interrompe il flusso?

Tre modi, in ordine di velocità. Arresto del cronometro di sistema — domani non parte più nulla. Svuotamento della variabile che contiene la chiave di pubblicazione — il motore scrive e verifica, ma la notifica ai motori di ricerca viene saltata con un avvertimento nel log. E l'esecuzione in modalità dry-run, che si ferma dopo la selezione degli argomenti e non genera nulla. Inoltre, una singola esecuzione ha un limite di tempo nell'unità di servizio, con segnale lieve prima e arresto forzato dopo.

Il motore è in esecuzione adesso, sul server?

Non possiamo confermarlo dall’esterno e non lo affermeremo. Ciò che possiamo mostrare è il codice, l’unità di servizio, il timer, la procedura di installazione e i log delle esecuzioni che abbiamo. L’unica esecuzione completa nei log è stata su una workstation, non su un server — si vede dai percorsi dei file — ed è durata due ore e mezza, cioè oltre il limite di 60 minuti nell’unità systemd. Se vi interessa lo stato odierno della nostra installazione, chiedete e verifichiamo insieme. Preferiamo questa domanda a un “sì” che si rivela falso.

Quanti articoli ha pubblicato finora?

Dai log che abbiamo: zero. L'esecuzione completa ha raccolto 24 argomenti, ne ha mantenuti 18 dopo la valutazione, ne ha scelti 3, ha scritto 3 articoli e 57 traduzioni — e il gate li ha fermati tutti e tre. Due perché la seconda verifica non ha potuto essere eseguita affatto, uno per un campo mancante nell'intestazione, anche se aveva 2.478 parole, quindi aveva superato di molto la soglia di lunghezza. La pubblicazione non è stata chiamata, i motori di ricerca non hanno ricevuto alcun indirizzo. Potremmo non dirvelo. Lo diciamo perché è esattamente la dimostrazione di cui il servizio ha bisogno: il gate ferma davvero.

Non è “contenuto AI” che rovina il posizionamento nei risultati di ricerca?

La domanda corretta non è chi lo ha scritto, ma se il testo risponde a qualcosa che qualcuno cerca davvero e se è verificabile. Per questo le soglie nel gate sono fissate su elementi che si correlano con l’utilità, non con lo stile: lunghezza minima, struttura con sottotitoli, collegamenti interni a pagine che esistono, sezione FAQ. Ed è per questo che la blacklist contiene proprio le espressioni che segnalano un testo scritto per riempire spazio. Quello che non vi promettiamo è una posizione specifica nei risultati — quella dipende da una moltitudine di fattori che non dipendono da noi.

Quanto costa un’esecuzione?

Il costo si misura, non si stima: ogni chiamata al modello conteggia i token di input e di output, e il report giornaliero fornisce il totale suddiviso per modello, con il numero di chiamate. Nella prova a vuoto nei nostri log: 24 chiamate sul modello economico. Nell’esecuzione completa con tre articoli e 57 traduzioni: 32 chiamate, di cui 3 sul modello costoso — che hanno rappresentato la parte maggiore del costo. Il modello usato in ciascuna fase è una variabile d’ambiente, quindi è possibile abbassare di una fase a un modello più economico senza toccare il codice. La cifra in denaro dipende dai modelli scelti e dalle loro tariffe al momento dell’esecuzione.

In quali lingue scrive e cosa succede ai termini di marca?

La fonte è il romeno, le destinazioni sono diciannove — inglese, russo, ucraino, polacco, tedesco, italiano, francese, spagnolo, olandese, arabo, turco, ebraico, hindi, giapponese, coreano, indonesiano, cinese semplificato, portoghese brasiliano e ceco. Ogni lingua ha scritto nella configurazione il motivo per cui è presente. I termini di marca e quelli tecnici stanno in un glossario e restano non tradotti, anche in arabo, ebraico e nelle scritture asiatiche, dove la regola è esplicita: si mantengono in alfabeto latino. Gli indirizzi dei collegamenti interni non si localizzano mai.

Cosa non è pronto tra ciò che mi avete descritto?

Tre cose, dette ora per non farvele scoprire da soli. La documentazione interna ha preceduto il codice in alcuni punti — il commento in cima alla fase di valutazione menziona un modello che non è più quello chiamato, e il registro delle fonti descrive un insieme di feed RSS più grande di quello nell’elenco. La seconda: due delle fonti iscritte nel registro sono marcate come attive, ma il loro raccoglitore non viene chiamato nella funzione che raccoglie tutto, quindi oggi non contribuiscono a nulla. La terza: l’esecuzione completa nei log ha superato il limite di tempo nell’unità di servizio, il che significa che sul server, con le impostazioni attuali, sarebbe stata interrotta a metà — il limite deve essere aumentato oppure il lotto giornaliero ridotto prima dell’avvio automatico.

Su cosa si basano le affermazioni sopra (26 fonti)

26 di esse sono codice e file dei nostri repository. Non ne pubblichiamo il nome né la riga: insieme, in un'unica pagina, descriverebbero con troppa precisione come sono costruiti sistemi che non sono solo nostri. Le esaminiamo con te, nel repository, su richiesta — la verifica resta possibile, solo che avviene in una discussione.

Cosa vorresti che funzionasse meglio?

Raccontaci il tuo processo. Insieme stabiliamo cosa vale la pena costruire, cosa possiamo collegare e come verifichiamo il risultato.

Parliamone