Skip to content

Un fichier produit deux fois doit sortir identique : Map.of ne le promet pas - #50

Merged
Beennnn merged 1 commit into
mainfrom
claude/reprise-sans-binaires-fu4e2h
Sep 4, 2026
Merged

Un fichier produit deux fois doit sortir identique : Map.of ne le promet pas#50
Beennnn merged 1 commit into
mainfrom
claude/reprise-sans-binaires-fu4e2h

Conversation

@Beennnn

@Beennnn Beennnn commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Le défaut

Map.of tire l'ordre d'itération de ses clés d'une graine choisie au démarrage de la JVM. À l'intérieur d'une exécution il ne bouge pas ; d'une exécution à l'autre, si.

L'un d'eux était sérialisé dans faits.jsonl : ses clés sortaient dans un ordre différent à chaque génération, pour un contenu identique. De quoi faire dire à un diff entre deux rapports que tout a changé — et un diff qui dit toujours ça cesse d'être lu, ce qui est justement toute la valeur du format.

Trouvé en vérifiant si une republication de gh-pages avait quelque chose à publier : la page était identique au bit près, et il ne restait que la date… et deux clés qui avaient échangé leur place.

Pourquoi la garde ne le voyait pas

CharacterisationTest vérifie déjà que deux assemblages donnent les mêmes octets — mais dans la même JVM, où cet ordre est précisément stable. La garde était aveugle à la seule chose qui pouvait bouger.

D'où un test sur l'ordre plutôt que sur une égalité, et une note dans la garde existante qui dit ce qu'elle ne couvre pas.

Le correctif

Json.ordered remplace Map.of partout où la carte finit dans un fichier :

  • les renvois de faits.jsonl (page, diagnostic, markdown, manifeste) ;
  • la forme vide des blocs (coverage, calltree, values, trace) ;
  • les deux lignes start et end de progression.jsonl.

Les Map.of restants sont des tables de correspondance dont l'ordre ne sort jamais, ou des réponses HTTP où il n'a aucun sens pour un analyseur JSON.

Vérification

Régénération du même rapport depuis deux JVM distinctes : faits.jsonl identique, la date mise à part. Avant le correctif, les deux clés changeaient de place. 292 tests unitaires (1 nouveau), 72 contrôles de recette locale.

🤖 Generated with Claude Code

https://claude.ai/code/session_01J956wjynbd7fkZx4HpjHzP


Generated by Claude Code

…met pas

Map.of tire l'ordre de ses clés d'une graine choisie au démarrage de la JVM. À
l'intérieur d'une exécution il ne bouge pas ; d'une exécution à l'autre, si. L'un
d'eux était sérialisé dans faits.jsonl, dont les clés sortaient donc dans un ordre
différent à chaque génération, pour un contenu identique — de quoi faire dire à un
diff entre deux rapports que tout a changé, ce qui est la façon dont un diff cesse
d'être lu.

La garde existante ne pouvait pas le voir : elle assemble deux fois dans la MÊME JVM,
où cet ordre est stable. D'où un test sur l'ordre plutôt que sur une égalité, et la
note qui dit à la garde ce qu'elle ne couvre pas.

Json.ordered remplace Map.of partout où la carte finit dans un fichier : les renvois
de faits.jsonl, la forme vide des blocs, et les deux lignes de progression.jsonl.
Vérifié en régénérant depuis deux JVM distinctes : identique, la date mise à part.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J956wjynbd7fkZx4HpjHzP
@Beennnn
Beennnn marked this pull request as ready for review September 4, 2026 08:59
@Beennnn
Beennnn merged commit 04f701b into main Sep 4, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants