Repository navigation
Fix(picker,#19309): le gel s'applique a toutes les classes -- une EPIC gelee n'est plus servie - #24864
Conversation
…C gelee n'est plus servie Le gel est une decision explicite du coordinateur, portee par deux regles : regle A (ligne `[FROZEN] ...` dans le CORPS de l'issue) et regle B (en-tete `[FROZEN]` dans le FIL). `_issue_is_frozen` les lisait deja, mais elle n'etait cablee que DERRIERE `has_recent_delivery_marker`, lui-meme cable sur l'urne `grain` SEULE (`draw_unclaimed` : `if cls == "grain" and not include_delivered`). Une EPIC, classee `umbrella`, n'etait donc jamais consultee pour son gel. Mesure du 2026-11-05 (#19309) : l'EPIC est gelee par le body (ligne `[FROZEN]` depuis 17:38Z) ET par le fil (depuis le 03/11) ; le tapis l'a servie 7 fois dans la journee -- 7 `[RELEASED]` sans travail. Le correctif : - une sonde de gel A PART ENTIERE (`has_frozen_marker`), qui ne lit QUE le gel -- ni le marqueur de livraison de l'item, ni celui de ses enfants -- et rend la SOURCE (`body` / `comment`) ; - elle est appliquee a TOUTES les classes (`grain`, `umbrella`, `delivered`), avant les filtres de classe et avant le plafond EPIC, pour qu'un candidat gele dise « GEL » et ne revienne pas au tirage suivant ; - l'ecart sort avec sa cause (`GEL (body|comment)`) et son propre volet de sortie (`frozen_signal` en JSON, `ECARTE (gel)` en texte) ; - une lecture ratee reste fail-OPEN, mais DITE (`frozen_unread`) ; - le mode `--admissible` rendait `ADMISSIBLE` sur un item gele : le filtre y est branche, et la sortie nomme la cause. Cout : ZERO requete supplementaire dans le tapis -- la lecture du fil est servie par l'instantane de la passe, qui couvre la fenetre que la boucle parcourt, et le corps vient du cache du pool que le pool paie deja. La voie ponderee lit une fois de plus par candidat tire (une poignee). Temoins : `scripts/tests/test_pick_idle_grain_freeze_scope.py` -- EPIC gelee par le corps, EPIC gelee par le fil, controle negatif, gel sur toutes les classes, `--include-delivered` qui ne contourne pas le gel, lecture ratee fail-OPEN signalee, voie ponderee, `--admissible`. Suite : 1943 passed, 2 skipped, 5 xfailed (selection picker/claim/snapshot/ candidate-delivered/origami/closure) ; 498 passed sur la suite du picker. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Avertissements consultatifsG-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 Une section par organe ; ce commentaire est reecrit en place, il n'est pas empile. |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
myia-ai-01
left a comment
There was a problem hiding this comment.
Lu le code (scripts/pick_idle_grain.py) et lancé les tests dans un worktree frais à la tête 2ff175c0 : test_pick_idle_grain_freeze_scope.py 15 passed, et 606 passed sur l'ensemble des tests pick_idle.
Ce que j'ai vérifié :
- la porte de gel se place dans
draw_unclaimedAVANT les filtres de classe : elle vaut pourgrain,umbrellaetdelivered, et--include-deliveredne la contourne pas. C'est exactement le défaut de #19309 (une EPIC gelée, de classeumbrella, resservie 7 fois en une journée) ; has_frozen_markerest tri-état : une lecture en échec rendNone, en fail-OPEN signalé (frozen_unread), et non un faux « pas gelé » silencieux ;- le gel est séparé des marqueurs de livraison : un parapluie n'hérite pas de la livraison de ses enfants ;
- câblage de production :
frozen_probe = has_frozen_markerhors pytest (l.11455-11459), la valeur inerte n'est gardée que sousPYTEST_CURRENT_TESTsans--cache-dir, et la même sonde passe aux deux chemins (l.12156, l.12682) ; --admissiblevoit aussi le gel (gel_cause_text).
Remarque non bloquante : le texte de cause du gel est écrit deux fois (dans gel_cause_text et en ligne dans draw_unclaimed). On peut le factoriser à la prochaine retouche de ce fichier ; je ne la tiens pas pour une réserve.
B.0 rc=0, mergeable_state clean. APPROVE.
…ees (#24919) La sonde de gel (`has_frozen_marker`) rend `None` sur echec de lecture, et l'appelant le dit -- fail-OPEN assume, candidat reporte dans `frozen_unread`. L'etat etait publie dans le JSON (`frozen_signal.unread`), mais **jamais dit dans un rapport texte** : alors que les cinq lectures voisines (livraison, couverture, claim, conteneur, marqueur) ont chacune leur rapport `!! ... NON LU`. Le gel est un veto **transversal** : il ecarte le candidat de TOUTES les classes. Un gel non lu laisse donc passer un candidat que le gel aurait ecarte, et l'operateur qui lit la sortie n'apprendait l'echec que par le JSON. C'est le meme defaut que #17528 pour les autres sondes. Ajout : `print_frozen_unread_report`, dans la forme de ses trois pendants (numero, nature de l'incertitude, ce qu'il faut verifier avant d'editer), appele sur les deux chemins qui mesurent le gel : - la boucle de service (`belt_pick_with_replacements`) ; - le chemin `delivered`, ou la sonde de gel est cablee et produit `delivered_state.frozen_unread` -- lui aussi sans rapport texte. Le fail-OPEN reste assume (le tirage est maintenu) : ce qui n'est pas assume, c'est le **silence**. Tests : 3 ajoutes (rendu visible, mut quand rien n'a rate, deduplication des numeros). Suite complete du picker verte : 200 tests passes (`test_pick_idle_grain_belt.py`, `test_pick_idle_grain_freeze_scope.py`, `test_pick_frozen_sticky.py`, `test_pick_claim_filter.py`). Complement residuel de #24830, closee comme redondante avec #24864 (mergee sur main le 2026-11-06T02:08:44Z, meme correction du gel, plus complete : deux points de cablage au lieu d'un, plus le mode --admissible). See #24516 See #24830 Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
Grain: MED/tooling -- lane myia-ai-01:CoursIA-2 -- prev: MED/notebook-dotnet #24859
Le defaut
Le gel d'une issue est une decision explicite du coordinateur. Deux regles le portent :
[FROZEN] <motif> -- <autorite>dans le corps de l'issue ;[FROZEN]dans le fil (le filet des gels deja poses en commentaire, en attendant leur migration vers le corps)._issue_is_frozen(issue_body, comments)lisait deja les deux. Mais elle n'etait cablee que derrierehas_recent_delivery_marker, lui-meme cable sur l'urnegrainseule :Une EPIC est classee
umbrella: sa branche n'applique que la sonde de CONTENEUR (has_recent_container_delivery_marker, dernier commentaire). Le gel de l'EPIC n'etait jamais consulte.Mesure du 2026-11-05 (#19309) : l'EPIC #19309 est gelee par le body (ligne
[FROZEN]posee a 17:38Z) et par le fil (depuis le 03/11) ; le tapis l'a servie 7 fois dans la journee -- 7[RELEASED]sans travail. Un[RELEASED]ne leve pas un gel : c'est la grammaire elle-meme qui l'interdit.Le correctif
has_frozen_marker(issue_number)rend la source du gel ("body"/"comment"),Falsesi l'item n'est pas gele,Nonesi la lecture a echoue. Elle ne lit que le gel : ni le marqueur de livraison de l'item, ni celui de ses enfants. Un parapluie n'herite donc pas de la livraison de ses enfants.grain,umbrella,delivered), placee avant les filtres de classe et avant le plafond EPIC (Tapis (#18832) : priorite aux issues de consolidation, un sous-grain par visite et plafond hebdomadaire pour les EPICs d'extension #22500). Un candidat gele doit dire « GEL », jamais « PLAFOND EPIC » ni « LIVRAISON », et ne doit pas revenir au tirage suivant.GEL (body|comment)et la regle de degel dans le texte ; la sortie porte un volet dedie (frozen_signalen JSON,ECARTE (gel)en texte).frozen_unread), comme le fait dejaclaim_unread/marker_unread.--admissiblebranche — le mode repondait « ce grain-ci est-il consommable maintenant ? » et rendaitADMISSIBLEsur un item gele. Le filtre y est branche : il rendREFUSet nomme la cause.--include-deliveredne contourne pas le gel : cette echappatoire porte sur les marqueurs de livraison, la ou le gel est une decision du coordinateur.Ce qui ne change pas
_issue_is_frozen) : aucune ligne touchee ;Cout
Zero requete supplementaire dans le tapis. La lecture du fil est servie par l'instantane de la passe, dont la fenetre couvre exactement celle que la boucle parcourt (
wanted=max_iters), et le corps vient de_POOL_BODIES, quefetch_poolremplit deja. La voie ponderee lit une fois de plus par candidat tire (une poignee).Temoins
scripts/tests/test_pick_idle_grain_freeze_scope.py(15 tests) :GEL (body)) ;GEL (comment)) ;grain,umbrellaetdelivered;--include-deliveredne contourne pas le gel ;frozen_unread) ;--admissiblerefuse un item gele.Validation
pytest scripts/tests/test_pick_idle_grain_freeze_scope.py-> 15 passed ;pytest scripts/tests/test_pick_idle_grain.py scripts/tests/test_pick_idle_grain_belt.py scripts/tests/test_pick_frozen_sticky.py scripts/tests/test_pick_delivered_gate.py scripts/tests/test_pick_claim_filter.py-> 498 passed (aucune regression, y compristest_pick_frozen_sticky.py, qui verifie la grammaire du gel et le cache des corps) ;pytest scripts/tests -k "pick or claim or snapshot or candidate_delivered or origami or closure"-> 1943 passed, 2 skipped, 5 xfailed ;pyflakes scripts/pick_idle_grain.py: aucun warning nouveau (les avertissements listes sont anterieurs a ce changement).Controle de mort (mesure sur l'issue reelle)
has_frozen_marker(19309)->'body'(mesure firsthand, le 2026-11-05) : le gel de l'EPIC est desormais lu, la ou il etait invisible pour la classeumbrella.python scripts/pick_idle_grain.py --admissible 19309->REFUS -- GEL (body) ..., rc=1 (avant ce correctif :ADMISSIBLE, rc=0).--beltreel sur la lane : [Epic] Compléter la constellation causale (format Origami) : Hernan target trial + ML for ATE + causal repr/anticausal learning + causal RL + Heckman + m-transportability + ATE/ATT/CATE systematic + Pearl Ladder introductive (refs greenpau Causal Inference + Scholkopf 2012/2021) #19309 n'est pas dans les picks. Il faut le dire tel quel : aujourd'hui il n'y est plus pour une autre raison -- ses 7[RELEASED]lui ont donne des visites (le tapis ordonne par derniere visite), et le pli Origami 4 n'est pas materialise. Son exclusion par la porte de gel est donc masquee aujourd'hui par une autre cause. La preuve de la porte elle-meme est dans les temoins et dans les deux mesures ci-dessus, pas dans ce tirage.Portee
scripts/pick_idle_grain.py— la sonde, la porte, le volet de sortie ;scripts/tests/test_pick_idle_grain_freeze_scope.py— les temoins.PR hors harnais (
scripts/) : le merge passe parmerge_ready.pyapres l'APPROVE du coordinateur, comme annonce au dispatch.See #19309
🤖 Generated with Claude Code