Le défaut, tel qu'Hermes l'a mesuré sur #15620
check_slot_reservation.py, source open_prs (pr_claims) : une cible de slot n'est retenue comme réservée par une PR ouverte que si le fichier y porte additions > 0. La raison est mesurée et documentée dans le code — l'API gh n'expose pas changeType sur files[], donc additions est le seul proxy d'écriture disponible sans un second aller-retour.
L'angle mort qui en découle : un rename byte-identique dans une PR ouverte rend additions = 0, deletions = 0. Sa cible ne réserve donc rien auprès des autres PRs — et c'est exactement le cas qu'une tranche de renumérotation produit quand elle fait ses git mv purs en premier commit, avant tout sweep de référents.
Pourquoi c'est marginal, et pourquoi ce n'est pas nul
Marginal : un rename sans sweep de références est presque toujours incomplet, donc la PR porte des édits, donc additions > 0 quelque part. Pas nul : la fenêtre existe entre le commit de git mv et le commit de sweep, et c'est précisément la fenêtre pendant laquelle deux lanes peuvent viser le même slot — la classe de défaut que #15489 défaut 4 existe pour fermer.
Acceptance
Au choix, l'un des deux — le premier suffit et c'est celui qu'Hermes proposait :
- Documenter : une ligne dans le bloc
SOURCES du docstring de check_slot_reservation.py nommant l'angle mort (rename byte-identique → cible non réservée côté open_prs), au même titre que la sortie écrit déjà « source indisponible » en --offline. Le garde ne doit jamais avoir l'air de mesurer ce qu'il ne mesure pas.
- Ou fermer : lire le statut de renommage réel via
gh api repos/{owner}/{repo}/pulls/{n}/files --jq '.[].status' (renamed y est exposé, contrairement au champ files de gh pr view) et traiter renamed comme une écriture de la cible. Coût : un appel API supplémentaire par PR ouverte inspectée — à mesurer avant de le retenir.
Provenance
Review Hermes sur #15620 (clusterManager-Myia, 2026-09-11T17:31:37Z), section « Note mineure (non bloquante, à garder pour la doc) ». La note était explicitement non bloquante ; #15620 a été mergée avec cette issue ouverte et nommée avant le merge, conformément à la troisième voie de levée du §B.0.
Le défaut, tel qu'Hermes l'a mesuré sur #15620
check_slot_reservation.py, sourceopen_prs(pr_claims) : une cible de slot n'est retenue comme réservée par une PR ouverte que si le fichier y porteadditions > 0. La raison est mesurée et documentée dans le code — l'APIghn'expose paschangeTypesurfiles[], doncadditionsest le seul proxy d'écriture disponible sans un second aller-retour.L'angle mort qui en découle : un rename byte-identique dans une PR ouverte rend
additions = 0, deletions = 0. Sa cible ne réserve donc rien auprès des autres PRs — et c'est exactement le cas qu'une tranche de renumérotation produit quand elle fait sesgit mvpurs en premier commit, avant tout sweep de référents.Pourquoi c'est marginal, et pourquoi ce n'est pas nul
Marginal : un rename sans sweep de références est presque toujours incomplet, donc la PR porte des édits, donc
additions > 0quelque part. Pas nul : la fenêtre existe entre le commit degit mvet le commit de sweep, et c'est précisément la fenêtre pendant laquelle deux lanes peuvent viser le même slot — la classe de défaut que #15489 défaut 4 existe pour fermer.Acceptance
Au choix, l'un des deux — le premier suffit et c'est celui qu'Hermes proposait :
SOURCESdu docstring decheck_slot_reservation.pynommant l'angle mort (rename byte-identique → cible non réservée côtéopen_prs), au même titre que la sortie écrit déjà « source indisponible » en--offline. Le garde ne doit jamais avoir l'air de mesurer ce qu'il ne mesure pas.gh api repos/{owner}/{repo}/pulls/{n}/files --jq '.[].status'(renamedy est exposé, contrairement au champfilesdegh pr view) et traiterrenamedcomme une écriture de la cible. Coût : un appel API supplémentaire par PR ouverte inspectée — à mesurer avant de le retenir.Provenance
Review Hermes sur #15620 (
clusterManager-Myia, 2026-09-11T17:31:37Z), section « Note mineure (non bloquante, à garder pour la doc) ». La note était explicitement non bloquante ; #15620 a été mergée avec cette issue ouverte et nommée avant le merge, conformément à la troisième voie de levée du §B.0.