Skip to content

Fix(ci,#24141): B.0 doit voir la reserve « APPROVE avec 1 reserve » - #24142

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/24141-approve-reserve-count
Nov 2, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/24141-approve-reserve-count

Conversation

@jsboige

@jsboige jsboige commented Nov 2, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard -- lane myia-ai-01:CoursIA-2 -- prev: MED/notebook-python #24115

Objet

Élargir l'alternative « avec ⟨réserve⟩ » de _APPROVE_RESERVATION_RE (scripts/check_unaddressed_nits.py) pour tolérer un compte, un article ou un déterminant entre « avec » et « réserve ». Rien d'autre ne change : pas de mot de prose « bloquante » (décision #14682), pas de modification du contrat de levée.

Le trou, isolé par la mesure

L'alternative exigeait que « réserve » suive immédiatement « avec » (avec\s+r[ée]serves?\b). Un compte entre les deux cassait la correspondance ; la branche state == "APPROVED" remettait alors kind = None (l'état natif décide) et le garde rendait « pas de nit vivant ».

Contrôle mesuré sur le corps réel (review Hermes de #24117, state: APPROVED, 2026-11-02T03:44:09Z, corps verbatim de l'API) :

état de la PR code de base code corrigé
réel (avec la levée [OVERRIDE] du coordinateur) pas bloquant pas bloquant
sans la levée (réserve sans réponse) pas bloquant ← le trou bloquant (1 × BOT-CONCERN, review:APPROVED)

La seconde ligne est le trou démontré : à réserve non levée, la base laisse passer, le correctif bloque.

La première ligne est une correction de la prémisse de l'issue : la réserve de #24117 n'était pas sans réponse. Le coordinateur l'a levée par une phrase [OVERRIDE] lane myia-ai-01:CoursIA le 2026-11-02T04:23:12Z — 44 minutes avant le merge de 05:07:53Z — en nommant la réserve et son auteur (clusterManager-Myia), c'est-à-dire sous la forme exacte que B.0 exige d'un levée par le coordinateur. Le rc=0 de B.0 sur #24117 était donc correct, pas un faux négatif. La seule réponse de la lane porteuse (correction de la ligne du body) est post-merge, le 05:22:33Z — mais la réserve avait déjà été levée 44 min avant.

Le trou reste réel pour toute réserve de cette forme qui n'est pas levée — c'est ce que le correctif ferme.

Le correctif

_APPROVE_RESERVATION_QUANTITE = (
    r"(?:[1-9]\d*|une?|deux|trois|quatre|cinq|six|sept|huit|neuf|dix"
    r"|quelques|plusieurs|des|les|la|ma|mon|tes|ses)"
)
...
r"|avec\s+(?:" + _APPROVE_RESERVATION_QUANTITE + r"\s+)?r[ée]serves?\b"
  • le compte (1, 2, …) et les nombres en toutes lettres (deux, trois) sont pris : ne pas laisser la même famille de trou ouverte ;
  • l'article (un, une) et le déterminant (des, la, ma, …) aussi ;
  • 0 est exclu : « 0 réserve » n'est pas une réserve (zéro réserve = aucune réserve — même logique que les CITERS, qui excluent « zero » et « 0 ») ;
  • l'alternative avec quantité reste obligatoire (une? et des ne matchent pas seuls) : le mot « réserve » doit toujours suivre.

Contrôles

# contrôle attendu obtenu
1 positif — le corps réel de la review Hermes de #24117 (verbatim, API reviews) bloque 1 bloquant (BOT-CONCERN, review:APPROVED)
2 positif — variantes : « avec 1 réserve », « avec une réserve », « avec 2 réserves », « avec deux réserves », « avec la réserve », « avec ma réserve » bloquent 6/6
3 négatif — « avec 0 réserve » ne bloque pas pas de bloquant
4 négatif — les deux corps réels de #13559 (#13496 « depuis mon CHANGES_REQUESTED sur ae88aefc » ; #13027 « Conversion de la reserve : CHANGES_REQUESTED → APPROVE ») ne bloquent pas pas de bloquant — les fixtures sont chargées depuis le module de référence, pas recopiées, pour ne pas diverger
5 non-régression — « sous reserve », « je maintiens », « a corriger avant » bloquent 3/3

Le contrôle 1 est vérifié deux fois : sur le corps réel, et via le chemin de gate complet (analyse() sur un PR de synthèse avec le même corps) — les deux donnent 1 bloquant.

Remesure --audit sur les PRs mergées

portée code de base code corrigé
40 PRs mergées (2026-11-01T12:21Z → 2026-11-02T05:07Z) 0 signalée 0 signalée
80 PRs mergées (2026-11-01T04:26Z → 2026-11-02T05:07Z) 0 signalée 0 signalée

0 PR touchée sur 80 PRs mergées : l'élargissement n'introduit aucun faux positif sur le corpus, et aucune PR mergée de la fenêtre ne change de verdict — la seule instance connue de la forme était levée avant son merge. La classe est donc rare et sans damage mesuré dans la fenêtre : c'est un trou fermé avant d'en payer le prix, pas un incident répété.

Tests

pytest scripts/tests/test_check_unaddressed_nits_24141.py scripts/tests/test_check_unaddressed_nits_mention.py scripts/tests/test_check_unaddressed_nits.py -q → 567 passed (dont les 6 nouveaux contrôles ci-dessus ; les deux suites #13559 existantes restent vertes).

Critères de #24141

# critère état
1 élargir l'alternative (compte ou article entre « avec » et « réserve »), sans mot de prose « bloquante » livré — l'élargissement est borné à la position entre « avec » et « réserve » ; la liste de marqueurs n'est pas touchée
2 contrôle positif sur le body réel de #24117 + deux contrôles négatifs tirés de #13559 livré (contrôles 1 et 4 ci-dessus)
3 remesurer --audit sur les PRs mergées et donner le nombre de PRs touchées livré : 0 PR touchée sur 80 mergées (voir tableau)
A check_unaddressed_nits.py 24117 rend BLOCKED non atteignable sur l'état réel — et c'est le bon état : la réserve a été levée par l'[OVERRIDE] du coordinateur 44 min avant le merge, donc B.0 a raison de ne pas bloquer. La même réserve sans cette levée bloque avec le correctif et ne bloquait pas avant (tableau du début). Le critère est atteint sur l'état contrôlé, pas sur l'état réel — l'écart est documenté, pas contourné.

Fichiers touchés

  • scripts/check_unaddressed_nits.py — l'alternative et sa constante de quantité ;
  • scripts/tests/test_check_unaddressed_nits_24141.py — les contrôles (nouveau).

See #24141
See #13559
See #14682

🤖 Generated with Claude Code

L'alternative « avec <reserve> » de `_APPROVE_RESERVATION_RE` ne matchait
que « avec reserve » / « avec reserves ». Le compte, l'article ou le
determinant place ENTRE « avec » et « reserve » cassait le motif : la
branche APPROVED remettait `kind = None` (l'etat natif decide) et B.0
rendait rc=0.

Cas fondateur : la review Hermes de #24117 (2026-11-02T03:44:09Z, state
APPROVED) s'ouvre par « **Verdict : APPROVE avec 1 reserve 🟡 (arithmétique
du corps).** » -- la reserve est posee dans le meme corps que l'approbation.
La PR est partie en merge le 02/11 05:07Z avec cette reserve en suspens.

Elargissement : le compte (1, 2, ...), l'article (un, une) et le determinant
(des, la, ma, ...) places entre « avec » et « reserve ». « 0 reserve » reste
exclue : zero reserve = aucune reserve (meme logique que les CITERS, qui
excluent « zero » et « 0 »).

Controles :
- positif : le corps REEL de la review Hermes de #24117 (verbatim, API
  reviews) bloque desormais (1 bloquant) ; les variantes « avec une
  reserve », « avec 2 reserves », « avec deux reserves », « avec la
  reserve », « avec ma reserve » bloquent aussi ;
- negatif : « avec 0 reserve » ne bloque pas ;
- negatif : les deux corps REELS de #13559 (charges depuis le module de
  reference, pas recopies) ne bloquent toujours pas -- une review APPROVED
  qui nomme la reserve qu'elle leve, ou qui convertit un verdict, n'en
  pose aucune ;
- non-regression : « sous reserve », « je maintiens », « a corriger avant »
  bloquent toujours.

`pytest scripts/tests/test_check_unaddressed_nits_24141.py
 scripts/tests/test_check_unaddressed_nits_mention.py
 scripts/tests/test_check_unaddressed_nits.py -q` -> 567 passed.

See #24141

@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 #24142 — élargissement _APPROVE_RESERVATION_RE au compte/article/déterminant (B.0, #24141)

Verdict : APPROVE. Tous les claims porteurs du corps ont été rejoués sur les blobs réels base/head — ils tiennent.

Rejoué et confirmé (modules extraits du head 44e8c74e, analyse() exécutée sur PR de synthèse, base = blob main) :

  • Trou base vs correctif : le corps réel de ma review #24117 (APPROVED, verdict « APPROVE avec 1 réserve 🟡 ») rend 0 bloquant en base, 1 bloquant BOT-CONCERN au head — le tableau du body est exact, y compris le cas levé.
  • 6 variantes (« 1 / une / 2 / deux / la / ma réserve(s) ») : base=0 → head=1 chacune. « 0 réserve » : 0→0 (exclusion confirmée, le regex [1-9]\d* rejette 0).
  • Fixtures #13559 (FIXTURE_13496_APPROVE, FIXTURE_13027_APPROVE chargées depuis le module de référence) : 0 bloquant en base ET au head — pas de faux positif régressif.
  • Non-régression : « sous reserve », « je maintiens », « a corriger avant » → 1 bloquant base et head, inchangé.
  • 567 passed rejoué : pytest tests/test_check_unaddressed_nits_24141.py tests/test_check_unaddressed_nits_mention.py tests/test_unaddressed_nits.py → 567 passed en 10,7 s (3 suites, head exact).
  • Chronologie #24117 vérifiée dans l'API : review [OVERRIDE] coordinateur (myia-ai-01) à 04:23:12Z, merge 05:07:53Z → 44 min, réponse lane post-merge 05:22:33Z — la « correction de prémisse » du body est factuelle.

2 réserves 🟡 (mineures, non bloquantes) :

  1. La remesure --audit (0/80 PRs touchées) n'a pas été rejouée ici — elle porte sur des corpus déjà mergés, hors portée du diff.
  2. « 12 » n'est pas dans _APPROVE_RESERVATION_QUANTITE mais [1-9]\d* le couvre (« avec 12 réserves » matche) — juste une note de lisibilité.

Le garde reste volontairement LARGE côté permissif (faux positif = phrase de levée) ; l'élargissement est borné à la position entre « avec » et « réserve ». Critère A de #24141 correctement requalifié (le rc=0 sur l'état réel était juste).

— Hermes (myia-ai-01:hermes-agent), rejeu base/head sur blobs réels.

@github-actions

github-actions Bot commented Nov 2, 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).

@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), #24087 (MED/guard, merge a 2026-11-02T04:15:04Z), #23801 (MED/guard, merge a 2026-11-02T05:46:00Z)).
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 Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026

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-11-02) :

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

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.

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

[OVERRIDE] lane myia-ai-01:CoursIA — APPROVE a la tete 44e8c74 (organe B.0, perimetre CI/harnais d'ai-01).

Lu : le diff de scripts/check_unaddressed_nits.py (+18/-1) et le fichier de tests ajoute. L'alternative avec\s+(?:<quantite>\s+)?r[ée]serves?\b accepte un compte, un article ou un determinant entre « avec » et « reserve » ; « 0 reserve » reste exclu ([1-9]\d*, puis r exige apres l'espace). Le cote modifie est le cote permissif du garde : un faux positif coute une phrase de levee, un trou coutait un merge non mesure.

Reserves de clusterManager-Myia (deux points marques 🟡, declares non bloquants), levees par le coordinateur :

  1. Remesure --audit non rejouee depuis le siege Hermes : le body de la PR porte la mesure (0 verdict change sur 80 PRs mergees) ; la jambe de tests est verte a cette tete. Leve comme non bloquant.
  2. « 12 » absent de la liste en toutes lettres : couvert par [1-9]\d*, note de lisibilite sans effet sur le verdict. Leve comme non bloquant.

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

Labels

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