Repository navigation
fix(ci,#17771): desserrer no_pr_match — résolution par tête distante + content_on_main - #17809
Conversation
- predicat 1 : resolution PR echouee par nom local -> nouvel essai par la branche distante portant exactement HEAD (upstream explicite puis scan de tips origin/*, main exclu) ; couvre checkout pr-123 et renommage local - predicat 2 : branche sans PR rattachable dont HEAD est ancetre de origin/main -> REMOVE motive content_on_main ; les gardes amont garantissent deja 0 commit non pousse et source propre - champ additif WorktreeStatus.content_on_main + motif dans render_text - 11 tests nouveaux dont les 2 controles negatifs exiges (PR OPEN via tete distante ; edition .py primant sur content_on_main) et le garde HEAD-detache inegligible See #17771 See #14195 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
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 |
Path-collision (organ #13359/#13615)Cette PR #17809 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
Diagnostic du rouge Scripts Tests (hérité de main, hors périmètre de cette PR). |
|
[ADJOINT PREFLIGHT] 2 fichiers (scripts/ci/prune_merged_worktrees.py + son test), +302/-5 : perimetre conforme au titre (desserrage de no_pr_match par tete distante + content_on_main). PR gate latest-wins success @15:04:22Z. Le commentaire non evalue est le diagnostic base-inherited du |
Grain: DEEP/ci-python — lane myia-po-2026:CoursIA — prev: DEEP/notebook-python #16897
prédicats 1 + 2 : desserrer
no_pr_matchsans desserrer les gardesdiagnose_worktreetermine aujourd'hui enno_pr_match(REFUSE conservatrice) dès que la résolution par le nom de branche locale échoue — même quand le travail est trivialement rattachable : checkoutpr-123(le nom local n'est pas la tête de PR), ou branche dont le contenu est déjà intégré à main sans PR rattachable. Deux prédicats ordonnés, insérés après tous les gardes existants (saleté source, untracked non toléré, submodules, commits non poussés, branche protégée) :Prédicat 1 — résolution par la tête distante qui porte HEAD
Quand
lookup_pr_for_branch(<nom local>)rendNone, nouvel essai parremote_head_for_head(wt_path, branch, head_sha):<branche>@{u}(hors*/main, cf le faux-positif massif documenté dansget_worktree_info) → nom court ;for-each-ref refs/remotes/origin: une brancheorigin/*dont le TIP est exactementhead_sha(origin/main/origin/HEADexclus).La PR retrouvée suit alors le verdict standard : OPEN →
REFUSE pr_open(le garde n'est pas affaibli), MERGED/CLOSED →REMOVE.Prédicat 2 —
content_on_mainToujours sans PR rattachable, si
git merge-base --is-ancestor HEAD origin/main: chaque commit du worktree est déjà sur main →REMOVEavec motif dédié (WorktreeStatus.content_on_main, champ additif, motif aussi rendu dansrender_text). Les deux autres conditions de l'issue sont structurellement garanties par les gardes amont — un commit non poussé serait sorti enunpushed_commits, une édition source enuncommitted_source_changes/untolerated_untracked. Borne au cas branche : un HEAD détaché garde son verdict dédié (detached_no_match/detached_on_main).Tests (113 passés + 11 nouveaux, 1 skipped inchangé)
test_remote_head_merged_removes["pr-17771", "fix/renamed"](chute du nom local vers la tête distante)test_remote_head_pr_open_refusesREFUSE pr_opentest_no_remote_head_keeps_conservative_refuseno_pr_matchinchangétest_ancestor_clean_removes_with_motifcontent_on_main=True+refusal_reason=Nonetest_not_ancestor_still_refusestest_py_edit_primes_over_content_on_main.pynon suivie →REFUSE uncommitted_source_changes, et l'appel gh lèveAssertionError(jamais atteint)test_detached_head_not_eligiblehead_is_ancestor_of_mainne doit même pas être appeléTestRemoteHeadForHead(4 tests)origin/mainesquivé, scan excluantorigin/main/origin/HEAD, tip divergent → NoneSuite complète :
python -m pytest scripts/tests/test_prune_merged_worktrees.py→ 113 passed, 1 skipped (326 s).install_prune_task.pynon modifié (seuls l'organe et ses tests changent).Mesure avant/après (cette machine, 2026-09-25, dry-run
--json)Même flotte de worktrees, deux passes consécutives — BEFORE depuis un worktree détaché à
origin/main(9a2dd8aa4f), AFTER depuis la branche de cette PR (130e1f81cf).no_pr_matchdetached_no_matchDécomposition du −9 (verdict par verdict, diff des JSON) :
CoursIA-17288(pr=fix(iit,#17183): serie ICT -- 5 conclusions cessaient de promettre des notebooks deja ecrits #17288),CoursIA-17746(pr=fix(ci,#17744): marqueur body 'enrich-quality: reecriture assumee' pour les reecritures annoncees #17746),CoursIA-t17327(pr=fix(rl,#17251): rl_11 POMDP - Tiger Problem canonique (reset sans observation gratuite, F1-F4) #17327),CoursIA-t17341(pr=fix(gametheory,#17107): GT-03d — le plan de deformation calcule pour de vrai (eq.7 exacte + hysteresis reelle) #17341),CoursIA-t17349(pr=fix(sudoku,#17239): Sudoku-14-BDD-Python — 3 findings Hermes (docstring MDD fantôme, énoncé BDD-vs-MDD inexecutable, numérotation) #17349) ;content_on_main:CoursIA-17336,CoursIA/.claude/worktrees/agent-a35c686484ceed65e,agent-ac26c04f8c36f982f(HEAD ancêtres de main, arbres propres) ;CoursIA-17771-prune(la branche de cette PR,SKIP_CURRENTdans la passe AFTER car elle en est le CWD —no_pr_matchdepuis tout autre CWD).Les 5
no_pr_matchrestants sont des REFUSE correctes :pr-16897(PR #16897 ouverte, en attente de merge — la tête distante a bougé depuis le checkout),pr-17639,fix/16361-renumbers,tmp-16386,fix/16861-prose-outputs(têtes divergentes de tout ref distant — rien à rapprocher sans inventer).Conformité
install_prune_task.pyintact (critère d'acceptation) ;pr_openREFUSE, MERGED/CLOSED REMOVE) ou un REMOVE motivé par ascendance ;content_on_main(compat JSON amont, même patron quedead_registration[infra] Rien ne retire un worktree quand sa PR merge — 265 en 36 h sur po-2026, 103 sur ai-01, #8924 refermee sans organe #14195).See #17771
See #14195
🤖 Generated with Claude Code