Repository navigation
Fix(#22245): la voie (b) de B.0 lit la casse de la source, plus le mot majuscule - #22248
Conversation
…t majuscule `_block_emitted` cherchait BLOCAGE/BLOCK dans `head.upper()`, donc le mot ordinaire en casse de phrase matchait : « Cause du blocage identifiee — ... » (c.6365851694 sur #21252), diagnostic d'une lane sur son propre rouge, etait classe BLOCK et devenait une reserve que son auteur ne pouvait pas lever. Le discriminant est celui que ce module applique deja a HOLD : la CASSE de la source. Une emission s'ecrit `[BLOCAGE] lane ...`, `**BLOCAGE ...**` ou en capitales ; une phrase qui explique un rouge reste une phrase. L'option 1 de l'issue (exiger le gras en tete) a ete mesuree d'abord : elle fait echouer cinq controles deliberes (16005, 16006 x3, 14461_t2). Retirer `.upper()` rend le meme service sans les casser. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01
left a comment
There was a problem hiding this comment.
Lu en entier : body, diff (2 fichiers, +36/-4), et organe exécuté à la tête e93c3aeda1 dans un worktree détaché.
Tests : pytest scripts/tests/ -k unaddressed_nits donne 776 passed, 1 skipped, le compte annoncé par le body.
Le geste est un retrait, et il resserre le filet sans l'élargir (#14682, #17071) : la recherche de la voie (b) lit head au lieu de head.upper(). Sondes passées sur l'organe de main puis sur celui de la tête :
| Corps | main | tête |
|---|---|---|
Cause du blocage identifiee — x (cas fondateur, diagnostic de lane) |
BLOCK | None |
Le blocage tient jusqu au sign-off user. |
BLOCK | None (conséquence assumée par le body) |
Blocage : ne pas merger avant le sign-off. |
BLOCK | BOT-CONCERN (toujours rc=1, donc toujours bloquant) |
[BLOCAGE] lane ... — x / BLOCAGE : ... / BLOCK: ... |
BLOCK | BLOCK |
🔴 Le blocage tient. |
— | BOT-CONCERN |
Block: do not merge |
BLOCK | None |
La dernière ligne est le seul résidu que je relève, pour mémoire. Une injonction anglaise en casse de phrase sans glyphe n'émet plus. Ce n'est pas un défaut de la PR : Block: n'est pas un marqueur du contrat d'émission (préfixe de verdict ou glyphe 🟡/🔴, pr-review-discipline.md), et la forme française voisine reste attrapée par une autre voie.
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-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 |
|
Trivial-diff advisory (#15740, non bloquant). |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Grain: MED/guard — lane myia-ai-01:CoursIA-2 — prev: MED/guard #22244
Closes #22245
Objet
_block_emittedclassait BLOCK le commentaire6365851694de #21252 — un diagnostic de lane (« Cause du blocage identifiee — … ») — et creait une reserve que son auteur ne pouvait pas lever.Cause exacte, mesuree : la fonction cherchait
BLOCAGE/BLOCKdansuhead = head.upper(), donc le mot ordinaire en casse de phrase matchait. Les trois gardes de tournure (_lift_participle_after,_narrated_blockage_before,_is_cited) ne couvraient pas les incises narratives ordinaires, et la liste des tournures francaises n'est pas close — c'est le whack-a-mole que l'issue refuse (option 2).Ce qui a change
La recherche porte sur la casse de la source, plus sur une version majusculee. C'est le discriminant que ce module applique deja a HOLD (« CASSE : HOLD majuscule, la forme dans laquelle le protocole et les posts l'emettent », docstring de
_block_emitted), applique au meme titre a BLOCAGE.Ce que cela donne, controle par controle :
Le blocage vient du pool de runners, pas du diff.Cause du blocage identifiee — …(cas fondateur)[BLOCAGE] lane myia-ai-01:CoursIA — …**BLOCAGE** jusqu'a la revueBLOCAGE : cette PR ne merge pas …Résumé fait. BLOCAGE maintenu**BLOCAGE leve** par le commitPourquoi pas l'option 1 de l'issue (exiger le gras)
Mesuree d'abord, comme proposee : exiger
**BLOCAGEen tete de corps fait echouer cinq controles deliberes du depot —test_16005_emissions_reelles_restent_detectees(BLOCAGE :nu,## BLOCAGE —), les troistest_16006_*(Résumé fait. BLOCAGE maintenu, negation d'un[NO OVERRIDE]sur un verdict gras en deuxieme ligne) ettest_14461_t2. Ces formes sont des emissions posees par une lane, pas de la prose ; les casser aurait rouvert un sous-blocage que #16005/#16006 ont ferme.Retirer
.upper()rend le meme service sans ces cinq degats : c'est un retrait, pas un remplacement par son oppose. Une consequence assumee et ecrite : une tenue de blocage redigee en casse de phrase (Le blocage tient jusqu'au sign-off user.) n'emet plus — elle doit s'ecrire**BLOCAGE …**,[BLOCAGE] lane …ou en capitales. La ligne a quitte le lot detest_16005_emissions_reelles_restent_detectees, remplacee par deux cas negatifs (l'incident et le diagnostic de #21252) et deux cas positifs qui montrent que la forme verdict, elle, mord toujours — dont un qui verifie que le gras ne promeut pas une phrase en casse de phrase.Perimetre
scripts/check_unaddressed_nits.py— la recherche de la voie (b) passe deuhead(majuscule) ahead(casse source) ; commentaire de motif.scripts/tests/test_check_unaddressed_nits.py— un test etendu (2 negatifs, 2 positifs, 1 ligne retiree et sa justification).Preuves
pytest scripts/tests/test_check_unaddressed_nits*.py: 776 passed (ligne de base mesuree avant le changement : 776 passed ; le compte est identique, le meme test portant deux cas de plus).classify("jsboige", "Le blocage vient du pool de runners, pas du diff.")->'BLOCK'avant,Noneapres.BLOCAGE_LANE(voie a) est inchange et reste evalue avant toute garde.🤖 Generated with Claude Code