Skip to main content
Jonathan Andrei
Retour aux billets
Mai 20268 min de lecture

Donner une mémoire à une équipe de modération

La modqueue de Reddit traite chaque modérateur comme un agent isolé qui vide une boîte de réception. Le plus dur dans la modération, ce n'est pas le volume : c'est l'isolement du cas limite, l'incohérence qui s'installe dans une équipe, et le jugement qui s'en va quand un vétéran part. Memex est la mémoire qui manquait.

DevvitRedditModerationTypeScriptRedis

La modqueue de Reddit traite chaque modérateur comme un agent isolé qui vide une boîte de réception. Mais le plus dur dans la modération, ce n'est pas le volume. C'est l'isolement de la décision limite (ce « est-ce que ça dépasse les bornes ? » qu'on tranche seul à 2 h du matin), l'incohérence qui s'installe au sein d'une équipe distribuée, et le savoir institutionnel qui s'en va quand un modérateur vétéran part.

L'étude CHI 2026 sur l'usage réel de la modqueue a chiffré le problème : 84 % des modérateurs quittent la file pour aller chercher du contexte, et les équipes se télescopent sans cesse en rejugeant les mêmes cas. J'ai donc construit ce qui manquait. Pas une boîte de réception plus rapide : une mémoire pour l'équipe.

La plupart des outils rendent un modérateur plus rapide à vider une file. Memex fait décider l'équipe de façon cohérente dans le temps, et empêche ce savoir de s'évaporer.

Ça s'installe comme une seule application Devvit. Rien à configurer pour démarrer : choisissez une taille de quorum si vous voulez, et Memex commence à enregistrer chaque décision d'équipe dans une mémoire partagée dès le premier appel. Aucun service externe, aucun compte, aucun coût.

La page de l'application memex-mod sur developers.reddit.com
La fiche memex-mod sur la plateforme de développement de Reddit. Une installation, et l'équipe a une mémoire.

Decision DNA : comment a-t-on tranché là-dessus avant ?

Sur n'importe quel billet ou commentaire, un clic montre comment l'équipe a historiquement tranché sur du contenu similaire : le verdict dominant, un score de cohérence et les décisions passées les plus proches avec les raisons invoquées. Dans une salle de décision, ça s'affiche en bannière en direct : « L'équipe : RETIRER, 80 % de cohérence, 5 décisions similaires au dossier. » En cas d'égalité, l'état « Décision partagée » apparaît.

Une salle Conclave montrant la Decision DNA et les votes déjà émis
La Decision DNA dans une salle en direct : le schéma de l'équipe sur du contenu similaire, à côté des votes déjà émis.

Le détail astucieux, c'est qu'une faible cohérence est elle-même un signal. Un partage 50/50 n'est pas du bruit : c'est le système qui vous dit que le cas est réellement limite et mérite une décision d'équipe plutôt qu'un appel solitaire. Tout le moteur est local : similarité par trigrammes et Jaccard sur tokens, traitée par lots contre un Redis isolé par subreddit via mGet. Ça fonctionne sur tous les types de billets, y compris les liens, où le domaine est intégré pour reconnaître les domaines de spam et d'affiliation récurrents. Aucune API externe, aucune clé, aucun coût par commentaire, aucun entraînement de modèle sur les données Reddit. Ça tourne dès l'installation, sur un sub de 200 membres comme sur un sub de plusieurs millions, dans n'importe quelle langue.

Conclave : les cas limites deviennent des votes d'équipe

Les cas limites deviennent des salles de décision asynchrones réservées aux modérateurs. Les modérateurs votent Retirer, Garder, Avertir ou Escalader ; au quorum, l'action de consensus s'exécute automatiquement pour les actions réversibles. Les votes, la jauge de quorum et un indicateur de présence « qui révise » se mettent à jour en direct pour tout le monde dans la salle. Comme c'est asynchrone, un billet limite obtient une décision d'équipe équitable sans que tout le monde soit en ligne en même temps, ce qui est exactement la réalité d'une équipe de 5 modérateurs répartis sur plusieurs fuseaux horaires.

Une salle de décision Conclave de Memex montrant un billet de spam crypto acheminé pour un vote d'équipe
Une salle Conclave : un billet de spam crypto acheminé sur le mot-clé « crypto », avec la Decision DNA et le vote Retirer / Garder / Avertir / Escalader.

La sécurité est un réglage, pas un espoir

Les bannissements ne s'exécutent jamais seuls. Ils apparaissent comme une recommandation exigeant un clic humain, conformément à la politique admin 2026 de Reddit sur les bots de bannissement. La taille du quorum, la fenêtre de vote et les règles d'acheminement automatique (par mot-clé ou âge de compte) sont toutes des réglages explicites, avec « les bannissements exigent toujours un clic humain » activé par défaut. Chaque chemin destructeur est protégé contre les cibles supprimées ou déjà traitées. L'idée : un outil qui pose des actions de modération sur une communauté doit rendre ses garde-fous visibles et configurables, pas les enterrer dans le code.

Réglages de Memex : taille du quorum, fenêtre de vote, bascule « les bannissements exigent un clic humain » et règles d'acheminement automatique
Chaque garde-fou est un réglage explicite : quorum, fenêtre de vote, la bascule « les bannissements exigent un clic humain » (activée par défaut), et l'acheminement par mot-clé ou âge de compte.

Le Rulebook, la Calibration et le Sweep

Chaque décision résolue alimente trois endroits qui transforment les appels ponctuels en mémoire d'équipe durable.

Le Living Rulebook de Memex montrant les statistiques d'impact, une barre de verdicts et un bouton de balayage de cohérence
Le Living Rulebook : décisions totales, décisions cette semaine, conclaves ouverts, une barre de verdicts proportionnelle, une courbe sur 7 jours, et un balayage de cohérence en un clic. Touchez un verdict pour filtrer, paginez, touchez une décision pour le détail.
  • Living Rulebook : un billet épinglé qui devient une mémoire d'équipe consultable, avec des statistiques d'impact en direct et une barre de verdicts proportionnelle. Ce sont les règles appliquées de l'équipe, pas seulement celles qui sont écrites.
  • Calibration : les nouveaux modérateurs émettent des votes fantômes qui ne comptent pas dans le quorum ; un résumé hebdomadaire montre précisément où ils ont divergé du consensus, pour apprendre les standards de l'équipe en semaines plutôt qu'en mois.
  • Consistency Sweep : une fois par jour (ou à la demande), Memex audite les billets récents encore en ligne et signale ceux similaires à du contenu déjà retiré, en s'appuyant sur les décisions passées de l'équipe. Les éléments signalés sont rapportés dans la modqueue, jamais retirés automatiquement. Ça rattrape ce que l'équipe a manqué.

Pourquoi c'est vraiment différent

L'espace « espace de travail de modération partagé » est encombré. La couche de mémoire institutionnelle, non. Aucune autre application Devvit ne fait remonter comment votre équipe a tranché sur du contenu similaire au moment de décider, ne note la cohérence des décisions, ni ne calibre les nouveaux modérateurs sur le schéma réel de l'équipe. Le vote et les mises à jour en direct sont le mécanisme de livraison ; la mémoire est le fossé défensif. Plus les touches discrètes : des mod-notes Reddit natives sur chaque décision d'équipe, et l'assistance aux appels (quand un utilisateur écrit en modmail, Memex ajoute une note interne avec la Decision DNA pour que l'équipe réponde de façon cohérente).

Comment je l'ai construit

Tout tourne sur Devvit, la plateforme de développement de Reddit, en TypeScript avec l'interface Blocks. Un seul répartiteur de custom-post rend à la fois la salle Conclave et le Living Rulebook. L'état vit dans un Redis isolé par subreddit. Les mises à jour en direct et la présence reposent sur un sondage useInterval léger de 2 secondes adossé à un ensemble trié Redis. 55 tests automatisés font tourner le vrai pipeline de vote, quorum, exécution, précédent, Decision DNA et calibration contre des faux en mémoire des clients Redis et Reddit de Devvit.

Ce qui a cassé (et les pièges Devvit que j'ai trouvés)

  • Le temps réel (useChannel) ne se connecte jamais en playtest et lançait des rejets non gérés fatals qui tuaient silencieusement mon sondage. J'ai retiré le temps réel entièrement et bâti des mises à jour fiables sur useInterval plus Redis.
  • useInterval abandonne silencieusement setState depuis un callback async détaché : le handler doit lui-même être async et attendu. Un piège vicieux et non documenté.
  • Le messageAuthorType du déclencheur ModMail se sérialise en ParticipatingAs_PARTICIPANT_USER, pas le participant_user documenté, alors l'assistance aux appels ignorait chaque vrai message jusqu'à ce que je m'aligne sur la valeur réelle.
  • Une course de duplication de précédents : l'action de modération déclenchait son trigger avant que le conclave soit marqué fermé, enregistrant les décisions en double. Corrigé en persistant l'état avant d'exécuter.

Ce que j'ai appris

Le goulot d'étranglement de la modération, ce n'est pas la vitesse de lecture. C'est la légitimité des décisions et la cohérence de l'équipe. Reformuler le problème de « rendre un modérateur plus rapide » à « donner une mémoire à l'équipe » a produit un outil que les modérateurs veulent vraiment. Chaque chemin destructeur est protégé, la suite de tests est verte, et ça fonctionne sur des subreddits non anglophones, dès l'installation, sans aucun coût externe.

Projet associé

Memex: Institutional Memory for Reddit Mod Teams

Voir le projet