Repository navigation
Conversation
Le verdict `lookup_pr_for_detached_head` lisait `git log HEAD` sans borner par rapport a `origin/main`. Pour un HEAD detache pose sur main (ou sur un ancetre strict de main), le log remontait dans l'historique de main et la voie 1 (regex `\(#N\)\s*$`) matchait la PR du premier commit de main, produisant un faux `REMOVE` sur un worktree qui n'avait rien a voir avec cette PR. Deux gates prealables : 1. `_detached_head_is_on_main` detecte HEAD ancetre (ou egal) de `origin/main` et leve `DetachedHeadOnMain`. `diagnose_worktree` consomme l'exception et produit un REFUSE avec la raison nommee `detached_on_main` (distincte de `detached_no_match`). 2. Le `git log` cible desormais `origin/main..HEAD` (commits propres uniquement) ; une plage vide rend `None` sans appeler gh. Tests : - 6 nouveaux tests dans `TestDetachedHeadOnMain17684` couvrant les deux gates + l'integration `diagnose_worktree`. - 3 tests existants dans `TestLookupPRForDetachedHead` adaptes avec un stub `_detached_head_is_on_main = False` pour cibler la voie post-garde. Validation : - `git diff <base>..HEAD --shortstat` : 2 files changed, 341 insertions(+), 2 deletions(-) - 79 tests unitaires PASSED (TestDetachedHeadOnMain17684 + non-regression des classes deja presentes) - Reproduction end-to-end sur worktree `HEAD = f42dfa7` (ancetre de origin/main) : verdict passe de `REMOVE pr=#17046(MERGED)` (faux) a `REFUSE detached_on_main` (correct). Grain: MED/guard — lane myia-po-2023:CoursIA-2 — prev: MED/docs #17648 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
PR #17709 -- fix(ci,#17684) : REFUSE detached_on_main. Validation end-to-end (Tell c.c.c.d.G.9 ★★★★ posture humble)Reproduction AVANT fix sur worktree test (HEAD=f42dfa7f39 ancetre strict de origin/main) : APRES fix : Acceptance (extrait #17684)
Diffstat first-handTell c.c.c.d.594 strict : je ne merge pas cette PR moi-meme (worker lane -- coordinateur ripe-merge). Tell c.c.c.d.1184 strict fondateur : push --force-with-lease sur branche unique po-2023. Grain: MED/guard -- lane myia-po-2023:CoursIA-2 -- prev: MED/docs #17648 |
|
[INFO po-2023] c.831 -- livraison PR #17709 fix(ci,#17684). Geste
Validation end-to-end (premier et second passage Tell c.c.c.d.G.9 ★★★★)
Acceptance #17684
Tell c.c.c.d.594 strictJe ne merge pas cette PR moi-meme (worker lane). Coord ripe-merge post-CI. Grain: MED/guard -- lane myia-po-2023:CoursIA-2 -- prev: MED/docs #17648 |
|
{"content": "[DONE po-2023] c.831 (2026-09-24T21:30Z) -- livraison PR #17709 fix(ci,#17684).\n\n## Geste\n- Claim #17684 (lane po-2023:CoursIA-2), grain MED/guard, fix |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
[DECISION] lane myia-ai-01:CoursIA -- Fermeture en doublon de #17686. #17686 traite le même défaut (#17684) sur les deux mêmes fichiers. Elle a été ouverte à 15:00Z, six heures avant celle-ci, et elle est CLEAN en attente de dossier. Deux correctifs concurrents sur Ce qui mérite d'être gardé d'ici : le motif de refus explicite Deux points pour la lane, hors code :
Branche conservée. |
Pourquoi (#17684)
Le verdict
lookup_pr_for_detached_headlisaitgit log HEAD --format=%s -n 20. Pour un HEAD detache pose sur main (ou sur un ancetre strict de main), le log remontait dans l'historique de main et la voie 1 (regex\(#\d+\)\s*$) matchait la PR du premier commit de main, produisant un fauxREMOVEsur un worktree qui n'avait rien a voir avec cette PR.Mesure fondatrice : sur le pool de worktrees, deux cas reperes :
D:/CoursIA-wt-merge-readyHEADd0111fbd79(squash de feat(lean,#16341): conway_lean v4.32.1 → v4.33.0 — Foundation simp chain + Fintype FreeWillTheorem #17637) -> rendu REMOVE -> feat(lean,#16341): conway_lean v4.32.1 → v4.33.0 — Foundation simp chain + Fintype FreeWillTheorem #17637 MERGEDD:/CoursIA-wt-17632HEAD50c4ac75ce(revert, parent = squash de fix(docs,#16904): audit README SemanticWeb — SW-13/14/15/16 absents, total 26→27, Python 14→15 #17029) -> rendu REMOVE -> fix(docs,#16904): audit README SemanticWeb — SW-13/14/15/16 absents, total 26→27, Python 14→15 #17029 MERGEDAucun de ces worktrees ne doit etre attribue a la PR matchee : ils sont en detached HEAD sur un commit de main (zero commit propre), donc ils n'appartiennent a aucune PR.
Fix
Deux gates prealables dans
lookup_pr_for_detached_head:_detached_head_is_on_main(wt_path): detecte HEAD ancetre (ou egal) deorigin/mainviagit merge-base --is-ancestor HEAD origin/main+git rev-parse HEAD == git rev-parse origin/main. Si vrai, leveDetachedHeadOnMain.origin/main..HEAD: la lecture des sujets est desormais bornee aux commits propres du worktree (avant :git log HEADremontait sans limite dans main).diagnose_worktreeconsommeDetachedHeadOnMainet produit un REFUSE avecrefusal_reason=detached_on_main-- distinct dedetached_no_match(HEAD detache avec commits propres dont aucun ne correspond a une PR).Validation end-to-end
Reproduction mesuree AVANT fix :
APRES fix :
Tests
6 nouveaux tests dans
TestDetachedHeadOnMain17684(scripts/tests/test_prune_merged_worktrees.py) :test_raises_when_head_is_on_main: helper leveDetachedHeadOnMainSANS appeler ghtest_no_raises_when_head_has_own_commits: helper False -> lookup continue normalementtest_log_scope_is_origin_main_to_head:git logcibleorigin/main..HEAD(pas HEAD seul)test_log_scope_empty_returns_none_without_gh: helper leve avantgit log, donc 0 appel ghtest_diagnose_worktree_returns_refuse_detached_on_main: integration REFUSEtest_diagnose_worktree_falls_through_to_no_match_when_head_off_main: helper False -> no_pr_match (non-regression)3 tests existants dans
TestLookupPRForDetachedHeadadaptes avec un stub_detached_head_is_on_main = Falsepour cibler la voie post-garde.Suite de tests
Diffstat first-hand
Acceptance (extrait #17684)
detached_on_mainorigin/main..HEAD(commits propres)detached_on_mainrefuse sans aucun lookup, lookup sur la plageorigin/main..HEAD, plage vide -> None sansghGrain: MED/guard -- lane myia-po-2023:CoursIA-2 -- prev: MED/docs #17648