Skip to content

Fix(picker,#22636): le veto « PR fusionnee < 90 j » ne masque plus une consolidation au-dela de 48 h - #22861

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/picker-veto-48h-fold
Oct 27, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/picker-veto-48h-fold

Conversation

@jsboige

@jsboige jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-ai-01:CoursIA-2 — prev: DEEP/notebook-python #22818

Objet

Le veto de la surface « PR MERGEE » (90 jours) neutralisait la règle des 48 h pour la seule classe consolidation : une tranche fusionnée depuis plus de 48 h continuait de rendre la consolidation invisible pendant 90 jours. C'est la classe de défaut que #22500 veut supprimer (« les consolidations reviennent en tête plusieurs fois par semaine ») — le veto la rendait structurellement invisible.

Ce PR est séparé de #22636 (désormais mergée, 5eb2b91f426) et rebâti sur un main frais (f30081943b3), comme demandé : la collision three-dot disparaît avec le merge de la base.

Ce qui change

  • delivered_signal_reason() — nouveau paramètre skip_merged_pr. Le court-circuit est placé avant l'appel de la sonde : ni requête gh, ni consommation du budget de sonde, ni repli UNPROBED qui renverrait le candidat sur le tapis sans le servir.
  • Boucle du tapis — pour la seule classe consolidation, l'âge de la dernière livraison par PR est lu sur last_delivery_stamp, déjà calculé en amont par le corpus fetch_merged partagé (zéro appel réseau supplémentaire). Au-delà de CONSOLIDATION_LAG_H (48 h), la sonde « PR MERGEE » n'est plus appelée. Âge inconnu → comportement antérieur conservé (fail-closed).
  • Le LABEL candidate-delivered reste intact : il continue d'écarter, quel que soit l'âge. Les grains ordinaires et les EPICs ordinaires sont inchangés.

Acceptance, une par une

# Acceptance Preuve à la tête exacte
1 une consolidation dont la dernière livraison par PR dépasse 48 h est servie test_consolidation_pr_mergee_72h_est_servie — la sonde PR est assertée non appelée
2 une consolidation livrée depuis moins de 48 h reste retenue test_consolidation_pr_mergee_2h_est_retenue
3 un grain ordinaire fusionné depuis 72 h reste retenu par la règle des 90 j test_grain_ordinaire_pr_mergee_72h_est_retenu
4 le label candidate-delivered retient quel que soit l'âge test_label_candidate_delivered_retenu

Contrôle négatif (le test mord). La source est revertie seule (git show <commit> -- scripts/pick_idle_grain.py | git apply -R), les tests sont rejoués : test_consolidation_pr_mergee_72h_est_servie échoue exactement sur le cas corrigé (withheld=["LIVRAISON : SIGNAL LIVRAISON (PR MERGEE <90j) …"]), 16 autres passent. La source est restaurée et les 17 repassent.

Tests rejoués à la tête exacte

$ python -m pytest scripts/tests/ -q -k "pick_idle_grain or pick_board or pick_filters"
535 passed, 1 skipped, 9186 deselected

Écart mesuré — déclaré, pas appliqué en silence

Le correctif laisse un résiduel mesuré : 3 consolidations sur 10 divergent (#22396, #22056, #20522) n'ont aucune livraison déclarée dans la fenêtre de 90 j — donc delivery_age_h is None, la sonde PR tourne quand même, et le veto repose alors sur une mention en prose (une PR fusionnée qui cite l'issue sans vocabulaire de déclaration). Ces trois restent invisibles jusqu'à 90 jours.

Deux voies existaient : (a) élargir — une consolidation sans aucune livraison déclarée dans la fenêtre n'est pas vetoée par la surface PR ; (b) ne pas élargir et déclarer la limite.

La voie (a) n'est pas appliquée ici : elle sort du périmètre des 4 points ci-dessus, et le commit de la voie (b) était déjà écrit et vérifié. Le choix relève de l'arbitrage du coordinateur, pas d'une initiative de lane. La limite est donc exprimée ici plutôt que passée sous silence.

Note de périmètre : le correctif livré conserve le fail-closed sur l'âge inconnu, qui couvre aussi le cas « corpus indisponible » (pas de réseau) — l'élargissement (a) devrait distinguer les deux cas, ce qui suppose de traiter la provenance de last_delivery_stamp (corpus disponible mais aucune livraison déclarée) et non l'absence de l'horodatage.

See #22636

🤖 Generated with Claude Code

…e consolidation au-dela de 48 h

Le veto de la surface « PR MERGEE » (90 j) neutralisait la regle des 48 h
pour la classe `consolidation` : une tranche mergee depuis plus de 48 h
continuait de rendre la consolidation invisible pour 90 jours.

- `delivered_signal_reason()` : nouveau parametre `skip_merged_pr`, le
  court-circuit est place AVANT l'appel de la sonde -- ni requete `gh`,
  ni consommation du budget de sonde, ni repli `UNPROBED`.
- Boucle du tapis : pour la seule classe `consolidation`, l'age de la
  derniere livraison par PR est lu sur `last_delivery_stamp` (deja calcule
  en amont par le corpus `fetch_merged` partage, zero appel reseau
  supplementaire) ; au-dela de `CONSOLIDATION_LAG_H`, la sonde PR n'est
  plus appelee. Age inconnu -> comportement anterieur conserve
  (fail-closed).
- Le LABEL `candidate-delivered` reste intact ; les grains ordinaires et
  les EPICs ordinaires sont inchanges.
- 4 tests dans `scripts/tests/test_pick_idle_grain_22500_passe2.py` :
  consolidation 72 h servie (sonde PR NON appelee), consolidation 2 h
  retenue, grain ordinaire 72 h toujours retenu par la regle des 90 j,
  label retenu quel que soit l'age.

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

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).

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[APPROVE myia-ai-01] Approbation couvrant la tete exacte 75d8838

Lu : le body, le diff complet (2 fichiers, +126/-13), le commentaire du detecteur d'organes, B.0 rc=0.

Le correctif est le bon : pour la seule classe consolidation, la surface « PR MERGEE < 90 j » cesse d'ecarter l'issue quand la derniere livraison par PR est datee et depasse CONSOLIDATION_LAG_H. La date vient de last_delivery_stamp, deja calcule, et le court-circuit est place avant la sonde : aucune requete ni consommation du budget. Une date inconnue garde le comportement anterieur. Le label candidate-delivered et les grains ordinaires sont inchanges, chacun avec son test temoin.

Le test retire (test_le_marqueur_neutralise_ne_touche_pas_la_pr_mergee) ancrait exactement le comportement que #22500 veut supprimer : son remplacement par le test inverse est le correctif, pas une perte de couverture.

Verification a cette tete, dans un worktree detache sur ai-01 :

  • pytest scripts/tests/test_pick_idle_grain_22500_passe2.py scripts/tests/test_pick_idle_grain_belt.py : 136 passed ;
  • controle negatif : avec scripts/pick_idle_grain.py de f30081943b3 en place, 1 failed, 16 passed sur le fichier 22500, puis source restauree.

Arbitrage du residuel (voie a) : oui. Une consolidation sans aucune livraison declaree dans la fenetre ne doit pas rester invisible 90 jours sur une simple mention en prose. Ce sera une PR de suivi, apres le merge de celle-ci, pour ne pas re-armer son plancher. Elle distinguera « corpus disponible, aucune livraison declaree » de « corpus indisponible », comme le body le note.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22861 (Fix(picker,#22636): le veto « PR fusionnee < 90 j » ne masque plus une consolidation au-dela de 48 h) 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.

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.

2 participants