# Automatic comment moderation: rules, a model and an appeal

Automatic comment moderation is a chain of rules, a model and a human queue: every decision carries a reason and an appeal, or it cannot be contested.

> Page: https://ui.eneawork.it/blog/ai-moderazione-commenti
> Markdown: https://ui.eneawork.it/blog/ai-moderazione-commenti.md

*2026-11-01*

La moderazione automatica dei commenti è una catena di tre filtri: regole deterministiche, un modello per il contesto e una coda umana per i casi dubbi. Ogni decisione va registrata con il motivo, altrimenti non è contestabile.

Il 1 novembre 2026 obscenity sul registry npm è alla versione 0.4.6: 62 file, 152.763 byte, 0 dipendenze, MIT, Node 18 come minimo; bad-words è alla 4.1.5, con 21 file, 39.308 byte e 1 dipendenza. La pagina leads data table, candidata per la coda di revisione, è stata misurata lo stesso giorno: 29.827 byte in 785 ms. L'endpoint /api/stats ha risposto con 102 byte in 139 ms. Il catalogo conta 111.985 componenti, 1.556 blocchi e 12.808 icone da 1.472 librerie.

## Tre livelli

## Le regole, in codice

const RULES = [ { name: 'links', test: (t) => (t.match(/https?:\/\//g) || []).length > 1 }, { name: 'caps', test: (t) => t.length > 40 && t === t.toUpperCase() }, { name: 'repeat', test: (t) => /(.)\1{6,}/.test(t) }, ]; export function screen(text) { const hit = RULES.find((rule) => rule.test(text)); return hit ? { action: 'review', reason: hit.name } : { action: 'allow', reason: 'rules' }; }

La funzione è sincrona e non chiama la rete: gira dentro la richiesta che salva il commento. Se una regola scatta, il commento non viene pubblicato subito ma finisce in revisione; nessuna regola cancella. Il file si prova con node --test moderation.test.js.

## Il modello decide solo il dubbio

Al modello si chiede una cosa sola: «questo commento attacca una persona o un gruppo?». La risposta è un valore con una confidenza, e la soglia si sceglie sui tuoi dati. Sotto la soglia bassa si pubblica, sopra quella alta si nasconde, in mezzo decide una persona.

## Cosa registrare

## L'appello

Chi scrive deve poter chiedere una revisione senza aprire un ticket a parte: un link nella notifica basta. La persona che rivede vede il testo, il motivo e la decisione precedente, e può annullarla. Un sistema senza appello sposta il danno dallo spam all'errore.

## La limitazione

Le regole non leggono il contesto: un elenco di parole colpisce la citazione e l'insulto con lo stesso peso, e l'offuscamento con caratteri sostituiti passa. Il modello aggiunge costo e latenza a ogni commento e va rivalutato quando cambia versione. Nessuno dei due capisce il sarcasmo meglio di una persona.

## Dove continuare

Le regole di sanificazione dell'input sono in sanitizzare l'input, l'obbligo di controllo lato server in validazione lato server, il limite di richieste in rate limit design. Per la coda di revisione servono una tabella con stato o una data table di progetto, dentro componenti tabella e 111.985 componenti.

## FAQ

### Meglio una blocklist o un modello?

Entrambi, in quest'ordine: la blocklist decide i casi ovvi senza costo e senza rete, il modello guarda quelli che restano. Da sola la blocklist sbaglia sulle citazioni; da solo il modello costa su ogni commento e non spiega la decisione.

### Quanto tempo aggiunge la moderazione?

Le regole girano nella stessa richiesta e non aggiungono un salto di rete. Il modello ne aggiunge uno: misura il p95 prima di attivarlo e metti un timeout che, allo scadere, manda il commento in revisione invece di bloccare la pubblicazione.

### Posso cancellare i commenti senza avvisare?

Puoi nasconderli, ma conserva testo, motivo e decisione: senza traccia un ricorso non si ricostruisce. La cancellazione silenziosa sposta il problema dallo spam all'errore non correggibile.

### Come gestisco i falsi positivi?

Con due soglie e un appello: la fascia bassa pubblica, quella alta nasconde, la zona di mezzo va in coda. Ogni falso positivo confermato diventa un caso di test per la regola o per il prompt.

### Che dati conservo?

Il minimo per ricostruire la decisione: testo, autore, data, motivo, versione del modello ed esito. Definisci un periodo di conservazione e cancellalo alla scadenza; conservare tutto per sempre è un rischio, non una precauzione.
