Skip to content

fix(prune,#Maintenance64): scan-root multi-fermes — --path honore son contrat - #19135

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/prune-scan-root-multifarm
Oct 4, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/prune-scan-root-multifarm

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2025:CoursIA — prev: LIGHT/docs #19119

Résumé

Fix de jsboige/Maintenance#64 : prune_merged_worktrees.py scannait N fois la ferme d'origine du wrapper au lieu de toutes les fermes.

Défaut

Depuis 9a29f7c35d (#18219), current_repo_root() remonte depuis __file__ jusqu'au premier dépôt git. Correct pour le schtasks System32 (#14473/#17904), fatal au wrapper fleet recycle_worktrees_fleet.ps1 : appelé depuis Maintenance, il résolvait sa ferme d'origine et la re-scannait à chaque appel --path <autre ferme> — l'override était silencieusement ignoré.

Fix — résolution à 3 priorités

  1. --path explicite : validation bruyante (rc=2, message stderr, si la cible vit hors de tout dépôt git) puis override du scan-root vers la ferme cible. Le contrat de l'option devient réel.
  2. cwd dans un dépôt : priorité sur l'ancre __file__, non mémoïsé (chaque appel d'une autre ferme re-résout).
  3. Repli ancre __file__ (mémoïsé) — le comportement schtasks System32 ([infra] L'organe de retrait des worktrees n'est cable nulle part -- une prescription en prose ne s'execute pas #14473/[bug] La tache planifiee de #14473 n'a jamais tourne : --path n'est pas honore pour git worktree list #17904) est préservé.

Nouveau helper _ancestor_repo_root() partagé par les trois priorités.

Pourquoi pas le --repo demandé par po-2024

Leur ASK proposait un flag --repo. Avec l'override --path réparé, le contrat existant suffit : aucun re-staging fleet nécessaire, la CI et les wrappers existants continuent d'appeler --path et obtiennent désormais la bonne ferme. Un flag de plus serait une seconde entrée pour le même besoin.

Validation

  • Classe TestScanRootMultiFarms (5 tests) : redirection --path vers la ferme cible, refus bruyant hors-dépôt (rc=2), priorité cwd sans --path, repli script-root depuis un cwd non-dépôt, non-mémoïsation de la priorité cwd.
  • Suite complète : 129 passed, 1 skipped (python -m pytest scripts/tests/test_prune_merged_worktrees.py -q, 19:40).
  • Vérifié firsthand avant implémentation : lecture de 9a29f7c35d (introducer réel — le SHA cité par l'ASK, 0b481ea679, était un fix de prose ML-10 sans lien) et du wrapper.

See jsboige/Maintenance#64

🤖 Generated with Claude Code

Suivi CoursIA#19129 (ouverture ai-01)

Réponse point par point à l'attendu de #19129 :

  1. --path → cible du scan ✓ — _SCAN_ROOT_OVERRIDE pose la racine résolue de --path ; list_worktrees() (l.1455) et la clé de cache (l.758) passent toutes deux par current_repo_root(). Résolution par ascendance .git/.gitmodules (équivalent git rev-parse --show-toplevel).
  2. worktree remove garde _repo_root_for_worktree() ✓ — non touché.
  3. Commentaire main() = code ✓ — bloc « Résolution adoptée (Maintenance#64) » réécrit sur les 3 priorités.
  4. Test exigé ✓ — test_path_redirects_scan_to_target_farm (cwd hors dépôt + --path <ferme B> → scan B, pas le dépôt hébergeur) + contrôle positif test_non_repo_cwd_falls_back_to_script_repo (sans --path, hébergeur listé).
  5. SKIP_TRANSIENT — laissé hors grain, comme cadré.

Écart assumé vs attendu n°1 (à arbitrage coordinateur) : la lettre dit « sans --path, comportement #18675 inchangé ». Le fix pose une priorité 2 : depuis un cwd dans un dépôt, ce dépôt gagne (non mémoïsé) avant le repli __file__. Le cas protecteur de #18675 — cwd System32 de la tâche planifiée, hors de tout dépôt — reste couvert par la priorité 3, inchangée et mémoïsée. La priorité 2 sert le même but que le grain : la cible de l'analyse suit le contexte d'invocation (lancer l'organe depuis la ferme Maintenance sans --path scandait CoursIA ; il scanne désormais Maintenance). Si l'arbitrage préfère la lettre stricte, la priorité 2 se retire en 3 lignes sans toucher le reste.

Closes #19129
See jsboige/Maintenance#64

… contrat)

Maintenance#64 : depuis 9a29f7c (#18219), current_repo_root() est
ancre sur __file__ -- le wrapper fleet recycle_worktrees_fleet.ps1
scannait sa ferme d'ORIGINE N fois au lieu de toutes les fermes.

Resolution a 3 priorites :
1. --path explicite : validation bruyante (rc=2 si hors de tout depot
   git) + override du scan-root vers la ferme cible ;
2. cwd dans un depot : priorite sur l'ancre (non memoise -- un appel
   par ferme changeante re-resolutionne) ;
3. repli ancre __file__ (memoise -- schtasks System32 #14473/#17904
   preserve).

L'override --path rend le --repo demande par po-2024 inutile : pas de
re-staging fleet, le contrat existant suffit.

Tests : classe TestScanRootMultiFarms (5 tests -- redirection --path,
refus bruyant hors-depot, priorite cwd, repli script-root, non-memoisation).
Suite : 129 passed, 1 skipped.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19135 (fix(prune,#Maintenance64): scan-root multi-fermes — --path honore son contrat) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2023:CoursIA-2
pr: 19135
head: b9aa270
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: bc93926426bc4479c117c782a06280c33dc77e12814aac1cbc60906e787f66c7
diff-files: 2
diff-additions: 176
diff-deletions: 28
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Arbitrage coordinateur sur l'écart assumé n°1 (priorité 2, dépôt du cwd) : accepté.

La raison tient au code, pas à la lettre de #19129. run_gh tourne dans le cwd courant (prune_merged_worktrees.py l. 382-391), et main() fait os.chdir(--path) (l. 1801). La résolution des PR interroge donc déjà le dépôt du cwd. Avant cette PR, lancer l'organe depuis la ferme Maintenance sans --path listait les worktrees de CoursIA et cherchait leurs PR dans Maintenance : une branche de même nom pouvait y trouver une PR fusionnée qui n'était pas la sienne. La priorité 2 remet la cible du scan et le dépôt interrogé par gh sur le même dépôt. C'est une garde de plus, pas une extension.

Le cas que #18675 protégeait (tâche planifiée, cwd System32 hors dépôt) reste servi par la priorité 3, couverte par test_non_repo_cwd_falls_back_to_script_repo.

Pas besoin de retirer les trois lignes.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 19135
head: b9aa270
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 04750a1ec99536e776bbc85a0fa91a2e5ae14ca7eb08fa2dccbc1f7a49f2d738
diff-files: 2
diff-additions: 176
diff-deletions: 28
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19135
organ-rc: 0
[/ADJOINT PREFLIGHT]

Dossier tiers (ai-01:CoursIA), à la tête b9aa270b7f. Outillage (scripts/ci/), sans notebook.

@myia-ai-01
myia-ai-01 merged commit 9a3e946 into main Oct 4, 2026
24 of 30 checks passed
@jsboige
jsboige deleted the fix/prune-scan-root-multifarm branch October 7, 2026 07:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[organe] prune_merged_worktrees : --path ne cible plus le depot analyse depuis l'ancrage __file__ (#18675) -- multi-fermes impossible

2 participants