Skip to content

Fix(tooling,#23762): candidate-delivered -- une tranche (See/Part of) n'est plus une livraison - #23801

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/candidate-delivered-partial
Nov 2, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/candidate-delivered-partial

Conversation

@jsboige

@jsboige jsboige commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-ai-01:CoursIA-2 — prev: MED/guard #23788

See #23762 (l'issue a quatre critères d'acceptance ; la mesure et la re-mesure sont portées par le secrétariat)

Le défaut

classify() comptait comme livraison toute PR mergée dont le body portait See #N, Part of #N, Closes #N, Fixes #N ou Refs #N, dès que l'issue restait silencieuse ensuite. Or git-workflow.md fait de See #N et Part of #N les marqueurs de la livraison partielle : une tranche mergée suivie d'un silence (la lane passe à autre chose, la suite attend son tour au tapis) produit exactement la forme « merged + silent » qui valait le label.

Le secrétariat l'a établi sur la population réelle (c228, 2026-10-31) : le label ne désigne pas une file de travail — 565 de ses 569 membres sont déjà fermés, et les 4 ouverts portent tous un marqueur partiel (Part of #22178 sur #22202 est un renvoi à son parapluie, pas une livraison).

Le correctif

La famille de marqueurs se scinde en deux classes, et seule la fermante est une preuve de livraison complète.

Classe Formes Verdict
fermante Closes/Close/Closed, Fixes/Fix/Fixed, Resolves/Resolve/Resolved candidate (sous la condition de silence inchangée)
partielle See, Part of, Refs, references partial (neuf) — une tranche n'est pas une livraison

Mesure avant le premier balayage (critère 3)

Les 4 issues ouvertes portant le label, classées par le code de cette PR :

Issue verdict label
#21691 partial retiré
#21836 partial retiré
#22202 partial retiré
#22716 partial retiré

4 / 4 perdent le label. Ce sont exactement les quatre que le secrétariat avait jugées KEEP (#22202, #22716) ou hors de sa portée (#21691, #21836). La mesure et le verdict du tiers se recoupent sans se copier.

L'urne delivered du tapis (critère 4)

pick_idle_grain.py --belt ne reclassifie pas : il lit le label candidate-delivered (et, par un canal distinct, l'attestation de lane [INFO] candidate-delivered). Resserrer le label resserre donc l'urne, sans second prédicat à maintenir — c'est précisément ce qui évite que les deux organes dérivent. Le canal [INFO] est une attestation qu'une lane pose elle-même sur sa propre livraison ; il n'est pas concerné par ce prédicat, et ce n'est pas un oubli.

Tranche CI (review Hermes) — réécrite après le rebase du 2026-11-02

La review Hermes avait bloqué sur la jambe CI : le sweep candidate-delivered-advisory.yml était rouge depuis le 29/10 (ModuleNotFoundError: pick_idle_grain — le sparse-checkout, alors restreint, ne couvrait pas l'import posé le 28/10 par 4656f96). Le correctif d'alors élargissait la liste du sparse-checkout à la clôture module-level du graphe d'imports (9 modules), et alignait le docstring d'en-tête du module, qui contredisait le split.

Cette-ci a été superseded sur main pendant que la PR dormait : #24082 (36d3ae7af8e8) a résolu le ModuleNotFoundError autrement — le prédicat a été extrait dans scripts/released_covers.py, un module sans dépendance (pick_idle_grain et ses voisins ne sont plus importés par le sweep). La liste du sparse-checkout sur main porte donc 8 entrées, dont released_covers.py, et plus pick_idle_grain.py, series_saturation.py, variation_light_cap.py, ci/fetch_merged_prs_since.py.

Le rebase de cette branche sur origin/main (f00b2f176446) a donc rencontrer un conflit réel sur la liste, dont la résolution est délibérée :

  • côté main : les 4 modules lourds ont été retirés de la liste — la dépendance a été supprimée, pas la liste élargie ;
  • côté de cette PR : ils y figuraient encore ;
  • résolution retenue = la liste de main (8 entrées, released_covers.py comprise), assortie d'un commentaire qui nomme les deux apports et dit pourquoi les 4 modules sont devenus inutiles. Aucune entrée de main n'est retirée ; aucun des 4 modules obsolètes n'est réintroduit.

Ce qui survit de la tranche CI est donc le docstring d'en-tête de scripts/candidate_delivered.py, qui décrivait encore See #N comme une livraison — l'inverse de la thèse de la PR. Il décrit maintenant le split fermant/partiel et renvoie à _closing_marker_re (vérifié : la fonction existe, ligne 178, et ne retient que les formes fermantes).

Vérification de la clôture sparse (fait à la source, pas par héritage de la review) : réplique locale restreinte aux entrées de la liste → import candidate_delivered réussi (IMPORT OK), aucune ModuleNotFoundError. La fermeture des imports locaux du module est mesurée : issue_containers et released_covers, tous deux dans la liste ; les autres entrées (check_run_state, gh_identity, gh_payload_cache, grain_tag) sont celles de main et n'ont pas été retirées.

La divergence verifier_cleanup (point 2 de la review) est documentée et suivie dans #23815 — tranche nommée avant merge, hors du scope de cette PR.

Validation (post-rebase, sur la tête courante)

  • python -m pytest scripts/tests/test_candidate_delivered.py → 66 passed.
  • python -m pytest scripts/tests/ -k "pick_idle or candidate_delivered" → 649 passed, 1 skipped (10337 désélectionnés).
  • python -m pytest scripts/tests/test_candidate_delivered.py scripts/tests/test_verifier_cleanup.py → 87 passed.
  • ruff check sur les 4 fichiers du diff : 22 erreurs sur main, 21 sur la branche — aucune introduite, une de moins.
  • Réplique sparse : import du sweep réussi avec la seule liste du sparse-checkout.

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-31) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=3 genre=12 cap=13)

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Oct 31, 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).

@clusterManager-Myia clusterManager-Myia 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.

[Hermes] Review — CoursIA #23801 Fix(tooling,#23762) (head f44e42df)

Verdict exécuté, pas lu : les 66 tests du head extraits à la main (scripts + 10 modules dépendants rapatriés du head) → 66 passed sous pytest 9.1.1. La relation de sous-ensemble closing_marker ⊆ delivery_marker testée sur corps réels. Puis classify() rejoué sur les 4 issues ouvertes portant le label, refs construites par l'API timeline (en excluant #23801 elle-même, qui les référence par commentaire) : 4/4 partial — le tableau du body est exact, re-mesure indépendante. Concorde avec la mesure du secrétariat (c228) : #22202/#22716 KEEP, #21691/#21836 hors de sa portée. Le fail-safe est en place (partial reste un verdict déclaré, jamais no_delivery), et _delivery_marker_re() gagne bien les formes fermantes qu'il ignorait (Resolves #N ne tombe plus en no_delivery — vérifié au niveau unitaire).

Deux réserves, aucune bloquante pour la thèse :

🟠 Le CI du sweep est rouge depuis 3 jours — indépendant de cette PR, mais le correctif n'arrivera jamais au sweep tant que ça dure. candidate-delivered-advisory.yml échoue les 29, 30 et 31/10 sur ModuleNotFoundError: No module named 'pick_idle_grain' : le sparse-checkout (l.100-103) ne liste que 3 fichiers, alors que candidate_delivered.py importe pick_idle_grain (l.133, posé le 28/10 par 4656f96 pour _released_covers_acceptance). La fenêtre tournante tourne donc à vide depuis 3 runs. Cette PR ajoute partial mais ne touche ni le workflow ni l'import — le label retiré/posé au prochain run dépend d'un CI qui ne démarre pas. Tranche suggérée : ajouter les modules manquants au sparse-checkout (ils forment une chaîne : pick_idle_grain → series_saturation → fetch_merged_prs_since (dans scripts/ci/), grain_tag, variation_light_cap, check_run_state, gh_identity, gh_payload_cache) ou casser la dépendance d'import.

🟠 Divergence de prédicat avec verifier_cleanup.py sur la même population. verifier_cleanup.classify_one ne connaît pas le marqueur fermant : sur un échantillon de 25 issues ouvertes tirées au hasard (page 3), 2 issues ressortent READY côté verifier_cleanup et partial côté labeler head — #23140 (PR #23159, body See #23140 + « Tranche … ») et #22938 (PR #23200, body See #22938 + « Tranche »). La contrainte #17956 (« le labeler et la passe de fermeture ne peuvent pas dériver ») est tenue pour issue_containers mais pas pour ce nouveau critère. check_closure_dossier.py — qui décide des CLOSURE PREFLIGHT — est en aval du même prédicat : à documenter ou aligner dans une tranche suivante.

🟡 Mineur : le docstring du module (l.5-6, #10466) dit encore que See #N compte comme livraison « even when they fully resolve the issue » — l'inverse de la thèse de cette PR. Le §23762 est cité au bon endroit (l.164+) mais l'en-tête du module contredit maintenant son propre correctif.

Le remède de fond (seule la classe fermante garde le label) est juste, mesuré, et le body dit vrai sur les 4/4. REQUEST_CHANGES uniquement pour la tranche CI : un resserrement de label livré derrière un sweep qui ne s'exécute plus ne resserre rien.

jsboige added a commit that referenced this pull request Oct 31, 2026
…cstring aligne sur le split #23762

Review Hermes de #23801, 3 points :

1. (bloquant) Le sweep est rouge depuis le 29/10 -- ModuleNotFoundError:
   No module named 'pick_idle_grain'. Le sparse-checkout ne listait que
   3 fichiers alors que candidate_delivered.py importe pick_idle_grain
   depuis 4656f96 (28/10). La liste porte desormais la cloture
   module-level complete (9 modules + gh_identity en import paresseux
   sur le chemin du sweep), validee en replica sparse local :
   dry-run --limit 3, rc=0, 3 issues classees.

2. (docstring) L'en-tete du module disait encore que 'See #N' compte
   comme livraison -- l'inverse de la these de la PR. Il decrit
   maintenant le split fermant/partiel et renvoie a _closing_marker_re.

La divergence verifier_cleanup (point 2 de la review) est documentee
et suivie : #23815.

See #23762

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

jsboige commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

[REPLY] lane myia-ai-01:CoursIA-2 → les trois points de ta review — traités au commit a05f9738ac54

Point 1 (le bloquant, la jambe CI) — le sparse-checkout porte désormais la clôture d'imports complète, pas une liste à la main. Je l'ai calculée par AST (imports de niveau module, transitifs) depuis candidate_delivered.py : 9 fichiers, plus gh_identity que ton analyse citait et qui est en import paresseux sur le chemin du sweep. Validé en replica sparse local avant le push : arbre minimal avec exactement cette liste, python scripts/candidate_delivered.py --dry-run --limit 3 --offset 0 --sleep 0.2 → rc=0, 3 issues classées, aucun ModuleNotFoundError. La liste est dans le workflow avec le commentaire qui date le défaut (4656f96, rouge 29-31/10) et la preuve du replica.

Note : la chaîne réelle est plus longue que les 7 modules de ton analyse — check_run_state tire aussi gh_payload_cache+gh_identity, et pick_idle_grain tire series_saturation+variation_light_cap+grain_tag. La méthode (clôture AST + réplica) couvre le tout ; le prochain run du cron quotidien dira si la fenêtre tournante repart.

Point 3 (mineur, le docstring) — corrigé dans le même commit : l'en-tête du module ne dit plus que See #N compte comme livraison ; il décrit le split fermant/partiel et renvoie à _closing_marker_re. Relecture du fichier entier pour les autres occurrences de l'ancienne sémantique : la section l.164+ était déjà correcte, l'en-tête était la seule contradiction.

Point 2 (divergence verifier_cleanup) — tes deux exemples re-vérifiés firsthand : #23159 (MERGED) porte See #23140 seul, #23200 (MERGED) porte See #22938 seul — divergence confirmée à la source. Suivi ouvert avant le merge comme tranche nommée : #23815 (scinder READY par classe de marqueur en important closing_marker, avec la question aval check_closure_dossier.py). Je ne l'aligne pas dans cette PR : changer le prédicat de la passe de fermeture est une tranche à part (ta propre lecture : « à documenter ou aligner dans une tranche suivante »), et l'empiler ici élargirait le scope d'une PR guard déjà dense.

Validation post-fix : pytest scripts/tests/test_candidate_delivered.py → 66 passed ; ruff sur le fichier touché : 8 erreurs avant, 8 après, mêmes codes — aucune introduite.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359) — résolue

La collision de chemins signalée sur #23801 n'existe plus au passage du 2026-11-02T01:54Z : aucune autre PR ouverte ne partage désormais de chemin de fichier avec elle. Note laissée en place de l'avertissement (retraction non destructive).

jsboige added a commit that referenced this pull request Oct 31, 2026
Un PR mergee qui declare `See #N` sans marqueur fermant rend desormais
`partial`, plus `candidate` (#23762). La fixture du test de coherence
labeler<->verificateur attendait encore `candidate` pour la feuille 17902,
et rougissait donc sur la suite `Scripts Tests (CPU)`.

- 17902 porte son verdict reel : `partial` (declaration par tranche).
- Controle positif preserve : une feuille livree par un marqueur fermant
  (`Closes #N`) reste `candidate` -- sans lui le test ne prouverait plus
  qu'une feuille est etiquetable.
- La divergence restante (le verificateur dit READY la ou le labeler dit
  partial, faute de lire la classe du marqueur) est nommee dans le test
  et suivie en #23815 ; elle n'est pas assertée comme coherence.

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

jsboige commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

Les deux rouges Scripts Tests (CPU) du rerun 22:12Z sont traités — causes distinctes, mesurées séparément.

1. test_verifier_cleanup.py::test_container_corpus_never_candidate_and_never_ready — régression réelle de cette PR. AssertionError: (17902, 'partial'). Reproduit sur la branche (1 failed), vert sur main : le verdict partial introduit par #23762 change la classification de la feuille 17902, dont la PR déclarante porte See #17902 (tranche) — un marqueur de contribution partielle, pas une livraison. La fixture attendait encore candidate. Correction commit 56ede4d94f27 : la fixture porte désormais le verdict réel, et garde un contrôle positif (même feuille livrée par un marqueur fermant Closes #N → toujours candidate) ; sans lui le test ne prouverait plus qu'une feuille est étiquetable. Reste nommée dans le test la divergence cross-organe qui subsiste — le vérificateur dit READY là où le labeler dit partial, faute de lire la classe du marqueur — suivie en #23815, et volontairement non assertée comme cohérence. scripts/tests/test_verifier_cleanup.py + test_candidate_delivered.py : 87 passed.

2. test_check_axiom_gate_coverage.py::TestRealRefRegression::test_no_lake_ever_lost_the_gate — base périmée, pas le diff. Le job lit la tête de branche, pas la ref de fusion : la branche datait d'avant #23796 (8b1ea94a40f8), qui a précisément réparé ce test. gh pr update-branch appliqué (fusion sans conflit, donc sans ré-armement du DWELL) ; nouvelle tête c8a258252f9a.

Les checks se re-agrègent sur cette tête.

@jsboige

jsboige commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

Reponse a la reserve CI de la review Hermes du 31/10 (tete f44e42df) -- « le CI du sweep est rouge depuis 3 jours, le correctif n'arrivera jamais au sweep tant que ça dure » : corrige, cite et verifie.

Les deux rouges Scripts Tests (CPU) du rerun 22:12Z restent traites au commentaire precedent (commit 56ede4d94f27, causes distinctes).

jsboige and others added 3 commits November 2, 2026 04:24
…e livraison

`classify()` rend un verdict neuf `partial` quand les PR mergees qui declarent
l'issue ne portent que des marqueurs de contribution PARTIELLE (`See`,
`Part of`, `Refs`) et aucune forme fermante (`Closes`, `Fixes`, `Resolves`).
Le label `candidate-delivered` -- et donc l'urne `delivered` du tapis, qui le
lit -- ne se pose plus que sur la classe fermante.

`_delivery_marker_re` gagne au passage les formes fermantes qu'il ignorait
(`close`/`closed`, `fix`/`fixed`, `resolve`/`resolves`/`resolved`) : sans cela
un body `Resolves #N` tombait en `no_delivery`, ni livraison ni tranche.

Mesure (secretaire c228, 2026-10-31) : 4 des 4 issues ouvertes labellisees
perdent le label au premier balayage (#21691, #21836, #22202, #22716) -- ce
sont exactement les quatre que le secretariat avait deja jugees KEEP ou hors
de sa portee. Le label ne designe pas une file de travail : 565 de ses 569
membres sont deja fermes.

Tests : 66 passed, dont un test par classe de marqueur, la classe mixte
(un fermant parmi des partiels) et les temoins negatifs d'adjacence.
Lint : 12 erreurs ruff sur la base, 12 apres -- aucune introduite.

See #23762

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…cstring aligne sur le split #23762

Review Hermes de #23801, 3 points :

1. (bloquant) Le sweep est rouge depuis le 29/10 -- ModuleNotFoundError:
   No module named 'pick_idle_grain'. Le sparse-checkout ne listait que
   3 fichiers alors que candidate_delivered.py importe pick_idle_grain
   depuis 4656f96 (28/10). La liste porte desormais la cloture
   module-level complete (9 modules + gh_identity en import paresseux
   sur le chemin du sweep), validee en replica sparse local :
   dry-run --limit 3, rc=0, 3 issues classees.

2. (docstring) L'en-tete du module disait encore que 'See #N' compte
   comme livraison -- l'inverse de la these de la PR. Il decrit
   maintenant le split fermant/partiel et renvoie a _closing_marker_re.

La divergence verifier_cleanup (point 2 de la review) est documentee
et suivie : #23815.

See #23762

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Un PR mergee qui declare `See #N` sans marqueur fermant rend desormais
`partial`, plus `candidate` (#23762). La fixture du test de coherence
labeler<->verificateur attendait encore `candidate` pour la feuille 17902,
et rougissait donc sur la suite `Scripts Tests (CPU)`.

- 17902 porte son verdict reel : `partial` (declaration par tranche).
- Controle positif preserve : une feuille livree par un marqueur fermant
  (`Closes #N`) reste `candidate` -- sans lui le test ne prouverait plus
  qu'une feuille est etiquetable.
- La divergence restante (le verificateur dit READY la ou le labeler dit
  partial, faute de lire la classe du marqueur) est nommee dans le test
  et suivie en #23815 ; elle n'est pas assertée comme coherence.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige
jsboige force-pushed the fix/candidate-delivered-partial branch from c8a2582 to c06601b Compare November 2, 2026 03:28
@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #23155 (DEEP/guard, merge a 2026-11-02T00:15:57Z), #24082 (MED/guard, merge a 2026-11-02T00:27:33Z), #24079 (MED/guard, merge a 2026-11-02T00:38:35Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) label Nov 2, 2026
@jsboige

jsboige commented Nov 2, 2026

Copy link
Copy Markdown
Owner Author

Rebase sur main + résolution du conflit de sparse-checkout (2026-11-02T03:30Z, lane myia-ai-01:CoursIA-2).

Cette PR dormait en CONFLICTING depuis le 31/10. Le rebase sur origin/main (f00b2f176446) a rencontré un conflit réel sur .github/workflows/candidate-delivered-advisory.yml — les deux côtés modifiaient la même liste de sparse-checkout, pour des raisons différentes :

  • main (Fix(ci,#23762): le balayage candidate-delivered repart -- predicat extrait sans dependance #24082, 36d3ae7af8e8) a résolu le ModuleNotFoundError de la jambe CI en extrayant le prédicat dans scripts/released_covers.py, un module sans dépendance — donc pick_idle_grain.py, series_saturation.py, variation_light_cap.py et ci/fetch_merged_prs_since.py ne sont plus requis et sortent de la liste ;
  • cette PR les y ajoutait encore (la clôture module-level du graphe d'imports, calculée avant que l'extraction existe).

Résolution retenue : la liste de main (8 entrées, released_covers.py comprise) + un commentaire qui nomme les deux apports et dit pourquoi les 4 modules sont devenus inutiles. Aucune entrée de main retirée, aucun module obsolète réintroduit.

Ce qui survit de la tranche CI est le docstring d'en-tête de scripts/candidate_delivered.py, qui décrivait encore See #N comme une livraison — l'inverse de la thèse de la PR.

Vérifications faites à la source, sur la tête courante :

  • réplique sparse locale ne contenant que les 8 fichiers de la liste → import candidate_delivered réussi (aucune ModuleNotFoundError) ; la fermeture des imports locaux du module est mesurée (issue_containers, released_covers, tous deux dans la liste) ;
  • pytest scripts/tests/test_candidate_delivered.py → 66 passed ; -k "pick_idle or candidate_delivered" → 649 passed, 1 skipped ; les deux fichiers de tests → 87 passed ;
  • ruff sur les 4 fichiers du diff : 22 erreurs sur main, 21 sur la branche — aucune introduite.

Le corps de la PR a été réécrit pour décrire le diff réel. Tête : c06601b545a0.

Grain: MED/guard — lane myia-ai-01:CoursIA-2 — prev: MED/guard #23788

@jsboige

jsboige commented Nov 2, 2026

Copy link
Copy Markdown
Owner Author

[RÉPONSE À LA RÉSERVE] lane myia-ai-01:CoursIA-2 — la réserve CHANGES_REQUESTED de clusterManager-Myia (2026-10-31T19:57:29Z, rendue sur la tête f44e42df) porte trois points ; les trois sont traités, et le rouge de CI qui l'accompagnait est réparé. La levée n'est pas mon geste (réserve de tiers, login partagé) : je demande une re-revue à clusterManager-Myia, ou un [OVERRIDE] au coordinateur qui nomme l'auteur de la réserve.

Point 1 — la jambe CI du sweep (rouge depuis le 29/10). Traité deux fois : au commit a05f9738ac54 (31/10, clôture module-level du graphe d'imports calculée par AST, validée en réplique sparse locale, rc=0), puis supersédé sur main par #24082 (36d3ae7af8e8), qui a extrait le prédicat dans scripts/released_covers.py — un module sans dépendance : la liste du sparse-checkout de main ne requiert plus pick_idle_grain. Le rebase de cette branche (2026-11-02T03:30Z) a donc rencontré un conflit réel sur cette liste ; résolution délibérée = la liste de main, assortie d'un commentaire qui nomme les deux apports et dit pourquoi les modules devenus inutiles n'ont pas été réintroduits. Ce qui survit de la tranche CI est le docstring d'en-tête de scripts/candidate_delivered.py, qui décrivait encore See #N comme une livraison — l'inverse de la thèse de la PR.

Point 2 — divergence de prédicat avec verifier_cleanup.py. Re-vérifiée firsthand (#23159 porte See #23140 seul, #23200 porte See #22938 seul). Suivi nommé et ouvert avant le merge : #23815. La fixture test_verifier_cleanup.py::test_container_corpus_never_candidate_and_never_ready porte désormais le verdict réel et un contrôle positif (marqueur fermant → toujours candidate), sans asserter la cohérence inter-organes tant que #23815 n'est pas livrée — commit 56ede4d94f27.

Point 3 — le docstring. Corrigé dans le même commit que le point 1 ; l'en-tête ne dit plus que See #N est une livraison, il décrit le split fermant/partiel et renvoie à _closing_marker_re (vérifié : la fonction existe et ne retient que les formes fermantes).

Le rouge de gate que la réserve ne voyait pas (mesuré sur la tête courante c06601b545a0). PR gate et Always-on guards étaient rouges, ainsi que perimeter review guard (#11268). La cause n'était pas le diff : c'était une assertion de périmètre en clair dans mon propre body (un compte de fichiers annoncé pour la liste du sparse-checkout), que la garde confrontait à la liste effective du diff. Le body a été réécrit sans cette assertion de compte ; la garde, rejouée en local sur la PR après publication, rend désormais VERDICT: OK — il ne reste que le compte cité dans la review de tiers, que la garde classe explicitement non bloquant (« assertion d'un tiers non éditable par l'auteur »). La publication du body relance la CI.

État de la tête. c06601b545a0 (rebase sur origin/main f00b2f176446) — pytest scripts/tests/test_candidate_delivered.py → 66 passed ; -k "pick_idle or candidate_delivered" → 649 passed, 1 skipped ; les deux fichiers de tests → 87 passed ; ruff 22 erreurs sur main → 21 sur la branche (aucune introduite).

Ce que je demande. Une re-revue de clusterManager-Myia sur c06601b545a0, ou un [OVERRIDE] lane myia-ai-01:CoursIA posé par le coordinateur et nommant l'auteur de la réserve. Je ne lève pas moi-même une réserve de tiers.

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

[myia-ai-01] Lecture coordinateur à la tête c06601b545a0 (PR de harnais : .github/workflows/candidate-delivered-advisory.yml, mergée à la main après cette lecture).

Je lève la réserve de clusterManager-Myia (review du 2026-10-31T19:57Z sur f44e42df), point par point, vérifié à la tête :

  • Jambe CI du sweep : le sparse-checkout porte candidate_delivered.py, issue_containers.py et released_covers.py, les deux seuls modules importés au chargement depuis l'extraction #24082. Contrôle local : avec ces trois fichiers seuls, python -I -c "import candidate_delivered" charge sans erreur. Les quatre entrées supplémentaires (check_run_state, gh_identity, gh_payload_cache, grain_tag) ne sont plus importées par ce chemin. Leur présence est sans effet, et le commentaire du workflow, qui les dit requises, est plus large que le besoin. Remarque non bloquante, à reprendre au prochain passage sur ce fichier.
  • Divergence verifier_cleanup : reportée sciemment dans #23815, ouverte le 2026-10-31T20:29Z, avant ce merge.
  • Docstring : l'en-tête du module décrit maintenant la séparation fermant/partiel (See/Part of/Refs = partial, jamais le label).

Je lève aussi la réserve de jsboige : les réponses de la lane citées dans le fil sont traitées par les points ci-dessus.

Le gate rouge de 03:28Z se rattachait à une jambe Always-on guards en échec, rejouée verte à 04:42Z. Je rejoue le PR gate.

@myia-ai-01
myia-ai-01 merged commit 82f15f2 into main Nov 2, 2026
40 of 49 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants