--- title: Lot J — le volet codable est livré (thèmes, interrupteur, mention) --- Table d'agrégats (instance, mois, thème, compteur) : c'est elle qui tient la promesse du §8.4 des CGU. Sans elle le regroupement vit dans la ligne VisitorQuestion, donc la purge du 90e jour l'emporte avec la question et le client perd tout au 91e. Elle ne porte que des compteurs — aucune donnée personnelle, ce qui est précisément ce qui l'autorise à survivre. ⚠️ Insights lit désormais les thèmes dans cette table, pas dans les questions de la fenêtre. ⚠️ Liste fixe de 8 thèmes, pas de thèmes découverts par l'IA. Des libellés régénérés à chaque passage donneraient « Horaires » en janvier et « Questions d'horaires » en février : deux lignes distinctes, et une courbe qui ne veut rien dire — alors que la table existe pour porter cet historique. Ajouter un thème reste possible, en renommer un coupe l'historique en deux. ⚠️ Le plafond de 500 par passage ne perd rien, il retarde : les plus anciennes d'abord, un passage par jour, et le job tourne à 2 h quand la purge est à 3 h 30. Un avertissement part si le retard dépasse un passage. Les jetons ne sont pas décomptés du quota client — il n'a pas demandé ces appels. Un lot en échec n'est pas marqué « Autre » pour s'en débarrasser : ce serait une perte définitive maquillée en résultat. Interrupteur de collecte avec UI dans l'écran Guide IA — sans elle le client ne pouvait pas exercer le refus dont il est responsable. Mention aux visiteurs accessible depuis l'assistant, là où la collecte a lieu. ⚠️ FR/NL/EN seulement, repli anglais : traduire une mention de protection des données sans relecture serait pire que la servir en anglais. dotnet test 226.