Skip to content

fix(ci): prune_merged_worktrees attribue a un HEAD detache la PR d'un commit ancetre de main #17684

Description

@myia-ai-01

Constat (mesuré le 2026-09-24 sur ai-01, dry-run)

python scripts/ci/prune_merged_worktrees.py --json classe REMOVE deux worktrees à HEAD détaché qui ne doivent pas l'être :

Worktree HEAD Attribution rendue Réalité
D:/CoursIA-wt-merge-ready d0111fbd79 (commit de main, squash de #17637) REMOVE — #17637 MERGED demeure de la tâche planifiée merge_ready (install_merge_ready_task.py --run --repo D:\CoursIA-wt-merge-ready) ; la retirer casse l'organe
D:/CoursIA-wt-17632 50c4ac75ce (revert, parent = squash de #17029) REMOVE — #17029 MERGED la PR du worktree, #17632, était OPEN au moment de la mesure

Cause

lookup_pr_for_detached_head lit git log HEAD --format=%s -n 20. Dès le premier commit partagé avec main, ces sujets sont ceux de main, et la voie 1 (résolution par (#N) final) rend la PR d'un commit ancêtre. Un HEAD détaché posé sur main reçoit ainsi la PR de son propre commit de tête, et une branche détachée à un commit propre reçoit la PR du commit qu'elle a sous elle.

Aucun dégât pour l'instant : la tâche planifiée CoursIA\prune_merged_worktrees échoue à chaque déclenchement (0x80070002, guillemets de /TR). Elle ne doit pas être réparée avant ce correctif, sinon la première passe --apply retire la demeure de merge_ready.

Correctif attendu

  1. Un HEAD détaché ancêtre de origin/main n'a aucun commit propre, donc aucune PR attribuable : REFUSE avec la raison nommée detached_on_main.
  2. La voie de lookup ne lit que les commits propres (origin/main..HEAD). Si la plage est vide ou si la référence est absente, le résultat est None, donc REFUSE (fail-closed).

Acceptance

  • Tests : detached_on_main refusé sans aucun lookup, lookup appelé sur la plage origin/main..HEAD, plage vide → None sans appel gh.
  • Dry-run relancé sur ai-01 après le correctif : les deux worktrees ci-dessus sortent de REMOVE.

Grain: CI prune-worktrees -- lane myia-ai-01:CoursIA

Activity

  1. myia-ai-01 commented on Sep 24, 2026

    @myia-ai-01
    CollaboratorAuthor

    Second cas mesuré le 2026-09-24, même classe : un worktree qui sert de demeure à un service est retiré parce que sa PR est mergée.

    • D:/CoursIA-wt-runner-cgroup (branche de fix(ci,#17299): --cgroup-parent = nom de slice sous le pilote systemd (10/10 slots ai-01 en rc=125) #17559, mergée le 23/09 à 18:49Z) était le COURSIA_REPO_DIR de coursia-runner.service sur ai-01, par un drop-in systemd temporaire (40-repo-dir.conf). Le worktree a disparu dans la nuit du 23 au 24/09. Le superviseur déjà chargé a tenu jusqu'au redémarrage de la distro WSL (05:55Z). Au redémarrage suivant, supervise.sh: No such file or directory, cinq échecs, puis StartLimit.
    • Coût : aucun slot CI ai-01 de ~06:00Z à 17:48Z. Il restait les 8 slots po-2024 pour 359 runs en file. C'est l'origine des PR gate: STARVED de l'après-midi.
    • Restauration à 17:48Z : drop-in retiré (le service repart du checkout main) et épingle waiters recopiée à l'identique de celle des runners, sans rebuild. Dry-run et geste postés sur le dashboard workspace-CoursIA.

    Pour ce correctif : le critère « PR MERGED -> REMOVE » est juste pour ce worktree. Ce qui manquait, c'est une retenue que le pruner sache lire. Le correctif de la voie 1 (HEAD détaché ancêtre de main -> REFUSE) ne couvre pas ce cas, car la branche était nommée. Deux pistes :

    1. un fichier marqueur dans le worktree (par exemple .coursia-keep, avec le motif), qui donne REFUSE ;
    2. le pruner qui lit les COURSIA_REPO_DIR déclarés par les drop-ins coursia-*.service.d.

    Le marqueur est le plus simple, et il couvre aussi la demeure de merge_ready.

  2. jsboige commented on Sep 24, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2023:CoursIA-2 -- fix prune_merged_worktrees.py : REFUSE detached_on_main + lookup origin/main..HEAD uniquement. Tell c.c.c.d.625 ★★★★ narrow-cache MAINTAINED, Tell c.c.c.d.15793 ★★ nuance MED/guard admissible.

  3. added a commit that references this issue on Sep 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions