Repository navigation
fix(picker,#16926): la file de reparation ne compte plus un CHANGES_REQUESTED deja leve - #19073
Merged
Merged
Conversation
…EQUESTED deja leve `blocking_causes` lisait `reviews[].state` brut pour sa cause 3. GitHub conserve la derniere review PAR AUTEUR : la reserve d'un tiers reste `CHANGES_REQUESTED` a jamais, meme quand une review TIERCE posterieure l'a levee. L'organe du merge-gate B.0, lui, lit la levee -- et le picker delegue DEJA a cet organe pour la cause 4, dans le meme fichier. Les deux chemins avaient diverges. Mesure fondatrice (#18829, lane myia-po-2025:CoursIA) : CR Hermes du 02/10 10:29Z, leve par ai-01 le 04/10 02:35Z, organe rc=0. Le picker ouvrait quand meme une FILE DE REPARATION sur la PR -- premier geste de la session, sur un travail deja fait et deja approuve. - `blocking_causes` : nouveau kwarg `review_points_clear` (defaut False). Quand il est vrai, un `CHANGES_REQUESTED` natif n'est pas une cause. - `unaddressed_review_points` : rend desormais `0` pour une PR EVALUEE et declaree claire. Le `0` est l'information qui distingue « evaluee, claire » de « jamais evaluee » -- sans lui, le correctif serait fail-OPEN sur toute panne par-PR. - `red_backlog` : `review_points_clear=nits_by_pr.get(n) == 0`. Le `== 0` (et non `not ...`) est ce qui preserve le fail-closed : une PR absente du dict n'a pas ete evaluee, la cause est conservee. Le defaut par defaut est False : sans verdict d'organe, le comportement anterieur est inchange. Le seul appelant qui sait est celui qui a le verdict. Preuves : - 4 tests, dont le CONTROLE POSITIF qui manquait -- aucun test ne couvrait la cause 3, c'est par la qu'elle a derive de la doctrine que le docstring du meme fichier enonce ; - controle par MUTATION : garde neutralisee -> le test de la levee rougit (`assert ['CHANGES_REQUESTED non leve (clusterManager-Myia)'] == []`) ; - bout-en-bout sur l'etat REEL de #18829 : avant `['CHANGES_REQUESTED non leve (clusterManager-Myia)']`, apres `[]` ; - CLI du picker sur la lane : section `FILE DE REPARATION` absente (0 occurrence de `FILE DE REPARATION`, de `18829` et de la cause), la lane passe directement au tirage ; - 490 passed, 1 skipped sur la suite picker (aucune regression). See #16926 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Contributor
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
This was referenced Oct 4, 2026
Merged
Owner
Author
|
[ADJOINT PREFLIGHT] |
This was referenced Oct 7, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Grain: MED/tooling — lane myia-po-2025:CoursIA — prev: MED/notebook-python #19011
Le defaut, mesure
Le picker ouvre chaque session d'une lane par sa file de reparation : les PRs qu'elle porte et qui sont bloquees. C'est le premier geste du cycle, avant tout grain neuf — donc une cause fausse y coûte le cycle entier.
Pour sa cause 3 (CHANGES_REQUESTED non leve),
blocking_causeslisaitreviews[].statebrut :Or GitHub conserve la derniere review par auteur. Une reserve posee par un tiers reste donc
CHANGES_REQUESTEDa jamais, meme quand une review tierce posterieure l'a levee. §B.0 duCLAUDE.mddocumente ce champ comme structurellement aveugle — et le meme fichier delegue deja a l'organe pour sa cause 4. Les deux chemins avaient diverge.Mesure fondatrice — #18829 (lane
myia-po-2025:CoursIA, celle de cette PR) :clusterManager-Myia)myia-ai-01check_unaddressed_nits.py 18829→ rc=0FILE DE REPARATION -- #18829 ... CHANGES_REQUESTED non leve (clusterManager-Myia)La PR etait
mss=CLEAN, approuvee par le coordinateur, sans conflit ni rouge requis. Deux dossiers[ADJOINT PREFLIGHT]anterieurs a la levee l'avaient laisseeBLOCKEDsur ce seul champ — leur note dit explicitement que la substance etait prete. Aucun travail n'etait dû, et la lane etait envoyee en reparation.Le correctif
Trois changements, tous dans
scripts/pick_idle_grain.py:blocking_causes— nouveau kwargreview_points_clear(defautFalse). Quand il est vrai, l'appelant declare que l'organe B.0 a evalue les surfaces de review de cette PR et n'y a rien trouve de non leve : unCHANGES_REQUESTEDnatif n'est alors pas une cause.unaddressed_review_points— rend desormais0pour une PR evaluee et declaree claire (avant : aucune entree, indistinguable de « jamais evaluee »). Le0est l'information ; son absence veut dire « non evaluee ».red_backlog—review_points_clear=nits_by_pr.get(pr["number"]) == 0.Le
== 0(et non unnot ...) est deliberé : c'est lui qui preserve le fail-closed. Une PR absente du dict n'a pas ete evaluee (panne par-PR, exception avalee) et la cause est alors conservee. Le defaut du kwarg estFalse, donc tout autre appelant garde le comportement anterieur — seul l'appelant qui detient le verdict d'organe s'en sert.Preuves
Tests — 4 ajoutes dans
scripts/tests/test_pick_idle_grain.py, dont le controle positif qui manquait : aucun test du fichier ne couvrait la cause 3 (grep CHANGES_REQUESTEDy rendait 0), c'est par la qu'elle a derive de la doctrine que le docstring du meme fichier enonce.Controle par mutation — un test qui ne peut pas rougir ne prouve rien. Garde neutralisee (
if review_points_clear:→if False:), le test de la levee rougit :puis restaure (aucune trace de la mutation dans le fichier commite).
Bout-en-bout sur l'etat REEL de #18829 (organe et API en direct, pas une fixture) :
Le consommateur reel — CLI du picker sur la lane, apres correctif :
La section a disparu ; la lane passe directement au tirage. Avant le correctif, le meme appel l'ouvrait sur
#18829.Non-regression — suite picker complete :
Ce que cette PR ne fait pas
orphan_prsappelleblocking_causessans le nouveau kwarg et garde exactement son comportement (fail-closed).check_unaddressed_nits.py, est intact — cette PR ne fait que cesser de le contredire sur un chemin.reviewDecisionaveugle aux LGTM argumentes).See, pasCloses.Recouvrement avec #18870 (verifie, L898)
#18870(lanemyia-ai-01:CoursIA,MED/guard) touche le meme fichier. Contrôle des hunks fait avant le push : les siens sont en@@ -3900/@@ -3907(fonctionsbelt_*) et@@ -5265(main) ; les miens en104/2871-2892/3009/3202-3226/3511. Regions disjointes — les deux PRs se mergent dans n'importe quel ordre sans conflit. Aucune action demandee de part et d'autre.🤖 Generated with Claude Code