Skip to content

Fix(#22245): la voie (b) de B.0 lit la casse de la source, plus le mot majuscule - #22248

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/22245-blockage-prose
Oct 24, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/22245-blockage-prose

Conversation

@jsboige

@jsboige jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner

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

Closes #22245

Objet

_block_emitted classait BLOCK le commentaire 6365851694 de #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 / BLOCK dans uhead = 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 :

Corps Avant Apres
Le blocage vient du pool de runners, pas du diff. BLOCK aucun
Cause du blocage identifiee — … (cas fondateur) BLOCK aucun
[BLOCAGE] lane myia-ai-01:CoursIA — … BLOCK BLOCK
**BLOCAGE** jusqu'a la revue BLOCK BLOCK
BLOCAGE : cette PR ne merge pas … BLOCK BLOCK
Résumé fait. BLOCAGE maintenu BLOCK BLOCK
**BLOCAGE leve** par le commit aucun aucun

Pourquoi pas l'option 1 de l'issue (exiger le gras)

Mesuree d'abord, comme proposee : exiger **BLOCAGE en tete de corps fait echouer cinq controles deliberes du depot — test_16005_emissions_reelles_restent_detectees (BLOCAGE : nu, ## BLOCAGE —), les trois test_16006_* (Résumé fait. BLOCAGE maintenu, negation d'un [NO OVERRIDE] sur un verdict gras en deuxieme ligne) et test_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 de test_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 de uhead (majuscule) a head (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).
  • Reproduction de l'issue, executee avant/apres : classify("jsboige", "Le blocage vient du pool de runners, pas du diff.") -> 'BLOCK' avant, None apres.
  • Aucune autre garde de tournure n'a ete ajoutee ni retiree ; BLOCAGE_LANE (voie a) est inchange et reste evalue avant toute garde.

🤖 Generated with Claude Code

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

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.

@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 Oct 23, 2026
@github-actions

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) : #22083 (MED/guard, merge a 2026-10-23T00:09:26Z), #22094 (MED/guard, merge a 2026-10-23T03:49:54Z), #22096 (MED/guard, merge a 2026-10-23T04:05:35Z), #21590 (MED/guard, merge a 2026-10-23T08:44:43Z), #21775 (MED/guard, merge a 2026-10-23T08:45:10Z), #21967 (MED/guard, merge a 2026-10-23T09:02:49Z), #21961 (MED/docs, merge a 2026-10-23T13:01:37Z), #22099 (MED/guard, merge a 2026-10-23T15:51:45Z), #21783 (MED/guard, merge a 2026-10-23T19:48:05Z)).
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 variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Oct 23, 2026
@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-23) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=1 genre=9 cap=4)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=1 genre=9 cap=4)

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 added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Oct 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 40 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) 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.

check_unaddressed_nits: le mot ordinaire « blocage » a 60 car. d'un commentaire d'auteur emet un BLOCK (recidive mesuree de #16005)

2 participants