Le constat
.claude/rules/git-workflow.md l.42 affirme :
gh pr update-branch remet le plancher DWELL à zéro (#15859) [...] Rafraîchir sa branche pour récupérer un fix de main repousse donc le merge de 120 min.
C'est faux depuis #16149. scripts/ci/merge_dwell.py mesure le plancher par last_authoritative_committed_at (l.475), qui remonte la chaîne first-parent au-delà des fusions de rafraîchissement de base prouvées content-free, sous trois conditions conjointes :
- deux parents ;
- le second parent est ancêtre de la base ;
- l'arbre du merge est identique à l'auto-merge des parents (
git merge-tree --write-tree) — condition ajoutée par la CR ai-01 du 2026-09-16, précisément parce que « la forme des parents ne prouve pas l'absence de contenu ».
if auto_tree and merge_tree and auto_tree == merge_tree:
current = first # la fusion est sautée : le plancher ne bouge pas
continue
return _committer_date(payload, current)
C'est exactement la forme produite par gh pr update-branch sans conflit.
Pourquoi ça compte
La règle dissuade un geste devenu gratuit, et elle le fait dans le sens coûteux : elle envoie les lanes attendre 120 minutes plutôt que de récupérer un fix de main. J'ai moi-même diffusé cette consigne fausse à quatre lanes ce matin (po-2023, po-2026, po-2027, po-2025:CoursIA-2) avant de lire l'organe ; correction envoyée depuis.
Matrice réelle
| Geste |
Plancher DWELL |
gh pr update-branch sans conflit |
inchangé — fusion prouvée content-free, sautée |
gh pr update-branch avec résolution de conflit |
re-armé — l'arbre diffère de l'auto-merge |
| rebase |
re-armé — fail-closed |
| commit de code ordinaire |
re-armé |
Ce qui reste vrai : sur une PR dont le seul rouge est DWELL, update-branch n'est pas nuisible mais inutile — le balayage horaire pr-gate-stale-sweep.yml lève seul. Et il déclenche une rafale CI complète sur un pool de runners partagé, donc ce n'est pas neutre pour les voisins.
Acceptance
La leçon générale
Une règle du harnais est datée de sa rédaction, pas de sa lecture. Quand une règle interdit un geste et que l'organe qui l'implémente est lisible, lire l'organe coûte trente secondes. C'est [[verify-before-claiming]] appliqué au harnais lui-même : une règle est une claim comme une autre.
Le constat
.claude/rules/git-workflow.mdl.42 affirme :C'est faux depuis #16149.
scripts/ci/merge_dwell.pymesure le plancher parlast_authoritative_committed_at(l.475), qui remonte la chaîne first-parent au-delà des fusions de rafraîchissement de base prouvées content-free, sous trois conditions conjointes :git merge-tree --write-tree) — condition ajoutée par la CR ai-01 du 2026-09-16, précisément parce que « la forme des parents ne prouve pas l'absence de contenu ».C'est exactement la forme produite par
gh pr update-branchsans conflit.Pourquoi ça compte
La règle dissuade un geste devenu gratuit, et elle le fait dans le sens coûteux : elle envoie les lanes attendre 120 minutes plutôt que de récupérer un fix de
main. J'ai moi-même diffusé cette consigne fausse à quatre lanes ce matin (po-2023, po-2026, po-2027, po-2025:CoursIA-2) avant de lire l'organe ; correction envoyée depuis.Matrice réelle
gh pr update-branchsans conflitgh pr update-branchavec résolution de conflitCe qui reste vrai : sur une PR dont le seul rouge est
DWELL,update-branchn'est pas nuisible mais inutile — le balayage horairepr-gate-stale-sweep.ymllève seul. Et il déclenche une rafale CI complète sur un pool de runners partagé, donc ce n'est pas neutre pour les voisins.Acceptance
.claude/rules/git-workflow.mddécrit le prédicat réel, ses trois conditions, et la matrice ci-dessusgit grepconfirme qu'aucune autre surface du dépôt ne porte l'affirmation périmée — vérifié : 0 autre occurrenceLa leçon générale
Une règle du harnais est datée de sa rédaction, pas de sa lecture. Quand une règle interdit un geste et que l'organe qui l'implémente est lisible, lire l'organe coûte trente secondes. C'est [[verify-before-claiming]] appliqué au harnais lui-même : une règle est une claim comme une autre.