Une piste d'audit qui n'enregistrait rien d'important
The audit loop walked only top-level DTO keys while every real setting lived inside two JSON blobs, both on the audit's exclusion list.
Le filet avait un trou
Le test, le journal d'audit, le scanner, la CI — couvrant moins que je ne le supposais.
Trois bugs dans une seule fonctionnalité, trouvés en basculant une seule préférence de notification via l'interface et en lisant la table.
La liste d'exclusion de l'audit contenait les deux blobs JSON, et la boucle d'audit ne parcourait que les clés de DTO de haut niveau — mais chaque champ de chaque onglet de paramètres vit dans ces deux blobs. Donc elle enregistrait fidèlement la poignée de champs que personne ne change et ignorait tout le reste. En plus de ça, un paramètre de taille de fichier comparait un BigInt de Prisma à un nombre de DTO, JSON.stringify lève une exception sur BigInt, et le catch renvoyait « changed », donc chaque sauvegarde loggait deux lignes fantômes. Et l'endpoint des journaux d'audit ignorait complètement le tenant, ce que j'ai prouvé avec un jeton d'admin d'organisation qui lisait toutes les lignes, y compris celles d'autres organisations et celles à l'échelle de la plateforme.
Une fonctionnalité d'audit qui tourne et écrit des lignes et audite les mauvaises choses est pire qu'aucune, parce qu'elle produit un document auquel les gens vont faire confiance.