Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/rules/git-workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ GitHub auto-closes issues on `Refs #N`, `Fixes #N`, `Closes #N`. Use safe syntax
| **Branche manipulée par plusieurs agents de front** | **INTERDIT** | un `[CLAIMED]` d'une autre lane sur l'issue vaut « plusieurs agents » → [lane-claim-protocol.md](lane-claim-protocol.md) |

- **L'alternative merge d'abord, quand elle existe** : `git merge origin/main`, `gh pr update-branch`, cherry-pick, revert, nouveaux commits. Le force-push est le dernier recours, jamais le réflexe de rebase par défaut.
- **`gh pr update-branch` remet le plancher DWELL à zéro** (#15859) : le plancher de merge (120 min, `scripts/ci/merge_dwell.py`) se mesure depuis le **dernier commit** de la branche, et `update-branch` en crée un (merge commit). Rafraîchir sa branche pour récupérer un fix de `main` repousse donc le merge de 120 min — et tout plancher déjà noté dans un rapport est périmé. Ce rouge n'est **pas un défaut de la PR** : le gate le nomme `DWELL -- ... leve au premier balayage suivant <ts>` et le balayage horaire (`pr-gate-stale-sweep.yml`) lève seul. Ne pas re-pusher pour « réparer » : chaque push re-arme le plancher depuis la nouvelle tête.
- **`gh pr update-branch` ne remet PAS le plancher DWELL à zéro quand la fusion est sans conflit** (#16149, durci par la CR du 2026-09-16 ; corrige ce que #15859 avait laissé croire) : le plancher de merge (120 min, `scripts/ci/merge_dwell.py`) se mesure par `last_authoritative_committed_at`, qui remonte la chaîne first-parent **au-delà** des fusions de rafraîchissement de base **prouvées content-free** — trois conditions conjointes : deux parents, le second **ancêtre de la base**, et l'arbre du merge **identique à l'auto-merge** des parents (`git merge-tree --write-tree`). C'est exactement la forme d'un `update-branch` sans conflit. **Rafraîchir une branche propre pour récupérer un fix de `main` est donc gratuit.** Fail-closed partout ailleurs : une résolution manuelle de conflit (arbre ≠ auto-merge), un rebase, ou une preuve d'équivalence indisponible **re-arment** le plancher — c'est du contenu d'auteur, et il se mesure. Un commit de code ordinaire le re-arme évidemment aussi. Ce rouge n'est **pas un défaut de la PR** : le gate le nomme `DWELL -- ... leve au premier balayage suivant <ts>` et le balayage horaire (`pr-gate-stale-sweep.yml`) lève seul — sur une PR dont le **seul** rouge est `DWELL`, `update-branch` n'est pas nuisible, il est **inutile** (et déclenche une rafale CI pour rien sur un pool de runners partagé).
- **`update-branch` tue AUSSI le dossier de prévalidation, et c'est la moitié qu'on oublie** : il change la tête, donc le contrat exact-head (`[ADJOINT PREFLIGHT]`, `surfaces-sha256`, comptes `diff-files`/`additions`) est **périmé à la seconde**, et `check_adjoint_prevalidation.py` rend `head is stale` / `discussion surfaces changed`. La boucle se referme sur elle-même : `main` rouge → la lane doit `update-branch` (bon geste) → **le dossier périt** → l'adjoint ne peut plus attester `checks: latest-wins-green` sans mentir, donc il retient le dossier (à juste titre) → `exit 1` → pas de merge → la PR vieillit → il faut re-`update-branch`. **Correction du 2026-09-20 (#16962)** : cette boucle avait d'abord été décrite avec un second effet — « et le DWELL se ré-arme ». C'est **faux** pour un `update-branch` sans conflit (`last_authoritative_committed_at` saute les fusions prouvées content-free), et l'erreur rendait la boucle plus serrée qu'elle ne l'est. Le seul effet réel est la **péremption du dossier**, et il suffit à produire la boucle. Mesure du 2026-09-19 : **17 candidates sur 17** refusées par le gate pour ce seul motif, aucune pour un défaut de PR.

**L'ordre qui sort de la boucle — le dossier vient APRÈS la stabilisation de la branche, jamais avant :**
Expand Down
Loading