generated from srsk7896/pipeline-vibecoding
[Correction] L'export anonymisé perd une partie du diagnostic (période, frise, saturation) #4
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problème
Pour l'export destiné au client (profil « client », FEAT-09), l'outil anonymise d'abord les données : il réduit les horodatages à la date seule et le modèle à « PBX Plug ». Ensuite seulement, il recalcule toute l'analyse. Sans heure, il ne peut plus calculer la période couverte, la frise chronologique, l'occupation des canaux ni les fenêtres de saturation. Sans modèle précis, la capacité du boîtier devient inconnue.
_projet/design.mdprévoit pourtant que, dans l'export anonymisé, « le contenu de diagnostic est conservé ».Comportement observé
Reproduit par un test jetable sur
internal/cdr/testdata/v5_sample.txtetv6_sample.txt:HasPeriod)Series.Timeline.HasData)PeakConcurrency)Sur un boîtier réellement saturé, l'alerte de saturation (
internal/analysis/analyze.go:326) disparaît de l'export client. Le verdict global peut alors passer de « hors seuil » à « conforme ».Comportement attendu
Le diagnostic de l'export anonymisé est identique au diagnostic interne : verdict, alertes, KPI, séries. Seules les données identifiantes affichées sont masquées.
Étapes de reproduction
Hypothèse de cause
internal/web/export_handler.go:45-49:anaData = export.Anonymize(parsed)puisanalysis.Evaluate(anaData, now), soit une analyse après anonymisation.internal/export/export.go:111(reduceModel) et:124-125(dateOnlysurSetupTime/ConnectionTime).internal/analysis/analyze.go:146(parseCallTimeéchoue sur une date seule, doncStartest vide) etinternal/analysis/traffic.go:57-58(les appels sansStartsont ignorés).Proposition / solution
handleExporter, calculerresult := analysis.Evaluate(parsed, now)une seule fois, sur les données en clair.export.Anonymizequ'aux données affichées (View.Analysis), et ajouter une fonction qui anonymise aussi le résultat. Elle doit masquer les libellés horaires des séries :Series.Timeline.Buckets(format"02/01 15:04",internal/analysis/series.go:146) etSeries.Timeline.Concurrency[].T(format"02/01 15:04:05",series.go:246). Par exemple, les remplacer par des repères relatifs (« T0 », « T0 + 10 min ») ou par la date seule, selon le profilclient-2026.08.Resultne transporte un identifiant : numéros dans les exemples d'alerte, registrar, etc.AnonProfileVersion(internal/export/export.go:103).Critères d'acceptation
internal/export: pourv5_sample.txtetv6_sample.txt,Verdict(hors libellés),AlertsetSaturationWindowssont identiques en profil interne et en profil client.hh:mm.Priorité proposée
Haute : le client peut recevoir un rapport plus favorable que la réalité, ce qui fausse la « situation de la panne par rapport à la limite de responsabilité », cœur de
_projet/vision.md.Périmètre estimé
internal/web/export_handler.go,internal/export,internal/analysis/series.go)Questions ouvertes
client-2026.08, ou de sa version suivante.Labels proposés
type:bugpriority:higharea:backend