Skip to content

Un essai à blanc qui écrit n'est pas à blanc - #725

Merged
mgth merged 1 commit into
v6from
fix/a-dry-run-that-writes-is-not-dry
Sep 17, 2026
Merged

mgth merged 1 commit into
v6from
fix/a-dry-run-that-writes-is-not-dry

Conversation

@mgth

@mgth mgth commented Sep 16, 2026

Copy link
Copy Markdown
Owner

Trouvé en préparant le lancement du dry-run de #724 sur de vrais écrans — pas par un test, et avant que ça ne coûte quoi que ce soit.

GapGuard::restore supprime son journal quand il réussit. En mode sec je lui passais un exécuteur qui se contentait d'enregistrer la ligne et rendait « réussi » : l'essai à blanc signalait donc un succès et emportait le journal avec lui.

Le journal est le seul enregistrement des écarts de 1 px que l'agent a ouverts autour du moteur. Une prévisualisation qui le jette laisse une topologie écartée que plus rien ne peut remettre en place — ni un restore ultérieur, ni le prochain démarrage.

Le correctif

plan_restore était déjà pur et public ; GapGuard::would_restore l'expose sans l'effet de bord, et le chemin sec passe par là.

Deux chemins, pas un drapeau — et c'est la leçon : restore ne fait pas que courir, donc un exécuteur qui ne court pas ne suffit pas à le rendre inoffensif. Partout ailleurs dans #724 l'échange d'exécuteur suffisait, ce qui rendait cette exception facile à ne pas voir.

Au passage, la forme était fausse aussi : plan_restore rend les arguments d'une invocation de kscreen-doctor, et je les imprimais comme autant de lignes de commande. La liste aurait menti sur ce qui part.

Un test épingle les deux moitiés : demander ce qu'un restore ferait laisse le journal en place, et un vrai restore le consomme.

🤖 Generated with Claude Code

Trouvé en préparant le lancement du dry-run sur les vrais écrans du
mainteneur, pas par un test.

`GapGuard::restore` **supprime son journal** quand il réussit. En mode sec je
lui passais un exécuteur qui se contentait d'enregistrer la ligne et rendait
« réussi » — donc l'essai à blanc signalait un succès et emportait le journal
avec lui. Le journal est le seul enregistrement des écarts que l'agent a
ouverts : une prévisualisation qui le jette laisse une topologie écartée que
plus rien ne peut remettre en place.

`plan_restore` était déjà pur et public ; `GapGuard::would_restore` l'expose
sans l'effet de bord, et le chemin sec passe par là. Deux chemins, pas un
drapeau : c'est précisément parce que `restore` fait autre chose que courir
qu'un exécuteur qui ne court pas ne suffit pas à le rendre inoffensif.

Au passage, la forme était fausse aussi : `plan_restore` rend les arguments
d'**une** invocation, et je les imprimais comme autant de lignes de commande.
La liste aurait menti sur ce qui part.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mgth
mgth merged commit a9fd336 into v6 Sep 17, 2026
3 checks passed
@mgth
mgth deleted the fix/a-dry-run-that-writes-is-not-dry branch September 17, 2026 13:23
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.

1 participant