Runbooks opérateurContenu

Contenu

La couche de surcharge du CMS, les files de la communauté et le bulletin : ce que fait réellement la dépublication, et la seule file qui ne doit jamais masquer automatiquement.

Les outils de la surface éditoriale et de la communauté.

Le CMS est une couche de surcharge, pas un stockage

/admin/content/cms ne contient pas le contenu. Le MDX vit dans content/**, dans le dépôt ; cette table contient des surcharges : dépublier, archiver, épingler, mettre en avant.

La dépublication retire une entrée de l'index, du sitemap, du flux RSS et de la page elle-même (une entrée retirée répond 404 au lieu de répondre 200 avec une URL canonique). Elle la retire aussi de la recherche de la documentation : le moteur liste les entrées en direct via listContentEntries à chaque appel, précisément pour qu'un retrait prenne effet immédiatement plutôt qu'à l'expiration d'un cache.

Ce qu'elle ne peut pas faire, c'est modifier le texte. Cela passe par un commit.

Les signalements ne masquent jamais rien automatiquement, et c'est voulu

/admin/content/reports contient les signalements déposés par les utilisateurs sur les fils et les messages du forum. Un signalement ne masque rien à lui seul.

L'alternative (masquer automatiquement au bout de N signalements) donne à un groupe organisé le pouvoir de faire taire un membre. La file existe pour qu'un humain décide, et le prix de ce choix, c'est que la file doit réellement être lue.

Bulletin : la capture, puis le jugement

Le cron /api/cron/bulletin-radar remplit la mémoire des signaux toutes les heures à partir de sources primaires. Tout arrive en NEW et rien n'est publiable sans un jugement humain. Le radar est un appareil de capture, pas un éditeur.

Les pages opérateur qui rendaient ce jugement (sous /ops, avec celles du Growth interne) ont été retirées le 2026-10-08 : /ops ne mène plus qu'au Dev Studio (/ops/dev, voir src/app/(dashboard)/ops/README.md).

Support : le desk asynchrone vit ici, le chat non

/admin/content/support, c'est un fil par adresse extérieure : ce que le formulaire de contact a écrit, ce que la personne a répondu par e-mail, ce qu'un opérateur a renvoyé. La ligne est écrite avant qu'un e-mail ne parte, donc une panne de Resend ne perd jamais un message.

Répondre depuis le fil envoie depuis l'adresse du desk, avec support+<thread>@ en Reply-To. La réponse de la personne revient par POST /api/webhooks/resend (email.received) et arrive sur le même fil ; un fil résolu se rouvre à sa réception. La carte Adresse du fil de la page de détail est cette adresse : tout e-mail qui y est transféré est rattaché au fil.

Une chose que la page ne fait pas, volontairement : un fil marqué spam ne peut pas recevoir de réponse tant que son statut ne change pas : le formulaire de réponse le dit au lieu d'envoyer.

La réception exige la variable RESEND_SUPPORT_DOMAIN, avec son MX chez Resend ; sans elle, les réponses partent toujours depuis le domaine racine, mais la réponse d'un client atterrit dans une boîte mail, pas sur le fil.

Feedback → roadmap → changelog

Cette boucle est le journal public du produit. Le feedback est trié ici et promu vers la roadmap ; la roadmap est livrée et devient une entrée du changelog. Seules les entrées de changelog COMPLETED sont publiques.

C'est à cause de cette boucle que le formulaire public de feedback a été retiré : il faisait doublon avec le menu déroulant du tableau de bord tout en contournant ce tri.