Depuis #14236 (2026-09-02), post_comment de scripts/check_pr_path_collisions.py poste le nom d'un fichier temporaire au lieu du rapport de collision.
Cause
["gh", "api", "--method", "POST", f"repos/{repo}/issues/{number}/comments",
"-f", f"body=@{tmp_path}"]
gh api -f envoie la valeur litteralement. Seul -F dereference un @ en tete. Controle positif, sur une cible inexistante (404, aucun effet de bord) avec GH_DEBUG=api :
-f body=@<path> -> "body": "@C:/.../ctl_body.md"
-F body=@<path> -> "body": "CONTROLE-POSITIF: ceci est le corps attendu.\n..."
Le defaut se compose
Le marqueur du garde vit dans le corps. Le corps etant devenu @/tmp/tmpXXXX.md, find_marker_entry ne retrouve plus son propre commentaire et en repose un neuf a chaque passage. Le garde est donc simultanement muet et accumulateur.
Mesure du 2026-09-03 : 7 PR sur les 40 dernieres touchees, jusqu'a 3 doublons ; #14447 en portait 4.
Pourquoi les tests ne l'ont pas vu
test_post_comment_uses_the_rest_endpoint_not_gh_pr_comment verifie l'endpoint et la forme de l'argv — jamais la charge utile. Il est reste vert tout du long. Un test qui certifie le canal ne certifie pas ce qui y transite.
Le jumeau faisait deja juste
edit_comment (PATCH) ecrit un fichier JSON et passe --input, contournant la semantique du @. La reparation aligne le POST sur son jumeau plutot que d'inventer une troisieme forme. C'est aussi la seule occurrence de body=@ du depot (grep -rn -- '"-f", f"body=@' scripts/).
Acceptance
Depuis #14236 (2026-09-02),
post_commentdescripts/check_pr_path_collisions.pyposte le nom d'un fichier temporaire au lieu du rapport de collision.Cause
gh api -fenvoie la valeur litteralement. Seul-Fdereference un@en tete. Controle positif, sur une cible inexistante (404, aucun effet de bord) avecGH_DEBUG=api:Le defaut se compose
Le marqueur du garde vit dans le corps. Le corps etant devenu
@/tmp/tmpXXXX.md,find_marker_entryne retrouve plus son propre commentaire et en repose un neuf a chaque passage. Le garde est donc simultanement muet et accumulateur.Mesure du 2026-09-03 : 7 PR sur les 40 dernieres touchees, jusqu'a 3 doublons ; #14447 en portait 4.
Pourquoi les tests ne l'ont pas vu
test_post_comment_uses_the_rest_endpoint_not_gh_pr_commentverifie l'endpoint et la forme de l'argv — jamais la charge utile. Il est reste vert tout du long. Un test qui certifie le canal ne certifie pas ce qui y transite.Le jumeau faisait deja juste
edit_comment(PATCH) ecrit un fichier JSON et passe--input, contournant la semantique du@. La reparation aligne le POST sur son jumeau plutot que d'inventer une troisieme forme. C'est aussi la seule occurrence debody=@du depot (grep -rn -- '"-f", f"body=@' scripts/).Acceptance
post_commenttransmet le corps (fichier JSON +--input, commeedit_comment).-f body=@.@/tmp/tmp*.mddeja postes sur les PR ouvertes sont nettoyes ou couverts par une passe nommee.